Version 1.6.0-dev.4.0

svn merge -r 38144:38367 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@38380 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/create_sdk.gyp b/create_sdk.gyp
index bc30a0a..e1896ba 100644
--- a/create_sdk.gyp
+++ b/create_sdk.gyp
@@ -11,6 +11,7 @@
         'runtime/dart-runtime.gyp:dart',
         'utils/compiler/compiler.gyp:dart2js',
         'utils/pub/pub.gyp:pub',
+        'utils/pub/pub.gyp:core_stubs',
         'utils/dartfmt/dartfmt.gyp:dartfmt',
         'utils/dartanalyzer/dartanalyzer.gyp:dartanalyzer',
       ],
@@ -29,6 +30,7 @@
             '<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/dartanalyzer.dart.snapshot',
             '<(SHARED_INTERMEDIATE_DIR)/dartfmt.dart.snapshot',
+            '<(SHARED_INTERMEDIATE_DIR)/core_stubs/dart_io.dart',
             'tools/VERSION'
           ],
           'outputs': [
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index d301b07..a21f374 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -3270,7 +3270,26 @@
 \item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$x_{n+1}: o_{n+1}, \ldots, x_{n+k} : o_{n+k}$\}}.
 \end{itemize}
 
-Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$, and the result of this invocation is the result of evaluating $i$.
+Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$, and the result of this invocation is the result of evaluating $i$. However, if the implementation found cannot be invoked with a single positional argument, the implementation  of \code{noSuchMethod()} in class \code{Object} is invoked on $o$ with argument $im'$, where $im'$ is an instance of \code{Invocation} such that :
+\begin{itemize}
+\item  \code{im.isMethod} evaluates to \code{\TRUE{}}.
+\item  \code{im.memberName} evaluates to \code{noSuchMethod'}.
+\item \code{im.positionalArguments} evaluates to an immutable list whose sole element is  $im$.
+\item \code{im.namedArguments} evaluates to an empty immutable map.
+\end{itemize}
+
+and the result of the latter invocation is the result of evaluating $i$.
+
+\rationale {
+It is possible to bring about such a situation by overriding \code{noSuchMethod()} with the wrong number of arguments:}
+
+\begin{code}
+\CLASS{} Perverse \{
+    noSuchMethod(x,y) =$>$ x + y;
+\}
+
+\NEW{} Perverse.unknownMethod(); 
+\end{code}
 
 \commentary{Notice that the wording carefully avoids re-evaluating the receiver $o$ and the arguments $a_i$. }
 
@@ -3367,7 +3386,16 @@
 \item \code{im.positionalArguments} evaluates to an immutable list with the same  values as  \code{[$o_1, \ldots, o_n$]}.
 \item \code{im.namedArguments} evaluates to an immutable map with the same keys and values as \code{\{$x_{n+1}: o_{n+1}, \ldots, x_{n+k} : o_{n+k}$\}}.
 \end{itemize}
-Then the method \code{noSuchMethod()} is looked up in $S$ and invoked on \THIS{} with argument $im$, and the result of this invocation is the result of evaluating $i$.
+Then the method \code{noSuchMethod()} is looked up in $S$ and invoked on \THIS{} with argument $im$, and the result of this invocation is the result of evaluating $i$. However, if the implementation found cannot be invoked with a single positional argument, the implementation  of \code{noSuchMethod()} in class \code{Object} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \code{Invocation} such that :
+\begin{itemize}
+\item  \code{im.isMethod} evaluates to \code{\TRUE{}}.
+\item  \code{im.memberName} evaluates to \code{noSuchMethod}.
+\item \code{im.positionalArguments} evaluates to an immutable list whose sole element is  $im$.
+\item \code{im.namedArguments} evaluates to an empty immutable map.
+\end{itemize}
+
+and the result of this latter invocation is the result of evaluating $i$.
+
 
 It is a compile-time error if a super method invocation occurs in a top-level function or variable initializer, in an instance variable initializer or initializer list, in class \code{Object}, in a factory constructor or in a static method or variable initializer.
 
@@ -3417,7 +3445,15 @@
 \item \code{im.positionalArguments} evaluates to the value of \code{\CONST{} []}.
 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
 \end{itemize}
-Then the method \code{noSuchMethod()} is looked up in $o$ and invoked  with argument $im$, and the result of this invocation is the result of evaluating $i$.
+Then the method \code{noSuchMethod()} is looked up in $o$ and invoked  with argument $im$, and the result of this invocation is the result of evaluating $i$. However, if the implementation found cannot be invoked with a single positional argument, the implementation  of \code{noSuchMethod()} in class \code{Object} is invoked on $o$ with argument $im'$, where $im'$ is an instance of \code{Invocation} such that :
+\begin{itemize}
+\item  \code{im.isMethod} evaluates to \code{\TRUE{}}.
+\item  \code{im.memberName} evaluates to \code{noSuchMethod}.
+\item \code{im.positionalArguments} evaluates to an immutable list whose sole element is  $im$.
+\item \code{im.namedArguments} evaluates to an empty immutable map.
+\end{itemize}
+
+and the result of this latter invocation is the result of evaluating $i$.
 
 Let $T$ be the  static type of $e$. It is a static type warning if $T$ does not have a getter named $m$ unless $T$ or a superinterface of $T$ is annotated with an annotation denoting a constant identical to the constant \code{@proxy} defined in \code{dart:core}. The static type of $i$ is the declared return type of $T.m$, if $T.m$ exists; otherwise the static type of $i$  is  \DYNAMIC{}. 
 
@@ -3448,9 +3484,15 @@
 \item \code{im.positionalArguments} evaluates to the value of \code{\CONST{} []}.
 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
 \end{itemize}
-Then the method \code{noSuchMethod()} is looked up in $S$ and invoked  with argument $im$, and the result of this invocation is the result of evaluating $i$.
+Then the method \code{noSuchMethod()} is looked up in $S$ and invoked  with argument $im$, and the result of this invocation is the result of evaluating $i$. However, if the implementation found cannot be invoked with a single positional argument, the implementation  of \code{noSuchMethod()} in class \code{Object} is invoked on \THIS{} with argument $im'$, where $im'$ is an instance of \code{Invocation} such that :
+\begin{itemize}
+\item  \code{im.isMethod} evaluates to \code{\TRUE{}}.
+\item  \code{im.memberName} evaluates to \code{noSuchMethod}.
+\item \code{im.positionalArguments} evaluates to an immutable list whose sole element is  $im$.
+\item \code{im.namedArguments} evaluates to an empty immutable map.
+\end{itemize}
 
-
+and the result of this latter invocation is the result of evaluating $i$.
 
 It is a static type warning if $S$ does not have a getter named $m$.  The static type of $i$ is the declared return type of $S.m$, if $S.m$ exists; otherwise the static type of $i$  is  \DYNAMIC{}. 
 
@@ -3534,7 +3576,16 @@
 \item \code{im.namedArguments} evaluates to the value of \code{\CONST{} \{\}}.
 \end{itemize}
 
-Then the method \code{noSuchMethod()} is looked up in $o_1$ and invoked  with argument $im$. The value of the assignment expression is $o_2$ irrespective of whether setter lookup has failed or succeeded.
+Then the method \code{noSuchMethod()} is looked up in $o_1$ and invoked  with argument $im$. 
+However, if the implementation found cannot be invoked with a single positional argument, the implementation  of \code{noSuchMethod()} in class \code{Object} is invoked on $o_1$ with argument $im'$, where $im'$ is an instance of \code{Invocation} such that :
+\begin{itemize}
+\item  \code{im.isMethod} evaluates to \code{\TRUE{}}.
+\item  \code{im.memberName} evaluates to \code{noSuchMethod}.
+\item \code{im.positionalArguments} evaluates to an immutable list whose sole element is  $im$.
+\item \code{im.namedArguments} evaluates to an empty immutable map.
+\end{itemize}
+
+The value of the assignment expression is $o_2$ irrespective of whether setter lookup has failed or succeeded.
 
 Evaluation of an assignment of the form $p.v \code{=} e$, where $p$ is a deferred prefix, proceeds as follows:
 
diff --git a/pkg/.gitignore b/pkg/.gitignore
index 256ea1f..2706929 100644
--- a/pkg/.gitignore
+++ b/pkg/.gitignore
@@ -7,3 +7,4 @@
 /*.vcxproj.user
 /*.vcxproj.filters
 /*.xcodeproj
+.idea/
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index ad93085..975a911 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -28,6 +28,8 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
 
 
 /**
@@ -109,6 +111,11 @@
   final Index index;
 
   /**
+   * The [SearchEngine] for this server.
+   */
+  SearchEngine searchEngine;
+
+  /**
    * [ContextDirectoryManager] which handles the mapping from analysis roots
    * to context directories.
    */
@@ -183,6 +190,7 @@
   AnalysisServer(this.channel, ResourceProvider resourceProvider,
       PackageMapProvider packageMapProvider, this.index,
       {this.rethrowExceptions: true}) {
+    searchEngine = createSearchEngine(index);
     operationQueue = new ServerOperationQueue(this);
     contextDirectoryManager = new AnalysisServerContextDirectoryManager(
         this, resourceProvider, packageMapProvider);
@@ -462,12 +470,18 @@
       Set<String> todoFiles = oldFiles != null ? newFiles.difference(oldFiles) : newFiles;
       for (String file in todoFiles) {
         Source source = getSource(file);
+        // prepare context
         AnalysisContext context = getAnalysisContext(file);
+        if (context == null) {
+          continue;
+        }
         // errors
         if (service == AnalysisService.ERRORS) {
           LineInfo lineInfo = context.getLineInfo(source);
-          List<AnalysisError> errors = context.getErrors(source).errors;
-          sendAnalysisNotificationErrors(this, file, lineInfo, errors);
+          if (lineInfo != null) {
+            List<AnalysisError> errors = context.getErrors(source).errors;
+            sendAnalysisNotificationErrors(this, file, lineInfo, errors);
+          }
         }
         // Dart unit notifications.
         if (AnalysisEngine.isDartFileName(file)) {
@@ -548,6 +562,50 @@
   }
 
   /**
+   * Returns resolved [CompilationUnit]s of the Dart file with the given [path].
+   *
+   * May be empty, but not `null`.
+   */
+  List<CompilationUnit> getResolvedCompilationUnits(String path) {
+    List<CompilationUnit> units = <CompilationUnit>[];
+    // prepare AnalysisContext
+    AnalysisContext context = getAnalysisContext(path);
+    if (context == null) {
+      return units;
+    }
+    // add a unit for each unit/library combination
+    Source unitSource = getSource(path);
+    List<Source> librarySources = context.getLibrariesContaining(unitSource);
+    for (Source librarySource in librarySources) {
+      CompilationUnit unit = context.getResolvedCompilationUnit2(unitSource, librarySource);
+      if (unit != null) {
+        units.add(unit);
+      }
+    }
+    // done
+    return units;
+  }
+
+  /**
+   * Returns [Element]s of the Dart file with the given [path], at the given
+   * offset.
+   *
+   * May be empty, but not `null`.
+   */
+  List<Element> getElementsAtOffset(String path, int offset) {
+    List<CompilationUnit> units = getResolvedCompilationUnits(path);
+    List<Element> elements = <Element>[];
+    for (CompilationUnit unit in units) {
+      AstNode node = new NodeLocator.con1(offset).searchWithin(unit);
+      Element element = ElementLocator.locateWithOffset(node, offset);
+      if (element != null) {
+        elements.add(element);
+      }
+    }
+    return elements;
+  }
+
+  /**
    * Return the [CompilationUnit] of the Dart file with the given [path].
    * Return `null` if the file is not a part of any context.
    */
diff --git a/pkg/analysis_server/lib/src/collections.dart b/pkg/analysis_server/lib/src/collections.dart
new file mode 100644
index 0000000..1c5fefc
--- /dev/null
+++ b/pkg/analysis_server/lib/src/collections.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, 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 collections;
+
+/**
+ * Returns the concatentation of the input iterables.
+ *
+ * The returned iterable is a lazily-evaluated view on the input iterables.
+ */
+Iterable concat(Iterable<Iterable> iterables) => iterables.expand((x) => x);
+
+
+/**
+ * Returns the concatentation of the input iterables as a [List].
+ */
+List concatToList(Iterable<Iterable> iterables) => concat(iterables).toList();
+
+
+/**
+ * Instances of the class [HasToJson] implement [toJson] method that returns
+ * a JSON presentation.
+ */
+abstract class HasToJson {
+  /**
+   * Returns a JSON presentation of the object.
+   */
+  Map<String, Object> toJson();
+}
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 2c11d1d..9a16c80 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -4,6 +4,7 @@
 
 library computer.highlights;
 
+import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -23,10 +24,10 @@
   /**
    * Returns the computed highlight regions, not `null`.
    */
-  List<Map<String, Object>> compute() {
+  List<HighlightRegion> compute() {
     _unit.accept(new _DartUnitHighlightsComputerVisitor(this));
     _addCommentRanges();
-    return _regions.map((region) => region.toJson()).toList();
+    return _regions;
   }
 
   void _addCommentRanges() {
@@ -324,7 +325,7 @@
 }
 
 
-class HighlightRegion {
+class HighlightRegion implements HasToJson {
   final int offset;
   final int length;
   final HighlightType type;
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 1150480..79215d3 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -6,6 +6,7 @@
 
 import 'dart:collection';
 
+import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -68,7 +69,7 @@
   /**
    * Returns the computed hover, maybe `null`.
    */
-  Map<String, Object> compute() {
+  Hover compute() {
     AstNode node = new NodeLocator.con1(_offset).searchWithin(_unit);
     if (node is Expression) {
       Hover hover = new Hover(node.offset, node.length);
@@ -102,7 +103,7 @@
       hover.staticType = _safeToString(node.staticType);
       hover.propagatedType = _safeToString(node.propagatedType);
       // done
-      return hover.toJson();
+      return hover;
     }
     // not an expression
     return null;
@@ -112,7 +113,7 @@
 }
 
 
-class Hover {
+class Hover implements HasToJson {
   final int offset;
   final int length;
   String containingLibraryName;
diff --git a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
index 4e36665..86427f8 100644
--- a/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_occurrences.dart
@@ -6,10 +6,11 @@
 
 import 'dart:collection';
 
-import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/collections.dart';
+import 'package:analysis_server/src/computer/element.dart' as server;
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/element.dart';
 
 
 /**
@@ -18,26 +19,27 @@
 class DartUnitOccurrencesComputer {
   final CompilationUnit _unit;
 
-  final Map<engine.Element, List<int>> _elementsOffsets =
-      new HashMap<engine.Element, List<int>>();
+  final Map<Element, List<int>> _elementsOffsets =
+      new HashMap<Element, List<int>>();
 
   DartUnitOccurrencesComputer(this._unit);
 
   /**
    * Returns the computed occurrences, not `null`.
    */
-  List<Map<String, Object>> compute() {
+  List<Occurrences> compute() {
     _unit.accept(new _DartUnitOccurrencesComputerVisitor(this));
     List<Occurrences> occurrences = <Occurrences>[];
     _elementsOffsets.forEach((engineElement, offsets) {
-      Element serverElement = new Element.fromEngine(engineElement);
-      int length = engineElement.displayName.length;
+      var serverElement = new server.Element.fromEngine(engineElement);
+      var length = engineElement.displayName.length;
       occurrences.add(new Occurrences(serverElement, offsets, length));
     });
-    return occurrences.map((occurrences) => occurrences.toJson()).toList();
+    return occurrences;
   }
 
-  void _addOccurrence(engine.Element element, int offset) {
+  void _addOccurrence(Element element, int offset) {
+    element = _canonicalizeElement(element);
     List<int> offsets = _elementsOffsets[element];
     if (offsets == null) {
       offsets = <int>[];
@@ -45,18 +47,31 @@
     }
     offsets.add(offset);
   }
+
+  Element _canonicalizeElement(Element element) {
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element is Member) {
+      element = (element as Member).baseElement;
+    }
+    return element;
+  }
 }
 
 
-class Occurrences {
-  final Element element;
+class Occurrences implements HasToJson {
+  final server.Element element;
   final List<int> offsets;
   final int length;
 
   Occurrences(this.element, this.offsets, this.length);
 
   factory Occurrences.fromJson(Map<String, Object> map) {
-    Element element = new Element.fromJson(map[ELEMENT]);
+    server.Element element = new server.Element.fromJson(map[ELEMENT]);
     List<int> offsets = map[OFFSETS];
     int length = map[LENGTH];
     return new Occurrences(element, offsets, length);
@@ -82,7 +97,7 @@
 
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
-    engine.Element element = node.bestElement;
+    Element element = node.bestElement;
     if (element != null) {
       computer._addOccurrence(element, node.offset);
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index a24ff45..6414c32 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -4,6 +4,7 @@
 
 library computer.outline;
 
+import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -28,7 +29,7 @@
   /**
    * Returns the computed outline, not `null`.
    */
-  Map<String, Object> compute() {
+  Outline compute() {
     Outline unitOutline = _newUnitOutline();
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
@@ -83,7 +84,7 @@
         _newFunctionTypeAliasOutline(unitOutline, alias);
       }
     }
-    return unitOutline.toJson();
+    return unitOutline;
   }
 
   void _addLocalFunctionOutlines(Outline parent, FunctionBody body) {
@@ -303,7 +304,7 @@
 /**
  * An element outline.
  */
-class Outline {
+class Outline implements HasToJson {
   static const List<Outline> EMPTY_ARRAY = const <Outline>[];
 
   /**
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 832fa7e..a0cf035 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -4,6 +4,7 @@
 
 library computer.overrides;
 
+import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -24,7 +25,7 @@
   /**
    * Returns the computed occurrences, not `null`.
    */
-  List<Map<String, Object>> compute() {
+  List<Override> compute() {
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
         _currentClass = unitMember.element;
@@ -104,7 +105,7 @@
 }
 
 
-class Override {
+class Override implements HasToJson {
   final int offset;
   final int length;
   final Element superclassElement;
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
index 56ede07..5ceac10 100644
--- a/pkg/analysis_server/lib/src/computer/element.dart
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -67,21 +67,35 @@
     String name = element.displayName;
     String elementParameters = _getParametersString(element);
     String elementReturnType = _getReturnTypeString(element);
-    return new Element(ElementKind.valueOfEngine(element.kind), name,
-        new Location.fromElement(element), element.isPrivate, element.isDeprecated,
-        parameters: elementParameters, returnType: elementReturnType, isAbstract:
-        _isAbstract(element), isConst: _isConst(element), isFinal: _isFinal(element),
+    return new Element(
+        ElementKind.valueOfEngine(element.kind),
+        name,
+        new Location.fromElement(element),
+        element.isPrivate,
+        element.isDeprecated,
+        parameters: elementParameters,
+        returnType: elementReturnType,
+        isAbstract: _isAbstract(element),
+        isConst: _isConst(element),
+        isFinal: _isFinal(element),
         isStatic: _isStatic(element));
   }
 
   factory Element.fromJson(Map<String, Object> map) {
     ElementKind kind = ElementKind.valueOf(map[KIND]);
     int flags = map[FLAGS];
-    return new Element(kind, map[NAME], new Location.fromJson(map[LOCATION]),
-        _hasFlag(flags, FLAG_PRIVATE), _hasFlag(flags, FLAG_DEPRECATED), parameters:
-        map[PARAMETERS], returnType: map[RETURN_TYPE], isAbstract: _hasFlag(flags,
-        FLAG_ABSTRACT), isConst: _hasFlag(flags, FLAG_CONST), isFinal: _hasFlag(flags,
-        FLAG_FINAL), isStatic: _hasFlag(flags, FLAG_STATIC));
+    return new Element(
+        kind,
+        map[NAME],
+        new Location.fromJson(map[LOCATION]),
+        _hasFlag(flags, FLAG_PRIVATE),
+        _hasFlag(flags, FLAG_DEPRECATED),
+        parameters: map[PARAMETERS],
+        returnType: map[RETURN_TYPE],
+        isAbstract: _hasFlag(flags, FLAG_ABSTRACT),
+        isConst: _hasFlag(flags, FLAG_CONST),
+        isFinal: _hasFlag(flags, FLAG_FINAL),
+        isStatic: _hasFlag(flags, FLAG_STATIC));
   }
 
   int get flags {
@@ -114,6 +128,10 @@
   @override
   String toString() => toJson().toString();
 
+  static Map<String, Object> asJson(Element element) {
+    return element.toJson();
+  }
+
   static String _getParametersString(engine.Element element) {
     // TODO(scheglov) expose the corresponding feature from ExecutableElement
     if (element is engine.ExecutableElement) {
@@ -213,8 +231,10 @@
   static const LIBRARY = const ElementKind('LIBRARY');
   static const LOCAL_VARIABLE = const ElementKind('LOCAL_VARIABLE');
   static const METHOD = const ElementKind('METHOD');
+  static const PARAMETER = const ElementKind('PARAMETER');
   static const SETTER = const ElementKind('SETTER');
   static const TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE');
+  static const TYPE_PARAMETER = const ElementKind('TYPE_PARAMETER');
   static const UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE');
   static const UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP');
   static const UNKNOWN = const ElementKind('UNKNOWN');
@@ -238,8 +258,10 @@
     if (LIBRARY.name == name) return LIBRARY;
     if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE;
     if (METHOD.name == name) return METHOD;
+    if (PARAMETER.name == name) return PARAMETER;
     if (SETTER.name == name) return SETTER;
     if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
+    if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER;
     if (UNIT_TEST_CASE.name == name) return UNIT_TEST_CASE;
     if (UNIT_TEST_GROUP.name == name) return UNIT_TEST_GROUP;
     if (UNKNOWN.name == name) return UNKNOWN;
@@ -277,12 +299,18 @@
     if (kind == engine.ElementKind.METHOD) {
       return METHOD;
     }
+    if (kind == engine.ElementKind.PARAMETER) {
+      return PARAMETER;
+    }
     if (kind == engine.ElementKind.SETTER) {
       return SETTER;
     }
     if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) {
       return TOP_LEVEL_VARIABLE;
     }
+    if (kind == engine.ElementKind.TYPE_PARAMETER) {
+      return TYPE_PARAMETER;
+    }
     return UNKNOWN;
   }
 }
@@ -318,12 +346,36 @@
       startColumn = 1;
     }
     // done
-    return new Location(source.fullName, offset, length, startLine,
+    return new Location(
+        source.fullName,
+        offset,
+        length,
+        startLine,
+        startColumn);
+  }
+
+  factory Location.fromOffset(engine.Element element, int offset, int length) {
+    Source source = element.source;
+    LineInfo lineInfo = element.context.getLineInfo(source);
+    // prepare location
+    LineInfo_Location lineLocation = lineInfo.getLocation(offset);
+    int startLine = lineLocation.lineNumber;
+    int startColumn = lineLocation.columnNumber;
+    // done
+    return new Location(
+        source.fullName,
+        offset,
+        length,
+        startLine,
         startColumn);
   }
 
   factory Location.fromJson(Map<String, Object> map) {
-    return new Location(map[FILE], map[OFFSET], map[LENGTH], map[START_LINE],
+    return new Location(
+        map[FILE],
+        map[OFFSET],
+        map[LENGTH],
+        map[START_LINE],
         map[START_COLUMN]);
   }
 
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index b71b245..735d384 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -79,6 +79,7 @@
 //
 const String ADDED = 'added';
 const String CHILDREN = 'children';
+const String COMPLETION = 'completion';
 const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
 const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
 const String CONTENT = 'content';
@@ -89,7 +90,6 @@
 const String ELEMENT_DESCRIPTION = 'elementDescription';
 const String ELEMENT_KIND = 'elementKind';
 const String EXCLUDED = 'excluded';
-const String ERROR_CODE = 'errorCode';
 const String ERRORS = 'errors';
 const String FILE = 'file';
 const String FILES = 'files';
@@ -97,11 +97,14 @@
 const String FLAGS = 'flags';
 const String HOVERS = 'hovers';
 const String ID = 'id';
+const String INCLUDE_POTENTIAL = 'includePotential';
 const String INCLUDED = 'included';
 const String INTERFACE_ELEMENTS = 'interfaceElements';
 const String IS_ABSTRACT = 'isAbstract';
+const String IS_POTENTIAL = 'isPotential';
 const String IS_STATIC = 'isStatic';
 const String KIND = 'kind';
+const String LAST = 'last';
 const String LENGTH = 'length';
 const String LOCATION = 'location';
 const String MESSAGE = 'message';
@@ -116,12 +119,14 @@
 const String OVERRIDES = 'overrides';
 const String PARAMETER = 'parameter';
 const String PARAMETERS = 'parameters';
+const String PATH = 'path';
 const String PATTERN = 'pattern';
 const String PROPAGATED_TYPE = 'propagatedType';
 const String REFACTORINGS = 'refactorings';
 const String REGIONS = 'regions';
 const String REMOVED = 'removed';
 const String RETURN_TYPE = 'returnType';
+const String RESULTS = 'results';
 const String SEVERITY = 'severity';
 const String START_COLUMN = 'startColumn';
 const String START_LINE = 'startLine';
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index db34aa7..d26aead 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -10,7 +10,6 @@
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analysis_server/src/computer/computer_hover.dart';
 
@@ -37,15 +36,12 @@
     String file = request.getRequiredParameter(FILE).asString();
     int offset = request.getRequiredParameter(OFFSET).asInt();
     // prepare hovers
-    List<Map<String, Object>> hovers = <Map<String, Object>>[];
-    {
-      Source source = server.getSource(file);
-      AnalysisContext context = server.getAnalysisContext(file);
-      List<Source> librarySources = context.getLibrariesContaining(source);
-      for (Source librarySource in librarySources) {
-        CompilationUnit unit = context.resolveCompilationUnit2(source,
-            librarySource);
-        hovers.add(new DartUnitHoverComputer(unit, offset).compute());
+    List<Hover> hovers = <Hover>[];
+    List<CompilationUnit> units = server.getResolvedCompilationUnits(file);
+    for (CompilationUnit unit in units) {
+      Hover hoverInformation = new DartUnitHoverComputer(unit, offset).compute();
+      if (hoverInformation != null) {
+        hovers.add(hoverInformation);
       }
     }
     // send response
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index cfb6881..d3ab0d0 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -4,9 +4,13 @@
 
 library domain.completion;
 
+import 'dart:async';
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_server/src/collections.dart';
 
 /**
  * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
@@ -19,6 +23,16 @@
   final AnalysisServer server;
 
   /**
+   * The [SearchEngine] for this server.
+   */
+  SearchEngine searchEngine;
+
+  /**
+   * The next completion response id.
+   */
+  int _nextCompletionId = 0;
+
+  /**
    * Initialize a newly created handler to handle requests for the given [server].
    */
   CompletionDomainHandler(this.server);
@@ -37,13 +51,67 @@
   }
 
   Response getSuggestions(Request request) {
-    // file
-    RequestDatum fileDatum = request.getRequiredParameter(FILE);
-    String file = fileDatum.asString();
-    // offset
-    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
-    int offset = offsetDatum.asInt();
-    // TODO(brianwilkerson) implement
-    return null;
+    // extract param
+    String file = request.getRequiredParameter(FILE).asString();
+    int offset = request.getRequiredParameter(OFFSET).asInt();
+    // schedule completion analysis
+    String completionId = (_nextCompletionId++).toString();
+    var computer = new TopLevelSuggestionsComputer(server.searchEngine);
+    var future = computer.compute();
+    future.then((List<CompletionSuggestion> results) {
+      _sendCompletionNotification(completionId, true, results);
+    });
+    // respond
+    return new Response(request.id)..setResult(ID, completionId);
+  }
+
+  void _sendCompletionNotification(String completionId, bool isLast,
+      Iterable<CompletionSuggestion> results) {
+    Notification notification = new Notification(COMPLETION_RESULTS);
+    notification.setParameter(ID, completionId);
+    notification.setParameter(LAST, isLast);
+    notification.setParameter(RESULTS, results);
+    server.sendNotification(notification);
+  }
+}
+
+/**
+ * A computer for `completion.getSuggestions` request results.
+ */
+class TopLevelSuggestionsComputer {
+  final SearchEngine searchEngine;
+
+  TopLevelSuggestionsComputer(this.searchEngine);
+
+  /**
+   * Computes [CompletionSuggestion]s for the specified position in the source.
+   */
+  Future<List<CompletionSuggestion>> compute() {
+    var future = searchEngine.searchTopLevelDeclarations('');
+    return future.then((List<SearchMatch> matches) {
+      return matches.map((SearchMatch match) {
+        return new CompletionSuggestion(match.element.displayName);
+      }).toList();
+    });
+  }
+}
+
+/**
+ * A single completion suggestion.
+ */
+class CompletionSuggestion implements HasToJson {
+  final String completion;
+
+  CompletionSuggestion(this.completion);
+
+  factory CompletionSuggestion.fromJson(Map<String, Object> json) {
+    return new CompletionSuggestion(json[COMPLETION]);
+  }
+
+  @override
+  Map<String, Object> toJson() {
+    return {
+      COMPLETION: completion
+    };
   }
 }
diff --git a/pkg/analysis_server/lib/src/domain_edit.dart b/pkg/analysis_server/lib/src/domain_edit.dart
index 4a415b4..fbca9d6 100644
--- a/pkg/analysis_server/lib/src/domain_edit.dart
+++ b/pkg/analysis_server/lib/src/domain_edit.dart
@@ -4,7 +4,6 @@
 
 library domain.edit;
 
-import 'package:analyzer/src/generated/error.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -99,9 +98,15 @@
   Response getFixes(Request request) {
     // errors
     RequestDatum errorsDatum = request.getRequiredParameter(ERRORS);
-    List<AnalysisError> errors = errorsDatum.asList((RequestDatum datum) {
-      return _createAnalysisError(request, datum);
-    });
+    // TODO(paulberry): the API for edit.getFixes should be changed to so that
+    // it doesn't use AnalysisError as an input type.  This is necessary
+    // because the JSON protocol for an AnalysisError doesn't contain the
+    // errorCode, so we don't have enough information to reconstitute the error
+    // object.
+    // List<AnalysisError> errors = errorsDatum.asList((RequestDatum datum) {
+    //   return _createAnalysisError(request, datum);
+    // });
+
     // TODO(brianwilkerson) implement
     return null;
   }
@@ -127,74 +132,4 @@
     // TODO(brianwilkerson) implement
     return null;
   }
-
-  /**
-   * Convert the given data from a request into an analysis error.
-   */
-  AnalysisError _createAnalysisError(Request request, RequestDatum datum) {
-    String file = datum[FILE].asString();
-    String errorCodeName = datum[ERROR_CODE].asString();
-    int offset = datum[OFFSET].asInt();
-    int length = datum[LENGTH].asInt();
-    String message = datum[MESSAGE].asString();
-    String correction;
-    if (datum.hasKey(CORRECTION)) {
-      correction = datum[CORRECTION].asString();
-    }
-    ErrorCode errorCode = convertErrorCode(errorCodeName);
-    if (errorCode == null) {
-//      throw new RequestFailure(new Response.invalidErrorCode(request));
-    }
-    // TODO(brianwilkerson) Implement this.
-//    return new AnalysisError.con2(
-//        server.sourceFromFile(file),
-//        offset,
-//        length,
-//        errorCode,
-//        null);
-    return null;
-  }
-
-  /**
-   * Return the error code corresponding to the given [errorCodeName], or `null`
-   * if the given name is not a valid error code.
-   */
-  ErrorCode convertErrorCode(String errorCodeName) {
-    // TODO(brianwilkerson) Implement this.
-//    Enum2 errorCode = Enum2.valueOf(AngularCode.values, errorCodeName);
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(CompileTimeErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(HintCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(HtmlWarningCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(ParserErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(PolymerCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(PubSuggestionCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(ResolverErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(ScannerErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(StaticTypeErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(StaticWarningErrorCode.values, errorCodeName);
-//    }
-//    if (errorCode == null) {
-//      errorCode = Enum2.valueOf(TodoCode.values, errorCodeName);
-//    }
-    return null;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/domain_search.dart b/pkg/analysis_server/lib/src/domain_search.dart
deleted file mode 100644
index 8b1a2b2..0000000
--- a/pkg/analysis_server/lib/src/domain_search.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2014, 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 domain.search;
-
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/protocol.dart';
-
-/**
- * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
- * that handles requests in the search domain.
- */
-class SearchDomainHandler implements RequestHandler {
-  /**
-   * The analysis server that is using this handler to process requests.
-   */
-  final AnalysisServer server;
-
-  /**
-   * Initialize a newly created handler to handle requests for the given [server].
-   */
-  SearchDomainHandler(this.server);
-
-  @override
-  Response handleRequest(Request request) {
-    try {
-      String requestName = request.method;
-      if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
-        return findElementReferences(request);
-      } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
-        return findMemberDeclarations(request);
-      } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
-        return findMemberReferences(request);
-      } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
-        return findTopLevelDeclarations(request);
-      }
-    } on RequestFailure catch (exception) {
-      return exception.response;
-    }
-    return null;
-  }
-
-  Response findElementReferences(Request request) {
-    // file
-    RequestDatum fileDatum = request.getRequiredParameter(FILE);
-    String file = fileDatum.asString();
-    // offset
-    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
-    int offset = offsetDatum.asInt();
-    // includePotential
-    RequestDatum includePotentialDatum = request.getRequiredParameter(LENGTH);
-    bool includePotential = includePotentialDatum.asBool();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-
-  Response findMemberDeclarations(Request request) {
-    // name
-    RequestDatum nameDatum = request.getRequiredParameter(FILE);
-    String name = nameDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-
-  Response findMemberReferences(Request request) {
-    // name
-    RequestDatum nameDatum = request.getRequiredParameter(FILE);
-    String name = nameDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-
-  Response findTopLevelDeclarations(Request request) {
-    // pattern
-    RequestDatum patternDatum = request.getRequiredParameter(FILE);
-    String pattern = patternDatum.asString();
-    // TODO(brianwilkerson) implement
-    return null;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 96eb77a..27e2e8e 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/html.dart';
-import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
@@ -42,7 +41,6 @@
   // fill JSON
   Map<String, Object> result = {
     // TODO(scheglov) add Enum.fullName ?
-    ERROR_CODE: '${errorCode.runtimeType}.${(errorCode as Enum).name}',
     SEVERITY: errorCode.errorSeverity.name,
     TYPE: errorCode.type.name,
     LOCATION: location,
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index f2c8103..ee53942 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -7,6 +7,8 @@
 import 'dart:collection';
 import 'dart:convert' show JsonDecoder;
 
+import 'package:analysis_server/src/collections.dart';
+
 /**
  * An abstract enumeration.
  */
@@ -616,7 +618,7 @@
    * Set the value of the result field with the given [name] to the given [value].
    */
   void setResult(String name, Object value) {
-    result[name] = value;
+    result[name] = _toJson(value);
   }
 
   /**
@@ -870,7 +872,7 @@
    * Set the value of the parameter with the given [name] to the given [value].
    */
   void setParameter(String name, Object value) {
-    params[name] = value;
+    params[name] = _toJson(value);
   }
 
   /**
@@ -917,3 +919,16 @@
    */
   RequestFailure(this.response);
 }
+
+/**
+ * Returns a JSON presention of [value].
+ */
+_toJson(Object value) {
+  if (value is HasToJson) {
+    return value.toJson();
+  }
+  if (value is Iterable) {
+    return value.map((item) => _toJson(item)).toList();
+  }
+  return value;
+}
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
new file mode 100644
index 0000000..436d052
--- /dev/null
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, 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 search.element_references;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/collections.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_services/search/hierarchy.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A computer for `search.findElementReferences` request results.
+ */
+class ElementReferencesComputer {
+  final SearchEngine searchEngine;
+
+  ElementReferencesComputer(this.searchEngine);
+
+  /**
+   * Computes [SearchResult]s for [element] references.
+   */
+  Future<List<SearchResult>> compute(Element element, bool withPotential) {
+    var futureGroup = new _ConcatFutureGroup<SearchResult>();
+    // find element references
+    futureGroup.add(_findElementsReferences(element));
+    // add potential references
+    if (withPotential && _isMemberElement(element)) {
+      String name = element.displayName;
+      var matchesFuture = searchEngine.searchMemberReferences(name);
+      var resultsFuture = matchesFuture.then((List<SearchMatch> matches) {
+        return matches.where((match) => !match.isResolved).map(toResult);
+      });
+      futureGroup.add(resultsFuture);
+    }
+    // merge results
+    return futureGroup.future;
+  }
+
+  /**
+   * Returns a [Future] completing with a [List] of references to [element] or
+   * to the corresponding hierarchy [Element]s.
+   */
+  Future<List<SearchResult>> _findElementsReferences(Element element) {
+    return _getRefElements(element).then((Iterable<Element> refElements) {
+      var futureGroup = new _ConcatFutureGroup<SearchResult>();
+      for (Element refElement in refElements) {
+        // add variable declaration
+        if (_isVariableLikeElement(refElement)) {
+          SearchResult searchResult = _newDeclarationResult(refElement);
+          futureGroup.add(searchResult);
+        }
+        // do search
+        futureGroup.add(_findSingleElementReferences(refElement));
+      }
+      return futureGroup.future;
+    });
+  }
+
+  /**
+   * Returns a [Future] completing with a [List] of references to [element].
+   */
+  Future<List<SearchResult>> _findSingleElementReferences(Element element) {
+    Future<List<SearchMatch>> matchesFuture =
+        searchEngine.searchReferences(element);
+    return matchesFuture.then((List<SearchMatch> matches) {
+      return matches.map(toResult).toList();
+    });
+  }
+
+  /**
+   * Returns a [Future] completing with [Element]s to search references to.
+   *
+   * If a [ClassMemberElement] is given, each corresponding [Element] in the
+   * hierarchy is returned.
+   *
+   * Otherwise, only references to [element] should be searched.
+   */
+  Future<Iterable<Element>> _getRefElements(Element element) {
+    if (element is ClassMemberElement) {
+      return getHierarchyMembers(searchEngine, element);
+    }
+    return new Future.value([element]);
+  }
+
+  SearchResult _newDeclarationResult(Element refElement) {
+    int nameOffset = refElement.nameOffset;
+    int nameLength = refElement.name.length;
+    SearchMatch searchMatch =
+        new SearchMatch(
+            MatchKind.DECLARATION,
+            refElement,
+            new SourceRange(nameOffset, nameLength),
+            true,
+            false);
+    return new SearchResult.fromMatch(searchMatch);
+  }
+
+  static SearchResult toResult(SearchMatch match) {
+    return new SearchResult.fromMatch(match);
+  }
+
+  static bool _isMemberElement(Element element) {
+    return element.enclosingElement is ClassElement;
+  }
+
+  static bool _isVariableLikeElement(Element element) {
+    if (element is LocalVariableElement) {
+      return true;
+    }
+    if (element is ParameterElement) {
+      return true;
+    }
+    if (element is PropertyInducingElement) {
+      return !element.isSynthetic;
+    }
+    return false;
+  }
+}
+
+
+/**
+ * A collection of [Future]s that concats [List] results of added [Future]s into
+ * a single [List].
+ */
+class _ConcatFutureGroup<E> {
+  final List<Future<List<E>>> _futures = <Future<List<E>>>[];
+
+  Future<List<E>> get future {
+    return Future.wait(_futures).then(concatToList);
+  }
+
+  /**
+   * Adds a [Future] or an [E] value to results.
+   */
+  void add(value) {
+    if (value is Future) {
+      _futures.add(value);
+    } else {
+      _futures.add(new Future.value(<E>[value]));
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
new file mode 100644
index 0000000..1a7ff06
--- /dev/null
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2014, 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 search.domain;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/element.dart' as se;
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/element_references.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+/**
+ * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
+ * that handles requests in the search domain.
+ */
+class SearchDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * The [SearchEngine] for this server.
+   */
+  SearchEngine searchEngine;
+
+  /**
+   * The next searc response id.
+   */
+  int _nextSearchId = 0;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  SearchDomainHandler(this.server) {
+    searchEngine = server.searchEngine;
+  }
+
+  Response findElementReferences(Request request) {
+    String file = request.getRequiredParameter(FILE).asString();
+    int offset = request.getRequiredParameter(OFFSET).asInt();
+    bool includePotential =
+        request.getRequiredParameter(INCLUDE_POTENTIAL).asBool();
+    // prepare elements
+    List<Element> elements = server.getElementsAtOffset(file, offset);
+    elements = elements.map((Element element) {
+      if (element is FieldFormalParameterElement) {
+        return element.field;
+      }
+      if (element is PropertyAccessorElement) {
+        return element.variable;
+      }
+      return element;
+    }).toList();
+    // schedule search
+    String searchId = (_nextSearchId++).toString();
+    elements.forEach((Element element) {
+      var computer = new ElementReferencesComputer(searchEngine);
+      var future = computer.compute(element, includePotential);
+      future.then((List<SearchResult> results) {
+        bool isLast = identical(element, elements.last);
+        _sendSearchNotification(searchId, isLast, results);
+      });
+    });
+    if (elements.isEmpty) {
+      new Future.microtask(() {
+        _sendSearchNotification(searchId, true, []);
+      });
+    }
+    // respond
+    Response response = new Response(request.id);
+    response.setResult(ID, searchId);
+    if (elements.isNotEmpty) {
+      var serverElement = new se.Element.fromEngine(elements[0]);
+      response.setResult(ELEMENT, serverElement);
+    }
+    return response;
+  }
+
+  Response findMemberDeclarations(Request request) {
+    String name = request.getRequiredParameter(NAME).asString();
+    // schedule search
+    String searchId = (_nextSearchId++).toString();
+    {
+      var matchesFuture = searchEngine.searchMemberDeclarations(name);
+      matchesFuture.then((List<SearchMatch> matches) {
+        _sendSearchNotification(searchId, true, matches.map(toResult));
+      });
+    }
+    // respond
+    return new Response(request.id)..setResult(ID, searchId);
+  }
+
+  Response findMemberReferences(Request request) {
+    String name = request.getRequiredParameter(NAME).asString();
+    // schedule search
+    String searchId = (_nextSearchId++).toString();
+    {
+      var matchesFuture = searchEngine.searchMemberReferences(name);
+      matchesFuture.then((List<SearchMatch> matches) {
+        _sendSearchNotification(searchId, true, matches.map(toResult));
+      });
+    }
+    // respond
+    return new Response(request.id)..setResult(ID, searchId);
+  }
+
+  Response findTopLevelDeclarations(Request request) {
+    String pattern = request.getRequiredParameter(PATTERN).asString();
+    // schedule search
+    String searchId = (_nextSearchId++).toString();
+    {
+      var matchesFuture = searchEngine.searchTopLevelDeclarations(pattern);
+      matchesFuture.then((List<SearchMatch> matches) {
+        _sendSearchNotification(searchId, true, matches.map(toResult));
+      });
+    }
+    // respond
+    return new Response(request.id)..setResult(ID, searchId);
+  }
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
+        return findElementReferences(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
+        return findMemberDeclarations(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
+        return findMemberReferences(request);
+      } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
+        return findTopLevelDeclarations(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  void _sendSearchNotification(String searchId, bool isLast,
+      Iterable<SearchResult> results) {
+    Notification notification = new Notification(SEARCH_RESULTS);
+    notification.setParameter(ID, searchId);
+    notification.setParameter(LAST, isLast);
+    notification.setParameter(RESULTS, results);
+    server.sendNotification(notification);
+  }
+
+  static SearchResult toResult(SearchMatch match) {
+    return new SearchResult.fromMatch(match);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/search/search_result.dart b/pkg/analysis_server/lib/src/search/search_result.dart
new file mode 100644
index 0000000..cc366d0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/search/search_result.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2014, 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 search.search_result;
+
+import 'package:analysis_server/src/collections.dart';
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+
+
+/**
+ * A single result from a search request.
+ */
+class SearchResult implements HasToJson {
+  /**
+   * The kind of element that was found or the kind of reference that was found.
+   */
+  final SearchResultKind kind;
+
+  /**
+   * Is `true` if the result is a potential match but cannot be confirmed to be
+   * a match.
+   *
+   * For example, if all references to a method `m` defined in some class were
+   * requested, and a reference to a method `m` from an unknown class were
+   * found, it would be marked as being a potential match.
+   */
+  final bool isPotential;
+
+  /**
+   * The location of the code that matched the search criteria.
+   */
+  final Location location;
+
+  /**
+   * The elements that contain the result, starting with the most immediately
+   * enclosing ancestor and ending with the library.
+   */
+  final List<Element> path;
+
+  SearchResult(this.kind, this.isPotential, this.location, this.path);
+
+  factory SearchResult.fromJson(Map<String, Object> map) {
+    SearchResultKind kind = new SearchResultKind.fromName(map[KIND]);
+    bool isPotential = map[IS_POTENTIAL];
+    Location location = new Location.fromJson(map[LOCATION]);
+    List<Map<String, Object>> pathJson = map[PATH];
+    List<Element> path = pathJson.map((json) {
+      return new Element.fromJson(json);
+    }).toList();
+    return new SearchResult(kind, isPotential, location, path);
+  }
+
+  factory SearchResult.fromMatch(SearchMatch match) {
+    SearchResultKind kind = new SearchResultKind.fromEngine(match.kind);
+    Location location =
+        new Location.fromOffset(
+            match.element,
+            match.sourceRange.offset,
+            match.sourceRange.length);
+    List<Element> path = _computePath(match.element);
+    return new SearchResult(kind, !match.isResolved, location, path);
+  }
+
+  Map<String, Object> toJson() {
+    return {
+      KIND: kind.name,
+      IS_POTENTIAL: isPotential,
+      LOCATION: location.toJson(),
+      PATH: path.map(Element.asJson).toList()
+    };
+  }
+
+  @override
+  String toString() => toJson().toString();
+
+  static Map<String, Object> asJson(SearchResult result) {
+    return result.toJson();
+  }
+
+  static List<Element> _computePath(engine.Element element) {
+    List<Element> path = <Element>[];
+    while (element != null) {
+      path.add(new Element.fromEngine(element));
+      element = element.enclosingElement;
+    }
+    return path;
+  }
+}
+
+
+/**
+ * An enumeration of the kinds of search results returned by the search domain.
+ */
+class SearchResultKind {
+  static const DECLARATION = const SearchResultKind('DECLARATION');
+  static const READ = const SearchResultKind('READ');
+  static const READ_WRITE = const SearchResultKind('READ_WRITE');
+  static const WRITE = const SearchResultKind('WRITE');
+  static const INVOCATION = const SearchResultKind('INVOCATION');
+  static const REFERENCE = const SearchResultKind('REFERENCE');
+  static const UNKNOWN = const SearchResultKind('UNKNOWN');
+
+  final String name;
+
+  const SearchResultKind(this.name);
+
+  factory SearchResultKind.fromEngine(MatchKind kind) {
+    if (kind == MatchKind.DECLARATION) {
+      return DECLARATION;
+    }
+    if (kind == MatchKind.READ) {
+      return READ;
+    }
+    if (kind == MatchKind.READ_WRITE) {
+      return READ_WRITE;
+    }
+    if (kind == MatchKind.WRITE) {
+      return WRITE;
+    }
+    if (kind == MatchKind.INVOCATION) {
+      return INVOCATION;
+    }
+    if (kind == MatchKind.REFERENCE) {
+      return REFERENCE;
+    }
+    return UNKNOWN;
+  }
+
+  factory SearchResultKind.fromName(String name) {
+    if (name == DECLARATION.name) {
+      return DECLARATION;
+    }
+    if (name == READ.name) {
+      return READ;
+    }
+    if (name == READ_WRITE.name) {
+      return READ_WRITE;
+    }
+    if (name == WRITE.name) {
+      return WRITE;
+    }
+    if (name == INVOCATION.name) {
+      return INVOCATION;
+    }
+    if (name == REFERENCE.name) {
+      return REFERENCE;
+    }
+    return UNKNOWN;
+  }
+
+  @override
+  String toString() => name;
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index fca3162..f5ea822 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -11,7 +11,7 @@
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_completion.dart';
 import 'package:analysis_server/src/domain_edit.dart';
-import 'package:analysis_server/src/domain_search.dart';
+import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index e29109a..f76d896 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -1,19 +1,19 @@
 name: analysis_server
-version: 0.0.3
+version: 0.1.0
 author: Dart Team <misc@dartlang.org>
 description: An HTTP server that performs analysis of Dart code via web sockets.
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analysis_services: '>=0.1.0 <1.0.0'
-  analyzer: '>=0.21.0 <1.0.0'
+  analysis_services: '>=0.4.0 <0.5.0'
+  analyzer: '>=0.22.0-dev <0.23.0'
   args: any
   logging: any
   path: any
   watcher: any
 dev_dependencies:
-  analysis_testing: '>=0.2.0'
+  analysis_testing: '>=0.4.0 <0.5.0'
   mock: '>=0.10.0 <0.11.0'
   typed_mock: '>=0.0.4 <1.0.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 32f8e1e..a6e006c 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -36,17 +36,6 @@
 
 
 
-AnalysisError _jsonToAnalysisError(Map<String, Object> json) {
-  return new AnalysisError(
-      json['file'],
-      json['errorCode'],
-      json['offset'],
-      json['length'],
-      json['message'],
-      json['correction']);
-}
-
-
 /**
  * An abstract base for all 'analysis' domain tests.
  */
@@ -55,7 +44,7 @@
   MemoryResourceProvider resourceProvider;
   MockPackageMapProvider packageMapProvider;
   AnalysisServer server;
-  AnalysisDomainHandler handler;
+  RequestHandler handler;
 
   Map<String, List<String>> analysisSubscriptions = {};
 
diff --git a/pkg/analysis_server/test/analysis_hover_test.dart b/pkg/analysis_server/test/analysis_hover_test.dart
index e07354e..6b09ce1 100644
--- a/pkg/analysis_server/test/analysis_hover_test.dart
+++ b/pkg/analysis_server/test/analysis_hover_test.dart
@@ -24,26 +24,22 @@
 
 @ReflectiveTestCase()
 class AnalysisHoverTest extends AbstractAnalysisTest {
-  List<Hover> hovers;
-  Hover hover;
-
-  Future prepareHover(String search, then()) {
+  Future<Hover> prepareHover(String search) {
     int offset = findOffset(search);
-    return prepareHoverAt(offset, then);
+    return prepareHoverAt(offset);
   }
 
-  Future prepareHoverAt(int offset, then()) {
+  Future<Hover> prepareHoverAt(int offset) {
     return waitForTasksFinished().then((_) {
       Request request = new Request('0', ANALYSIS_GET_HOVER);
       request.setParameter(FILE, testFile);
       request.setParameter(OFFSET, offset);
       Response response = handleSuccessfulRequest(request);
       List<Map<String, Object>> hoverJsons = response.getResult(HOVERS);
-      hovers = hoverJsons.map((json) {
+      List<Hover> hovers = hoverJsons.map((json) {
         return new Hover.fromJson(json);
       }).toList();
-      hover = hovers.isNotEmpty ? hovers.first : null;
-      then();
+      return hovers.isNotEmpty ? hovers.first : null;
     });
   }
 
@@ -63,7 +59,7 @@
 main() {
 }
 ''');
-    return prepareHover('main() {', () {
+    return prepareHover('main() {').then((Hover hover) {
       expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
     });
   }
@@ -76,7 +72,7 @@
 main() {
 }
 ''');
-    return prepareHover('main() {', () {
+    return prepareHover('main() {').then((Hover hover) {
       expect(hover.dartDoc, '''doc aaa\ndoc bbb''');
     });
   }
@@ -89,7 +85,7 @@
 List<String> fff(int a, String b) {
 }
 ''');
-    return prepareHover('fff(int a', () {
+    return prepareHover('fff(int a').then((Hover hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
@@ -111,7 +107,7 @@
 }
 foo(Object myParameter) {}
 ''');
-    return prepareHover('123', () {
+    return prepareHover('123').then((Hover hover) {
       // literal, no Element
       expect(hover.elementDescription, isNull);
       expect(hover.elementKind, isNull);
@@ -133,7 +129,7 @@
   }
 }
 ''');
-    return prepareHover('mmm(int a', () {
+    return prepareHover('mmm(int a').then((Hover hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
@@ -159,7 +155,7 @@
   a.mmm(42, 'foo');
 }
 ''');
-    return prepareHover('mm(42, ', () {
+    return prepareHover('mm(42, ').then((Hover hover) {
       // range
       expect(hover.offset, findOffset('mmm(42, '));
       expect(hover.length, 'mmm'.length);
@@ -188,7 +184,7 @@
   print(a.fff);
 }
 ''');
-    return prepareHover('fff);', () {
+    return prepareHover('fff);').then((Hover hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
@@ -209,7 +205,7 @@
   print(vvv);
 }
 ''');
-    return prepareHover('vvv);', () {
+    return prepareHover('vvv);').then((Hover hover) {
       // element
       expect(hover.containingLibraryName, 'my.library');
       expect(hover.containingLibraryPath, testFile);
@@ -221,4 +217,16 @@
       expect(hover.propagatedType, 'int');
     });
   }
+
+  test_noHoverInfo() {
+    addTestFile('''
+library my.library;
+main() {
+  // nothing
+}
+''');
+    return prepareHover('nothing').then((Hover hover) {
+      expect(hover, isNull);
+    });
+  }
 }
diff --git a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
index 816effd..8f65214 100644
--- a/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_occurrences_test.dart
@@ -66,8 +66,9 @@
       for (int occurrenceOffset in occurrences.offsets) {
         if (occurrenceOffset == offset) {
           if (exists == false) {
-            fail('Not expected to find (offset=$offset; length=$length) in\n'
-                '${occurrencesList.join('\n')}');
+            fail(
+                'Not expected to find (offset=$offset; length=$length) in\n'
+                    '${occurrencesList.join('\n')}');
           }
           testOccurences = occurrences;
           return;
@@ -75,8 +76,9 @@
       }
     }
     if (exists == true) {
-      fail('Expected to find (offset=$offset; length=$length) in\n'
-          '${occurrencesList.join('\n')}');
+      fail(
+          'Expected to find (offset=$offset; length=$length) in\n'
+              '${occurrencesList.join('\n')}');
     }
   }
 
@@ -92,8 +94,8 @@
       String file = notification.getParameter(FILE);
       if (file == testFile) {
         occurrencesList = <Occurrences>[];
-        List<Map<String, Object>> jsonList = notification.getParameter(
-            OCCURRENCES);
+        List<Map<String, Object>> jsonList =
+            notification.getParameter(OCCURRENCES);
         for (Map<String, Object> json in jsonList) {
           occurrencesList.add(new Occurrences.fromJson(json));
         }
@@ -145,6 +147,26 @@
     });
   }
 
+  test_field() {
+    addTestFile('''
+class A {
+  int fff;
+  A(this.fff); // constructor
+  main() {
+    fff = 42;
+    print(fff); // print
+  }
+}
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('fff;');
+      expect(testOccurences.element.kind, ElementKind.FIELD);
+      assertHasOffset('fff); // constructor');
+      assertHasOffset('fff = 42;');
+      assertHasOffset('fff); // print');
+    });
+  }
+
   test_localVariable() {
     addTestFile('''
 main() {
@@ -162,4 +184,60 @@
       assertHasOffset('vvv);');
     });
   }
+
+  test_memberField() {
+    addTestFile('''
+class A<T> {
+  T fff;
+}
+main() {
+  var a = new A<int>();
+  var b = new A<String>();
+  a.fff = 1;
+  b.fff = 2;
+}
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('fff;');
+      expect(testOccurences.element.kind, ElementKind.FIELD);
+      assertHasOffset('fff = 1;');
+      assertHasOffset('fff = 2;');
+    });
+  }
+
+  test_memberMethod() {
+    addTestFile('''
+class A<T> {
+  T mmm() {}
+}
+main() {
+  var a = new A<int>();
+  var b = new A<String>();
+  a.mmm(); // a
+  b.mmm(); // b
+}
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('mmm() {}');
+      expect(testOccurences.element.kind, ElementKind.METHOD);
+      assertHasOffset('mmm(); // a');
+      assertHasOffset('mmm(); // b');
+    });
+  }
+
+  test_topLevelVariable() {
+    addTestFile('''
+var VVV = 1;
+main() {
+  VVV = 2;
+  print(VVV);
+}
+''');
+    return prepareOccurrences(() {
+      assertHasRegion('VVV = 1;');
+      expect(testOccurences.element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+      assertHasOffset('VVV = 2;');
+      assertHasOffset('VVV);');
+    });
+  }
 }
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
new file mode 100644
index 0000000..f43b9d5
--- /dev/null
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2014, 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.domain.completion;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_services/index/index.dart' show Index;
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+
+main() {
+  group('completion', () {
+    runReflectiveTests(CompletionTest);
+  });
+}
+
+@ReflectiveTestCase()
+class CompletionTest extends AbstractAnalysisTest {
+  String completionId;
+  int completionOffset;
+  List<CompletionSuggestion> suggestions = [];
+  bool suggestionsDone = false;
+
+  String addTestFile(String content) {
+    completionOffset = content.indexOf('^');
+    expect(completionOffset, isNot(equals(-1)), reason: 'missing ^');
+    int nextOffset = content.indexOf('^', completionOffset + 1);
+    expect(nextOffset, equals(-1), reason: 'too many ^');
+    return super.addTestFile(
+        content.substring(0, completionOffset)
+        + content.substring(completionOffset + 1));
+  }
+
+  void assertHasResult(String completion) {
+    var cs = suggestions.firstWhere((cs) => cs.completion == completion, orElse: () {
+      var completions = suggestions.map((s) => s.completion).toList();
+      fail('expected "$completion" but found\n $completions');
+    });
+  }
+
+  void assertValidId(String id) {
+    expect(id, isNotNull);
+    expect(id.isNotEmpty, isTrue);
+  }
+
+  @override
+  Index createIndex() {
+    return createLocalMemoryIndex();
+  }
+
+  Future getSuggestions() {
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', COMPLETION_GET_SUGGESTIONS);
+      request.setParameter(FILE, testFile);
+      request.setParameter(OFFSET, completionOffset);
+      Response response = handleSuccessfulRequest(request);
+      completionId = response.getResult(ID);
+      assertValidId(completionId);
+      return waitForSuggestions();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == COMPLETION_RESULTS) {
+      String id = notification.getParameter(ID);
+      assertValidId(id);
+      if (id == completionId) {
+        expect(suggestionsDone, isFalse);
+        suggestionsDone = notification.getParameter(LAST);
+        expect(suggestionsDone, isNotNull);
+        for (Map<String, Object> json in notification.getParameter(RESULTS)) {
+          expect(json, isNotNull);
+          suggestions.add(new CompletionSuggestion.fromJson(json));
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+    handler = new CompletionDomainHandler(server);
+  }
+
+  Future waitForSuggestions() {
+    if (suggestionsDone) {
+      return new Future.value();
+    }
+    return new Future.delayed(Duration.ZERO, waitForSuggestions);
+  }
+
+  test_suggestions() {
+    addTestFile('''
+      import 'dart:html';
+      main() {^}
+    ''');
+    return getSuggestions().then((_) {
+      assertHasResult('Object');
+      assertHasResult('HtmlElement');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
index 09155eb..0ca2bfe 100644
--- a/pkg/analysis_server/test/computer/element_test.dart
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -35,28 +35,43 @@
 
   void test_valueOf() {
     expect(ElementKind.valueOf(ElementKind.CLASS.name), ElementKind.CLASS);
-    expect(ElementKind.valueOf(ElementKind.CLASS_TYPE_ALIAS.name),
+    expect(
+        ElementKind.valueOf(ElementKind.CLASS_TYPE_ALIAS.name),
         ElementKind.CLASS_TYPE_ALIAS);
-    expect(ElementKind.valueOf(ElementKind.COMPILATION_UNIT.name),
+    expect(
+        ElementKind.valueOf(ElementKind.COMPILATION_UNIT.name),
         ElementKind.COMPILATION_UNIT);
-    expect(ElementKind.valueOf(ElementKind.CONSTRUCTOR.name),
+    expect(
+        ElementKind.valueOf(ElementKind.CONSTRUCTOR.name),
         ElementKind.CONSTRUCTOR);
     expect(ElementKind.valueOf(ElementKind.FIELD.name), ElementKind.FIELD);
-    expect(ElementKind.valueOf(ElementKind.FUNCTION.name),
+    expect(
+        ElementKind.valueOf(ElementKind.FUNCTION.name),
         ElementKind.FUNCTION);
-    expect(ElementKind.valueOf(ElementKind.FUNCTION_TYPE_ALIAS.name),
+    expect(
+        ElementKind.valueOf(ElementKind.FUNCTION_TYPE_ALIAS.name),
         ElementKind.FUNCTION_TYPE_ALIAS);
     expect(ElementKind.valueOf(ElementKind.GETTER.name), ElementKind.GETTER);
     expect(ElementKind.valueOf(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
-    expect(ElementKind.valueOf(ElementKind.LOCAL_VARIABLE.name),
+    expect(
+        ElementKind.valueOf(ElementKind.LOCAL_VARIABLE.name),
         ElementKind.LOCAL_VARIABLE);
     expect(ElementKind.valueOf(ElementKind.METHOD.name), ElementKind.METHOD);
+    expect(
+        ElementKind.valueOf(ElementKind.PARAMETER.name),
+        ElementKind.PARAMETER);
     expect(ElementKind.valueOf(ElementKind.SETTER.name), ElementKind.SETTER);
-    expect(ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
+    expect(
+        ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
         ElementKind.TOP_LEVEL_VARIABLE);
-    expect(ElementKind.valueOf(ElementKind.UNIT_TEST_CASE.name),
+    expect(
+        ElementKind.valueOf(ElementKind.TYPE_PARAMETER.name),
+        ElementKind.TYPE_PARAMETER);
+    expect(
+        ElementKind.valueOf(ElementKind.UNIT_TEST_CASE.name),
         ElementKind.UNIT_TEST_CASE);
-    expect(ElementKind.valueOf(ElementKind.UNIT_TEST_GROUP.name),
+    expect(
+        ElementKind.valueOf(ElementKind.UNIT_TEST_GROUP.name),
         ElementKind.UNIT_TEST_GROUP);
     expect(ElementKind.valueOf(ElementKind.UNKNOWN.name), ElementKind.UNKNOWN);
     expect(() {
@@ -65,31 +80,50 @@
   }
 
   void test_valueOfEngine() {
-    expect(ElementKind.valueOfEngine(engine.ElementKind.CLASS),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.CLASS),
         ElementKind.CLASS);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.COMPILATION_UNIT),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.COMPILATION_UNIT),
         ElementKind.COMPILATION_UNIT);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.CONSTRUCTOR),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.CONSTRUCTOR),
         ElementKind.CONSTRUCTOR);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.FIELD),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.FIELD),
         ElementKind.FIELD);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.FUNCTION),
         ElementKind.FUNCTION);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
         ElementKind.FUNCTION_TYPE_ALIAS);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.GETTER),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.GETTER),
         ElementKind.GETTER);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
         ElementKind.LIBRARY);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.LOCAL_VARIABLE),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.LOCAL_VARIABLE),
         ElementKind.LOCAL_VARIABLE);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.METHOD),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.METHOD),
         ElementKind.METHOD);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.SETTER),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.PARAMETER),
+        ElementKind.PARAMETER);
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.SETTER),
         ElementKind.SETTER);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
         ElementKind.TOP_LEVEL_VARIABLE);
-    expect(ElementKind.valueOfEngine(engine.ElementKind.ANGULAR_COMPONENT),
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.TYPE_PARAMETER),
+        ElementKind.TYPE_PARAMETER);
+    expect(
+        ElementKind.valueOfEngine(engine.ElementKind.ANGULAR_COMPONENT),
         ElementKind.UNKNOWN);
   }
 }
@@ -120,8 +154,9 @@
       expect(location.startLine, 2);
       expect(location.startColumn, 16);
     }
-    expect(element.flags, Element.FLAG_ABSTRACT | Element.FLAG_DEPRECATED |
-        Element.FLAG_PRIVATE);
+    expect(
+        element.flags,
+        Element.FLAG_ABSTRACT | Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE);
   }
 
   void test_fromElement_CONSTRUCTOR() {
@@ -130,8 +165,8 @@
   const A.myConstructor(int a, [String b]);
 }''');
     CompilationUnit unit = resolveLibraryUnit(source);
-    engine.ConstructorElement engineElement = findElementInUnit(unit,
-        'myConstructor');
+    engine.ConstructorElement engineElement =
+        findElementInUnit(unit, 'myConstructor');
     // create notification Element
     Element element = new Element.fromEngine(engineElement);
     expect(element.kind, ElementKind.CONSTRUCTOR);
@@ -179,8 +214,8 @@
   String myGetter => 42;
 }''');
     CompilationUnit unit = resolveLibraryUnit(source);
-    engine.PropertyAccessorElement engineElement = findElementInUnit(unit,
-        'myGetter', engine.ElementKind.GETTER);
+    engine.PropertyAccessorElement engineElement =
+        findElementInUnit(unit, 'myGetter', engine.ElementKind.GETTER);
     // create notification Element
     Element element = new Element.fromEngine(engineElement);
     expect(element.kind, ElementKind.GETTER);
@@ -225,7 +260,9 @@
   }
 
   void test_fromJson() {
-    var flags = Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+    var flags =
+        Element.FLAG_DEPRECATED |
+        Element.FLAG_PRIVATE |
         Element.FLAG_STATIC;
     var json = {
       KIND: 'METHOD',
@@ -272,7 +309,8 @@
         START_LINE: 3,
         START_COLUMN: 4,
       },
-      FLAGS: Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+      FLAGS: Element.FLAG_DEPRECATED |
+          Element.FLAG_PRIVATE |
           Element.FLAG_STATIC,
       PARAMETERS: '(int a, String b)',
       RETURN_TYPE: 'List<String>'
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index f9ee43c..8b80cd7 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -27,7 +27,7 @@
   Location location = new Location(jsonLocation[FILE], _getSafeInt(jsonLocation,
       OFFSET, -1), _getSafeInt(jsonLocation, LENGTH, -1), _getSafeInt(jsonLocation,
       START_LINE, -1), _getSafeInt(jsonLocation, START_COLUMN, -1));
-  return new AnalysisError(json[ERROR_CODE], json[SEVERITY], json[TYPE], location,
+  return new AnalysisError('unknown error code', json[SEVERITY], json[TYPE], location,
       json['message'], json['correction']);
 }
 
@@ -175,7 +175,7 @@
     helper = new AnalysisTestHelper();
   });
 
-  test('ParserErrorCode', () {
+  test('ParserError', () {
     helper.createSingleFileProject('library lib');
     return helper.waitForOperationsFinished().then((_) {
       List<AnalysisError> errors = helper.getTestErrors();
@@ -184,20 +184,20 @@
       expect(error.location.file, '/project/bin/test.dart');
       expect(error.location.offset, isPositive);
       expect(error.location.length, isNonNegative);
-      expect(error.errorCode, 'ParserErrorCode.EXPECTED_TOKEN');
       expect(error.severity, 'ERROR');
       expect(error.type, 'SYNTACTIC_ERROR');
       expect(error.message, isNotNull);
     });
   });
 
-  test('StaticWarningCode', () {
+  test('StaticWarning', () {
     helper.createSingleFileProject(['main() {', '  print(unknown);', '}']);
     return helper.waitForOperationsFinished().then((_) {
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, hasLength(1));
       AnalysisError error = errors[0];
-      expect(error.errorCode, 'StaticWarningCode.UNDEFINED_IDENTIFIER');
+      expect(error.severity, 'WARNING');
+      expect(error.type, 'STATIC_WARNING');
     });
   });
 }
@@ -325,6 +325,19 @@
       });
     });
   });
+
+  test('after analysis, no such file', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('int V = 42;');
+    return helper.waitForOperationsFinished().then((_) {
+      String noFile = '/no-such.file.dart';
+      helper.addAnalysisSubscriptionErrors(noFile);
+      return helper.waitForOperationsFinished().then((_) {
+        var errors = helper.getErrors(noFile);
+        expect(errors, isEmpty);
+      });
+    });
+  });
 }
 
 
@@ -484,6 +497,10 @@
     handleSuccessfulRequest(request);
   }
 
+  void addAnalysisSubscriptionErrors(String file) {
+    addAnalysisSubscription(AnalysisService.ERRORS, file);
+  }
+
   void addAnalysisSubscriptionHighlights(String file) {
     addAnalysisSubscription(AnalysisService.HIGHLIGHTS, file);
   }
diff --git a/pkg/analysis_server/test/domain_search_test.dart b/pkg/analysis_server/test/domain_search_test.dart
deleted file mode 100644
index 234d0da..0000000
--- a/pkg/analysis_server/test/domain_search_test.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2014, 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.domain.search;
-
-import 'dart:async';
-
-import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/domain_search.dart';
-import 'package:analysis_server/src/protocol.dart';
-import 'package:analysis_services/index/index.dart';
-import 'package:analysis_services/index/local_memory_index.dart';
-import 'package:analysis_testing/mock_sdk.dart';
-import 'package:analysis_testing/reflective_tests.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:unittest/unittest.dart';
-
-import 'analysis_abstract.dart';
-import 'mocks.dart';
-
-main() {
-  groupSep = ' | ';
-  group('SearchDomainHandler', () {
-    runReflectiveTests(SearchDomainTest);
-  });
-
-  MockServerChannel serverChannel;
-  MemoryResourceProvider resourceProvider;
-  AnalysisServer server;
-  SearchDomainHandler handler;
-
-  setUp(() {
-    serverChannel = new MockServerChannel();
-    resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(
-        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
-    server.defaultSdk = new MockSdk();
-    handler = new SearchDomainHandler(server);
-  });
-
-  group('SearchDomainHandler', () {
-    test('findElementReferences', () {
-      var request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES);
-      request.setParameter(FILE, null);
-      request.setParameter(OFFSET, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('findMemberDeclarations', () {
-      var request = new Request('0', SEARCH_FIND_MEMBER_DECLARATIONS);
-      request.setParameter(NAME, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('findMemberReferences', () {
-      var request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
-      request.setParameter(NAME, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-
-    test('findTopLevelDeclarations', () {
-      var request = new Request('0', SEARCH_FIND_TOP_LEVEL_DECLARATIONS);
-      request.setParameter(PATTERN, null);
-      var response = handler.handleRequest(request);
-      // TODO(brianwilkerson) implement
-      //expect(response, isNull);
-    });
-  });
-}
-
-@ReflectiveTestCase()
-class SearchDomainTest extends AbstractAnalysisTest {
-  Index index;
-
-  @override
-  Index createIndex() {
-    return createLocalMemoryIndex();
-  }
-
-  @override
-  void setUp() {
-    super.setUp();
-    index = server.index;
-    createProject();
-  }
-
-  Future test_findTopLevelDeclarations() {
-    // TODO(scheglov) replace this temporary Index test with an actual
-    // SearchEngine and SearchDomainHandler test.
-    addTestFile('''
-class AAA {
-  AAA() {}
-}
-''');
-    return waitForTasksFinished().then((_) {
-      return index.getRelationships(UniverseElement.INSTANCE,
-          IndexConstants.DEFINES_CLASS).then((List<Location> locations) {
-        bool hasClassFunction = false;
-        bool hasClassAAA = false;
-        for (var location in locations) {
-          if (location.element.name == 'Function') {
-            hasClassFunction = true;
-          }
-          if (location.element.name == 'AAA') {
-            hasClassAAA = true;
-          }
-        }
-        expect(hasClassFunction, isTrue, reason: locations.toString());
-        expect(hasClassAAA, isTrue, reason: locations.toString());
-      });
-    });
-  }
-}
diff --git a/pkg/analysis_server/test/integration/analysis_domain_inttest.dart b/pkg/analysis_server/test/integration/analysis_domain_inttest.dart
new file mode 100644
index 0000000..090e8e68
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis_domain_inttest.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2014, 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.integration.analysis.domain;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import 'integration_tests.dart';
+
+@ReflectiveTestCase()
+class AnalysisDomainIntegrationTest extends
+    AbstractAnalysisServerIntegrationTest {
+  test_getHover() {
+    String filename = 'test.dart';
+    String pathname = normalizePath(filename);
+    String text =
+        r'''
+library lib.test;
+
+List topLevelVar;
+
+/**
+ * Documentation for func
+ */
+void func(int param) {
+  num localVar = topLevelVar.length;
+  topLevelVar.length = param;
+  topLevelVar.add(localVar);
+}
+
+main() {
+  func(35);
+}
+''';
+    writeFile(filename, text);
+    setAnalysisRoots(['']);
+
+    testHover(String target, int length, List<String> descriptionRegexps, String
+        kind, List<String> staticTypeRegexps, {bool isCore: false, String docRegexp:
+        null, bool isLiteral: false, List<String> parameterRegexps:
+        null, propagatedType: null}) {
+      int offset = text.indexOf(target);
+      return server.send(ANALYSIS_GET_HOVER, {
+        'file': pathname,
+        'offset': offset
+      }).then((result) {
+        expect(result, isAnalysisGetHoverResult);
+        expect(result['hovers'], hasLength(1));
+        var info = result['hovers'][0];
+        expect(info['offset'], equals(offset));
+        expect(info['length'], equals(length));
+        if (isCore) {
+          expect(basename(info['containingLibraryPath']), equals('core.dart'));
+          expect(info['containingLibraryName'], equals('dart.core'));
+        } else if (isLiteral) {
+          expect(info['containingLibraryPath'], isNull);
+          expect(info['containingLibraryName'], isNull);
+        } else {
+          expect(info['containingLibraryPath'], equals(pathname));
+          expect(info['containingLibraryName'], equals('lib.test'));
+        }
+        if (docRegexp == null) {
+          expect(info['dartdoc'], isNull);
+        } else {
+          expect(info['dartdoc'], matches(docRegexp));
+        }
+        if (descriptionRegexps == null) {
+          expect(info['elementDescription'], isNull);
+        } else {
+          expect(info['elementDescription'], isString);
+          for (String descriptionRegexp in descriptionRegexps) {
+            expect(info['elementDescription'], matches(descriptionRegexp));
+          }
+        }
+        expect(info['elementKind'], equals(kind));
+        if (parameterRegexps == null) {
+          expect(info['parameter'], isNull);
+        } else {
+          expect(info['parameter'], isString);
+          for (String parameterRegexp in parameterRegexps) {
+            expect(info['parameter'], matches(parameterRegexp));
+          }
+        }
+        expect(info['propagatedType'], equals(propagatedType));
+        if (staticTypeRegexps == null) {
+          expect(info['staticType'], isNull);
+        } else {
+          expect(info['staticType'], isString);
+          for (String staticTypeRegexp in staticTypeRegexps) {
+            expect(info['staticType'], matches(staticTypeRegexp));
+          }
+        }
+      });
+    }
+
+    // Note: analysis.getHover doesn't wait for analysis to complete--it simply
+    // returns the latest results that are available at the time that the
+    // request is made.  So wait for analysis to finish before testing anything.
+    return analysisFinished.then((_) {
+      List<Future> tests = [];
+      tests.add(testHover('topLevelVar;', 11, ['List', 'topLevelVar'],
+          'top level variable', ['List']));
+      tests.add(testHover('func(', 4, ['func', 'int', 'param'], 'function',
+          ['int', 'void'], docRegexp: 'Documentation for func'));
+      tests.add(testHover('int param', 3, ['int'], 'class', ['int'], isCore:
+          true, docRegexp: '.*'));
+      tests.add(testHover('param)', 5, ['int', 'param'], 'parameter', ['int'],
+          docRegexp: 'Documentation for func'));
+      tests.add(testHover('num localVar', 3, ['num'], 'class', ['num'], isCore:
+          true, docRegexp: '.*'));
+      tests.add(testHover('localVar =', 8, ['num', 'localVar'],
+          'local variable', ['num'], propagatedType: 'int'));
+      tests.add(testHover('topLevelVar.length;', 11, ['List', 'topLevelVar'],
+          'top level variable', ['List']));
+      tests.add(testHover('length;', 6, ['get', 'length', 'int'], 'getter',
+          ['int'], isCore: true, docRegexp: '.*'));
+      tests.add(testHover('length =', 6, ['set', 'length', 'int'], 'setter',
+          ['int'], isCore: true, docRegexp: '.*'));
+      tests.add(testHover('param;', 5, ['int', 'param'], 'parameter', ['int'],
+          docRegexp: 'Documentation for func'));
+      tests.add(testHover('add(', 3, ['List', 'add'], 'method', null, isCore:
+          true, docRegexp: '.*'));
+      tests.add(testHover('localVar)', 8, ['num', 'localVar'], 'local variable',
+          ['num'], parameterRegexps: ['.*'], propagatedType: 'int'));
+      tests.add(testHover('func(35', 4, ['func', 'int', 'param'], 'function',
+          null, docRegexp: 'Documentation for func'));
+      tests.add(testHover('35', 2, null, null, ['int'], isLiteral: true,
+          parameterRegexps: ['int', 'param']));
+      return Future.wait(tests);
+    });
+  }
+
+  test_getHover_noInfo() {
+    String filename = 'test.dart';
+    String pathname = normalizePath(filename);
+    String text =
+        r'''
+main() {
+  // no code
+}
+''';
+    writeFile(filename, text);
+    setAnalysisRoots(['']);
+
+    // Note: analysis.getHover doesn't wait for analysis to complete--it simply
+    // returns the latest results that are available at the time that the
+    // request is made.  So wait for analysis to finish before testing anything.
+    return analysisFinished.then((_) {
+      return server.send(ANALYSIS_GET_HOVER, {
+              'file': pathname,
+              'offset': text.indexOf('no code')
+            }).then((result) {
+              expect(result, isAnalysisGetHoverResult);
+              expect(result['hovers'], hasLength(0));
+      });
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(AnalysisDomainIntegrationTest);
+}
diff --git a/pkg/analysis_server/test/integration/analysis_error_inttest.dart b/pkg/analysis_server/test/integration/analysis_error_inttest.dart
new file mode 100644
index 0000000..d43090b
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis_error_inttest.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2014, 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.integration.analysis.error;
+
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'integration_tests.dart';
+
+@ReflectiveTestCase()
+class AnalysisErrorIntegrationTest extends AbstractAnalysisServerIntegrationTest
+    {
+  test_detect_simple_error() {
+    writeFile('test.dart',
+        '''
+main() {
+  var x // parse error: missing ';'
+}''');
+    setAnalysisRoots(['']);
+    return analysisFinished.then((_) {
+      String filePath = normalizePath('test.dart');
+      expect(currentAnalysisErrors[filePath], isList);
+      List errors = currentAnalysisErrors[filePath];
+      expect(errors, hasLength(1));
+      expect(errors[0], isAnalysisError);
+      expect(errors[0]['location']['file'], equals(filePath));
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(AnalysisErrorIntegrationTest);
+}
diff --git a/pkg/analysis_server/test/integration/integration_tests.dart b/pkg/analysis_server/test/integration/integration_tests.dart
new file mode 100644
index 0000000..de0af37
--- /dev/null
+++ b/pkg/analysis_server/test/integration/integration_tests.dart
@@ -0,0 +1,624 @@
+// Copyright (c) 2014, 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.integration.analysis;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+/**
+ * Base class for analysis server integration tests.
+ */
+abstract class AbstractAnalysisServerIntegrationTest {
+  /**
+   * Connection to the analysis server.
+   */
+  Server server;
+
+  /**
+   * Temporary directory in which source files can be stored.
+   */
+  Directory sourceDirectory;
+
+  /**
+   * Map from file path to the list of analysis errors which have most recently
+   * been received for the file.
+   */
+  HashMap<String, dynamic> currentAnalysisErrors = new HashMap<String, dynamic>(
+      );
+
+  /**
+   * Write a source file with the given contents.  [relativePath]
+   * is relative to [sourceDirectory]; on Windows any forward slashes it
+   * contains are converted to backslashes.
+   *
+   * If the file didn't previously exist, it is created.  If it did, it is
+   * overwritten.
+   */
+  void writeFile(String relativePath, String contents) {
+    String absolutePath = normalizePath(relativePath);
+    new Directory(dirname(absolutePath)).createSync(recursive: true);
+    new File(absolutePath).writeAsStringSync(contents);
+  }
+
+  /**
+   * Convert the given [relativePath] to an absolute path, by interpreting it
+   * relative to [sourceDirectory].  On Windows any forward slashes in
+   * [relativePath] are converted to backslashes.
+   */
+  String normalizePath(String relativePath) {
+    return join(sourceDirectory.path, relativePath.replaceAll('/', separator));
+  }
+
+  /**
+   * Send the server an 'analysis.setAnalysisRoots' command.
+   */
+  Future setAnalysisRoots(List<String> relativeRoots) {
+    return server.send(ANALYSIS_SET_ANALYSIS_ROOTS, {
+      'included': relativeRoots.map(normalizePath).toList(),
+      'excluded': []
+    });
+  }
+
+  /**
+   * Send the server a 'server.setSubscriptions' command.
+   */
+  Future server_setSubscriptions(List<String> subscriptions) {
+    return server.send(SERVER_SET_SUBSCRIPTIONS, {
+      'subscriptions': subscriptions
+    });
+  }
+
+  /**
+   * Return a future which will complete when a 'server.status' notification is
+   * received from the server with 'analyzing' set to false.
+   *
+   * The future will only be completed by 'server.status' notifications that are
+   * received after this function call.  So it is safe to use this getter
+   * multiple times in one test; each time it is used it will wait afresh for
+   * analysis to finish.
+   */
+  Future get analysisFinished {
+    Completer completer = new Completer();
+    StreamSubscription subscription;
+    subscription = server.onNotification(SERVER_STATUS).listen((params) {
+      bool analysisComplete = false;
+      try {
+        analysisComplete = !params['analysis']['analyzing'];
+      } catch (_) {
+        // Status message was mal-formed or missing optional parameters.  That's
+        // fine, since we'll detect a mal-formed status message below.
+      }
+      if (analysisComplete) {
+        completer.complete(params);
+        subscription.cancel();
+      }
+      expect(params, isServerStatusParams);
+    });
+    return completer.future;
+  }
+
+  /**
+   * Print out any messages exchanged with the server.  If some messages have
+   * already been exchanged with the server, they are printed out immediately.
+   */
+  void debugStdio() {
+    server.debugStdio();
+  }
+
+  /**
+   * The server is automatically started before every test, and a temporary
+   * [sourceDirectory] is created.
+   */
+  Future setUp() {
+    sourceDirectory = Directory.systemTemp.createTempSync('analysisServer');
+    return Server.start().then((Server server) {
+      this.server = server;
+      server.onNotification(ANALYSIS_ERRORS).listen((params) {
+        expect(params, isMap);
+        expect(params['file'], isString);
+        currentAnalysisErrors[params['file']] = params['errors'];
+      });
+    });
+  }
+
+  /**
+   * After every test, the server stopped and [sourceDirectory] is deleted.
+   */
+  Future tearDown() {
+    return server.kill().then((_) {
+      sourceDirectory.deleteSync(recursive: true);
+    });
+  }
+}
+
+// Matchers for data types defined in the analysis server API
+// ==========================================================
+// TODO(paulberry): add more matchers.
+
+// Matchers common to all domains
+// ------------------------------
+
+const Matcher isResultResponse = const MatchesJsonObject('result response',
+    const {
+  'id': isString
+}, optionalFields: const {
+  'result': anything
+});
+
+const Matcher isError = const MatchesJsonObject('Error', const {
+  // TODO(paulberry): once we decide what the set of permitted error codes are,
+  // add validation for 'code'.
+  'code': anything,
+  'message': isString
+}, optionalFields: const {
+  // TODO(paulberry): API spec says that 'data' is required, but sometimes we
+  // don't see it (example: error "Expected parameter subscriptions to be a
+  // string list map" in response to a malformed "analysis.setSubscriptions"
+  // command).
+  'data': anything
+});
+
+const Matcher isErrorResponse = const MatchesJsonObject('error response', const
+    {
+  'id': isString,
+  'error': isError
+});
+
+const Matcher isNotification = const MatchesJsonObject('notification', const {
+  'event': isString
+}, optionalFields: const {
+  'params': isMap
+});
+
+// Matchers for specific responses and notifications
+// -------------------------------------------------
+
+// server.getVersion
+const Matcher isServerGetVersionResult = const MatchesJsonObject(
+    'server.getVersion result', const {
+  'version': isString
+});
+
+// server.status
+const Matcher isServerStatusParams = const MatchesJsonObject(
+    'server.status params', null, optionalFields: const {
+  'analysis': isAnalysisStatus
+});
+
+// analysis.getHover
+final Matcher isAnalysisGetHoverResult = new MatchesJsonObject(
+    'analysis.getHover result', {
+  'hovers': isListOf(isHoverInformation)
+});
+
+// Matchers for data types used in responses and notifications
+// -----------------------------------------------------------
+
+const Matcher isString = const isInstanceOf<String>('String');
+
+const Matcher isInt = const isInstanceOf<int>('int');
+
+const Matcher isBool = const isInstanceOf<bool>('bool');
+
+// AnalysisError
+final Matcher isAnalysisError = new MatchesJsonObject('AnalysisError', {
+  'severity': isErrorSeverity,
+  'type': isErrorType,
+  'location': isLocation,
+  'message': isString,
+}, optionalFields: {
+  'correction': isString
+});
+
+// AnalysisStatus
+const Matcher isAnalysisStatus = const MatchesJsonObject('AnalysisStatus', const
+    {
+  'analyzing': isBool
+}, optionalFields: const {
+  'analysisTarget': isString
+});
+
+// ErrorSeverity
+final Matcher isErrorSeverity = isIn(['INFO', 'WARNING', 'ERROR']);
+
+// ErrorType
+final Matcher isErrorType = isIn(['COMPILE_TIME_ERROR', 'HINT',
+    'STATIC_TYPE_WARNING', 'STATIC_WARNING', 'SYNTACTIC_ERROR', 'TODO']);
+
+// HoverInformation
+const Matcher isHoverInformation = const MatchesJsonObject('HoverInformation',
+    const {
+  'offset': isInt,
+  'length': isInt
+}, optionalFields: const {
+  'containingLibraryPath': isString,
+  'containingLibraryName': isString,
+  'dartdoc': isString,
+  'elementDescription': isString,
+  'elementKind': isString,
+  'parameter': isString,
+  'propagatedType': isString,
+  'staticType': isString
+});
+
+// Location
+const Matcher isLocation = const MatchesJsonObject('Location', const {
+  'file': isString,
+  'offset': isInt,
+  'length': isInt,
+  'startLine': isInt,
+  'startColumn': isInt
+});
+
+
+/**
+ * Type of closures used by MatchesJsonObject to record field mismatches.
+ */
+typedef Description MismatchDescriber(Description mismatchDescription, bool
+    verbose);
+
+/**
+ * Matcher that matches a JSON object, with a given set of required and
+ * optional fields, and their associated types (expressed as [Matcher]s).
+ */
+class MatchesJsonObject extends Matcher {
+  /**
+   * Short description of the expected type.
+   */
+  final String description;
+
+  /**
+   * Fields that are required to be in the JSON object, and [Matcher]s describing
+   * their expected types.
+   */
+  final Map<String, Matcher> requiredFields;
+
+  /**
+   * Fields that are optional in the JSON object, and [Matcher]s describing
+   * their expected types.
+   */
+  final Map<String, Matcher> optionalFields;
+
+  const
+      MatchesJsonObject(this.description, this.requiredFields, {this.optionalFields});
+
+  @override
+  bool matches(item, Map matchState) {
+    if (item is! Map) {
+      return false;
+    }
+    List<MismatchDescriber> mismatches = <MismatchDescriber>[];
+    if (requiredFields != null) {
+      requiredFields.forEach((String key, Matcher valueMatcher) {
+        if (!item.containsKey(key)) {
+          mismatches.add((Description mismatchDescription, bool verbose) =>
+              mismatchDescription.add('is missing field ').addDescriptionOf(key).add(' ('
+              ).addDescriptionOf(valueMatcher).add(')'));
+        } else {
+          _checkField(key, item[key], valueMatcher, mismatches);
+        }
+      });
+    }
+    item.forEach((key, value) {
+      if (requiredFields != null && requiredFields.containsKey(key)) {
+        // Already checked this field
+      } else if (optionalFields != null && optionalFields.containsKey(key)) {
+        _checkField(key, value, optionalFields[key], mismatches);
+      } else {
+        mismatches.add((Description mismatchDescription, bool verbose) =>
+            mismatchDescription.add('has unexpected field ').addDescriptionOf(key));
+      }
+    });
+    if (mismatches.isEmpty) {
+      return true;
+    } else {
+      addStateInfo(matchState, {
+        'mismatches': mismatches
+      });
+      return false;
+    }
+  }
+
+  @override
+  Description describe(Description description) => description.add(
+      this.description);
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription, Map
+      matchState, bool verbose) {
+    List<MismatchDescriber> mismatches = matchState['mismatches'];
+    if (mismatches != null) {
+      for (int i = 0; i < mismatches.length; i++) {
+        MismatchDescriber mismatch = mismatches[i];
+        if (i > 0) {
+          if (mismatches.length == 2) {
+            mismatchDescription = mismatchDescription.add(' and ');
+          } else if (i == mismatches.length - 1) {
+            mismatchDescription = mismatchDescription.add(', and ');
+          } else {
+            mismatchDescription = mismatchDescription.add(', ');
+          }
+        }
+        mismatchDescription = mismatch(mismatchDescription, verbose);
+      }
+      return mismatchDescription;
+    } else {
+      return super.describeMismatch(item, mismatchDescription, matchState,
+          verbose);
+    }
+  }
+
+  /**
+   * Check the type of a field called [key], having value [value], using
+   * [valueMatcher].  If it doesn't match, record a closure in [mismatches]
+   * which can describe the mismatch.
+   */
+  void _checkField(String key, value, Matcher
+      valueMatcher, List<MismatchDescriber> mismatches) {
+    Map subState = {};
+    if (!valueMatcher.matches(value, subState)) {
+      mismatches.add((Description mismatchDescription, bool verbose) {
+        mismatchDescription = mismatchDescription.add(
+            'contains malformed field ').addDescriptionOf(key).add(' (should be '
+            ).addDescriptionOf(valueMatcher);
+        String subDescription = valueMatcher.describeMismatch(value,
+            new StringDescription(), subState, false).toString();
+        if (subDescription.isNotEmpty) {
+          mismatchDescription = mismatchDescription.add('; ').add(subDescription
+              );
+        }
+        return mismatchDescription.add(')');
+      });
+    }
+  }
+}
+
+/**
+ * Matcher that matches a list of objects, each of which satisfies the given
+ * matcher.
+ */
+class _ListOf extends Matcher {
+  /**
+   * Matcher which every element of the list must satisfy.
+   */
+  final Matcher elementMatcher;
+
+  /**
+   * Iterable matcher which we use to test the contents of the list.
+   */
+  final Matcher iterableMatcher;
+
+  _ListOf(elementMatcher)
+      : elementMatcher = elementMatcher,
+        iterableMatcher = everyElement(elementMatcher);
+
+  @override
+  bool matches(item, Map matchState) {
+    if (item is! List) {
+      return false;
+    }
+    return iterableMatcher.matches(item, matchState);
+  }
+
+  @override
+  Description describe(Description description) => description.add('List of '
+      ).addDescriptionOf(elementMatcher);
+
+  @override
+  Description describeMismatch(item, Description mismatchDescription, Map
+      matchState, bool verbose) {
+    if (item is! List) {
+      return super.describeMismatch(item, mismatchDescription, matchState,
+          verbose);
+    } else {
+      return iterableMatcher.describeMismatch(item, mismatchDescription,
+          matchState, verbose);
+    }
+  }
+}
+
+Matcher isListOf(Matcher elementMatcher) => new _ListOf(elementMatcher);
+
+/**
+ * Instances of the class [Server] manage a connection to a server process, and
+ * facilitate communication to and from the server.
+ */
+class Server {
+  /**
+   * Server process object.
+   */
+  Process _process;
+
+  /**
+   * Commands that have been sent to the server but not yet acknowledged, and
+   * the [Completer] objects which should be completed when acknowledgement is
+   * received.
+   */
+  final HashMap<String, Completer> _pendingCommands = <String, Completer> {};
+
+  /**
+   * Number which should be used to compute the 'id' to send in the next command
+   * sent to the server.
+   */
+  int _nextId = 0;
+
+  /**
+   * [StreamController]s to which notifications should be sent, organized by
+   * event type.
+   */
+  final HashMap<String, StreamController> _notificationControllers =
+      new HashMap<String, StreamController>();
+
+  /**
+   * [Stream]s associated with the controllers in [_notificationControllers],
+   * but converted to broadcast streams.
+   */
+  final HashMap<String, Stream> _notificationStreams = new HashMap<String,
+      Stream>();
+
+  /**
+   * Messages which have been exchanged with the server; we buffer these
+   * up until the test finishes, so that they can be examined in the debugger
+   * or printed out in response to a call to [debugStdio].
+   */
+  final List<String> _recordedStdio = <String>[];
+
+  /**
+   * True if we are currently printing out messages exchanged with the server.
+   */
+  bool _debuggingStdio = false;
+
+  Server._(this._process);
+
+  /**
+   * Get a stream which will receive notifications of the given event type.
+   * The values delivered to the stream will be the contents of the 'params'
+   * field of the notification message.
+   */
+  Stream onNotification(String event) {
+    Stream notificationStream = _notificationStreams[event];
+    if (notificationStream == null) {
+      StreamController notificationController = new StreamController();
+      _notificationControllers[event] = notificationController;
+      notificationStream = notificationController.stream.asBroadcastStream();
+      _notificationStreams[event] = notificationStream;
+    }
+    return notificationStream;
+  }
+
+  /**
+   * Start the server.  If [debugServer] is true, the server will be started
+   * with "--debug", allowing a debugger to be attached.
+   */
+  static Future<Server> start({bool debugServer: false}) {
+    String dartBinary = Platform.executable;
+    String serverPath = normalize(join(dirname(Platform.script.path), '..',
+        '..', 'bin', 'server.dart'));
+    List<String> arguments = [];
+    if (debugServer) {
+      arguments.add('--debug');
+    }
+    arguments.add(serverPath);
+    return Process.start(dartBinary, arguments).then((Process process) {
+      Server server = new Server._(process);
+      process.stdout.transform((new Utf8Codec()).decoder).transform(
+          new LineSplitter()).listen((String line) {
+        String trimmedLine = line.trim();
+        server._recordStdio('RECV: $trimmedLine');
+        var message = JSON.decoder.convert(trimmedLine);
+        expect(message, isMap);
+        Map messageAsMap = message;
+        if (messageAsMap.containsKey('id')) {
+          expect(messageAsMap['id'], isString);
+          String id = message['id'];
+          Completer completer = server._pendingCommands[id];
+          if (completer == null) {
+            fail('Unexpected response from server: id=$id');
+          } else {
+            server._pendingCommands.remove(id);
+          }
+          if (messageAsMap.containsKey('error')) {
+            // TODO(paulberry): propagate the error info to the completer.
+            completer.completeError(new UnimplementedError(
+                'Server responded with an error'));
+            // Check that the message is well-formed.  We do this after calling
+            // completer.completeError() so that we don't stall the test in the
+            // event of an error.
+            expect(message, isErrorResponse);
+          } else {
+            completer.complete(messageAsMap['result']);
+            // Check that the message is well-formed.  We do this after calling
+            // completer.complete() so that we don't stall the test in the
+            // event of an error.
+            expect(message, isResultResponse);
+          }
+        } else {
+          // Message is a notification.  It should have an event and possibly
+          // params.
+          expect(messageAsMap, contains('event'));
+          expect(messageAsMap['event'], isString);
+          String event = messageAsMap['event'];
+          StreamController notificationController =
+              server._notificationControllers[event];
+          if (notificationController != null) {
+            notificationController.add(messageAsMap['params']);
+          }
+          // Check that the message is well-formed.  We do this after calling
+          // notificationController.add() so that we don't stall the test in the
+          // event of an error.
+          expect(message, isNotification);
+        }
+      });
+      process.stderr.listen((List<int> data) {
+        fail('Unexpected output from stderr');
+      });
+      return server;
+    });
+  }
+
+  /**
+   * Stop the server.
+   */
+  Future kill() {
+    _process.kill();
+    return _process.exitCode;
+  }
+
+  /**
+   * Send a command to the server.  An 'id' will be automatically assigned.
+   * The returned [Future] will be completed when the server acknowledges the
+   * command with a response.  If the server acknowledges the command with a
+   * normal (non-error) response, the future will be completed with the 'result'
+   * field from the response.  If the server acknowledges the command with an
+   * error response, the future will be completed with an error.
+   */
+  Future send(String method, Map<String, dynamic> params) {
+    String id = '${_nextId++}';
+    Map<String, dynamic> command = <String, dynamic> {
+      'id': id,
+      'method': method
+    };
+    if (params != null) {
+      command['params'] = params;
+    }
+    Completer completer = new Completer();
+    _pendingCommands[id] = completer;
+    String line = JSON.encode(command);
+    _recordStdio('SEND: $line');
+    _process.stdin.add(UTF8.encoder.convert("${line}\n"));
+    return completer.future;
+  }
+
+  /**
+   * Print out any messages exchanged with the server.  If some messages have
+   * already been exchanged with the server, they are printed out immediately.
+   */
+  void debugStdio() {
+    if (_debuggingStdio) {
+      return;
+    }
+    _debuggingStdio = true;
+    for (String line in _recordedStdio) {
+      print(line);
+    }
+  }
+
+  /**
+   * Record a message that was exchanged with the server, and print it out if
+   * [debugStdio] has been called.
+   */
+  void _recordStdio(String line) {
+    if (_debuggingStdio) {
+      print(line);
+    }
+    _recordedStdio.add(line);
+  }
+}
diff --git a/pkg/analysis_server/test/integration/server_domain_inttest.dart b/pkg/analysis_server/test/integration/server_domain_inttest.dart
new file mode 100644
index 0000000..8b8c6a2
--- /dev/null
+++ b/pkg/analysis_server/test/integration/server_domain_inttest.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2014, 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.integration.server.domain;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'integration_tests.dart';
+
+@ReflectiveTestCase()
+class ServerDomainIntegrationTest extends AbstractAnalysisServerIntegrationTest
+    {
+  test_getVersion() {
+    return server.send('server.getVersion', null).then((response) {
+      expect(response, isServerGetVersionResult);
+    });
+  }
+
+  fail_test_shutdown() {
+    // TODO(paulberry): fix the server so that it passes this test.
+    return server.send(SERVER_SHUTDOWN, null).then((response) {
+      expect(response, isNull);
+      return new Future.delayed(new Duration(seconds: 1)).then((_) {
+        server.send(SERVER_GET_VERSION, null).then((_) {
+          fail('Server still alive after server.shutdown');
+        });
+        // Give the server time to respond before terminating the test.
+        return new Future.delayed(new Duration(seconds: 1));
+      });
+    });
+  }
+
+  fail_test_setSubscriptions() {
+    // TODO(paulberry): fix the server so that it passes this test.
+    bool statusReceived = false;
+    Completer analysisBegun = new Completer();
+    server.onNotification(SERVER_STATUS).listen((_) {
+      statusReceived = true;
+    });
+    server.onNotification(ANALYSIS_ERRORS).listen((_) {
+      if (!analysisBegun.isCompleted) {
+        analysisBegun.complete();
+      }
+    });
+    return server_setSubscriptions([]).then((response) {
+      expect(response, isNull);
+      writeFile('test.dart', '''
+main() {
+  var x;
+}''');
+      setAnalysisRoots(['']);
+      // Analysis should begin, but no server.status notification should be
+      // received.
+      return analysisBegun.future.then((_) {
+        expect(statusReceived, isFalse);
+        return server_setSubscriptions(['STATUS']).then((_) {
+          // Tickle test.dart just in case analysis has already completed.
+          writeFile('test.dart', '''
+main() {
+  var y;
+}''');
+          // Analysis should eventually complete, and we should be notified
+          // about it.
+          return analysisFinished;
+        });
+      });
+    });
+  }
+
+  test_setSubscriptions_invalidService() {
+    // TODO(paulberry): verify that if an invalid service is specified, the
+    // current subscriptions are unchanged.
+    return server_setSubscriptions(['bogus']).then((_) {
+      fail('setSubscriptions should have produced an error');
+    }, onError: (error) {
+      // The expected error occurred.
+    });
+  }
+
+  test_connected() {
+    Completer receivedConnected = new Completer();
+    server.onNotification(SERVER_CONNECTED).listen((params) {
+      expect(receivedConnected.isCompleted, isFalse);
+      receivedConnected.complete();
+      expect(params, isNull);
+    });
+    return receivedConnected.future;
+  }
+
+  test_error() {
+    // TODO(paulberry): how do we test the 'server.error' notification given
+    // that this notification should only occur in the event of a server bug?
+  }
+
+  test_status() {
+    // TODO(paulberry): spec says that server.status is not subscribed to by
+    // default, but currently it's behaving as though it is.
+
+    // After we kick off analysis, we should get one server.status message with
+    // analyzing=true, and another server.status message after that with
+    // analyzing=false.
+    Completer analysisBegun = new Completer();
+    Completer analysisFinished = new Completer();
+    server.onNotification(SERVER_STATUS).listen((params) {
+      expect(params, isServerStatusParams);
+      if (params['analysis'] != null) {
+        if (params['analysis']['analyzing']) {
+          expect(analysisBegun.isCompleted, isFalse);
+          analysisBegun.complete();
+        } else {
+          expect(analysisFinished.isCompleted, isFalse);
+          analysisFinished.complete();
+        }
+      }
+    });
+    writeFile('test.dart', '''
+main() {
+  var x;
+}''');
+    setAnalysisRoots(['']);
+    expect(analysisBegun.isCompleted, isFalse);
+    expect(analysisFinished.isCompleted, isFalse);
+    return analysisBegun.future.then((_) {
+      expect(analysisFinished.isCompleted, isFalse);
+      return analysisFinished.future;
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(ServerDomainIntegrationTest);
+}
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
new file mode 100644
index 0000000..093bfed
--- /dev/null
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2014, 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:unittest/unittest.dart';
+
+import 'analysis_domain_inttest.dart' as analysis_domain_inttest;
+import 'analysis_error_inttest.dart' as analysis_error_inttest;
+import 'server_domain_inttest.dart' as server_domain_inttest;
+
+/**
+ * Utility for manually running all integration tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('analysis_server_integration', () {
+    analysis_domain_inttest.main();
+    analysis_error_inttest.main();
+    server_domain_inttest.main();
+  });
+}
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index a27a3e2..917da7e 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -245,18 +245,22 @@
   @override
   bool matches(item, Map matchState) {
     Response response = item;
-    return response.id == _id && response.error == null;
+    return response != null && response.id == _id && response.error == null;
   }
 
   @override
   Description describeMismatch(item, Description mismatchDescription,
                                Map matchState, bool verbose) {
     Response response = item;
-    var id = response.id;
-    RequestError error = response.error;
-    mismatchDescription.add('has identifier "$id"');
-    if (error != null) {
-      mismatchDescription.add(' and has error $error');
+    if (response == null) {
+      mismatchDescription.add('is null response');
+    } else {
+      var id = response.id;
+      RequestError error = response.error;
+      mismatchDescription.add('has identifier "$id"');
+      if (error != null) {
+        mismatchDescription.add(' and has error $error');
+      }
     }
     return mismatchDescription;
   }
diff --git a/pkg/analysis_server/test/operation/operation_analysis_test.dart b/pkg/analysis_server/test/operation/operation_analysis_test.dart
index c5f5378..aad7147 100644
--- a/pkg/analysis_server/test/operation/operation_analysis_test.dart
+++ b/pkg/analysis_server/test/operation/operation_analysis_test.dart
@@ -56,7 +56,6 @@
   void test_noCorrection() {
     Map<String, Object> json = errorToJson(lineInfo, analysisError);
     expect(json, {
-      ERROR_CODE: 'CompileTimeErrorCode.AMBIGUOUS_EXPORT',
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
       LOCATION: {
@@ -73,7 +72,6 @@
   void test_noLineInfo() {
     Map<String, Object> json = errorToJson(null, analysisError);
     expect(json, {
-      ERROR_CODE: 'CompileTimeErrorCode.AMBIGUOUS_EXPORT',
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
       LOCATION: {
@@ -89,7 +87,6 @@
     when(analysisError.correction).thenReturn('my correction');
     Map<String, Object> json = errorToJson(lineInfo, analysisError);
     expect(json, {
-      ERROR_CODE: 'CompileTimeErrorCode.AMBIGUOUS_EXPORT',
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
       LOCATION: {
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 9e6036b..8813a68 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -9,6 +9,7 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_testing/reflective_tests.dart';
 import 'package:unittest/unittest.dart';
+import 'package:analysis_server/src/collections.dart';
 
 
 Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
@@ -105,6 +106,40 @@
       'event': 'foo'
     }));
   }
+
+  void test_setParameter_HasToJson() {
+    Notification notification = new Notification('foo');
+    notification.setParameter('my', new _MyHasToJsonObject(42));
+    expect(notification.toJson(), equals({
+      'event': 'foo',
+      'params': {
+        'my': {
+          'offset': 42
+        }
+      }
+    }));
+  }
+
+  void test_setParameter_Iterable_HasToJson() {
+    Notification notification = new Notification('foo');
+    notification.setParameter('my', [
+      new _MyHasToJsonObject(1),
+      new _MyHasToJsonObject(2),
+      new _MyHasToJsonObject(3)]);
+    expect(notification.toJson(), equals({
+      'event': 'foo',
+      'params': {
+        'my': [{'offset': 1}, {'offset': 2}, {'offset': 3}]
+      }
+    }));
+  }
+}
+
+
+class _MyHasToJsonObject implements HasToJson {
+  int offset;
+  _MyHasToJsonObject(this.offset);
+  Map<String, Object> toJson() => {'offset': offset};
 }
 
 
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
new file mode 100644
index 0000000..5464311
--- /dev/null
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2014, 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.search.abstract_search_domain;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_domain.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_services/index/index.dart' show Index;
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:unittest/unittest.dart';
+
+import '../analysis_abstract.dart';
+
+
+class AbstractSearchDomainTest extends AbstractAnalysisTest {
+  String searchId;
+  bool searchDone = false;
+  List<SearchResult> results = <SearchResult>[];
+  SearchResult result;
+
+  void assertHasResult(SearchResultKind kind, String search, [int length]) {
+    int offset = findOffset(search);
+    if (length == null) {
+      length = findIdentifierLength(search);
+    }
+    findResult(kind, testFile, offset, length, true);
+  }
+
+  void assertNoResult(SearchResultKind kind, String search, [int length]) {
+    int offset = findOffset(search);
+    if (length == null) {
+      length = findIdentifierLength(search);
+    }
+    findResult(kind, testFile, offset, length, false);
+  }
+
+  @override
+  Index createIndex() {
+    return createLocalMemoryIndex();
+  }
+
+  void findResult(SearchResultKind kind, String file, int offset, int length,
+      bool expected) {
+    for (SearchResult result in results) {
+      Location location = result.location;
+      if (result.kind == kind &&
+          location.file == file &&
+          location.offset == offset &&
+          location.length == length) {
+        if (!expected) {
+          fail('Unexpected result $result in\n' + results.join('\n'));
+        }
+        this.result = result;
+        return;
+      }
+    }
+    if (expected) {
+      fail(
+          'Not found: "search" kind=$kind offset=$offset length=$length\nin\n' +
+              results.join('\n'));
+    }
+  }
+
+  String getPathString(List<Element> path) {
+    return path.map((Element element) {
+      return '${element.kind} ${element.name}';
+    }).join('\n');
+  }
+
+  @override
+  void processNotification(Notification notification) {
+    if (notification.event == SEARCH_RESULTS) {
+      String id = notification.getParameter(ID);
+      if (id == searchId) {
+        for (Map<String, Object> json in notification.getParameter(RESULTS)) {
+          results.add(new SearchResult.fromJson(json));
+        }
+        searchDone = notification.getParameter(LAST);
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+    handler = new SearchDomainHandler(server);
+  }
+
+  Future waitForSearchResults() {
+    if (searchDone) {
+      return new Future.value();
+    }
+    return new Future.delayed(Duration.ZERO, waitForSearchResults);
+  }
+}
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
new file mode 100644
index 0000000..e60eab7
--- /dev/null
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -0,0 +1,588 @@
+// Copyright (c) 2014, 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.search.element_references;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_search_domain.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('findElementReferences', () {
+    runReflectiveTests(ElementReferencesTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class ElementReferencesTest extends AbstractSearchDomainTest {
+  Element searchElement;
+
+  Future findElementReferences(String search, bool includePotential) {
+    int offset = findOffset(search);
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES);
+      request.setParameter(FILE, testFile);
+      request.setParameter(OFFSET, offset);
+      request.setParameter(INCLUDE_POTENTIAL, includePotential);
+      Response response = handleSuccessfulRequest(request);
+      searchId = response.getResult(ID);
+      searchElement = response.getResult(ELEMENT);
+      results.clear();
+      return waitForSearchResults();
+    });
+  }
+
+  test_constructor_named() {
+    addTestFile('''
+class A {
+  A.named(p);
+}
+main() {
+  new A.named(1);
+  new A.named(2);
+}
+''');
+    return findElementReferences('named(p)', false).then((_) {
+      expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+      assertHasResult(SearchResultKind.REFERENCE, '.named(1)', 6);
+      assertHasResult(SearchResultKind.REFERENCE, '.named(2)', 6);
+    });
+  }
+
+  test_constructor_unamed() {
+    addTestFile('''
+class A {
+  A(p);
+}
+main() {
+  new A(1);
+  new A(2);
+}
+''');
+    return findElementReferences('A(p)', false).then((_) {
+      expect(searchElement.kind, ElementKind.CONSTRUCTOR);
+      assertHasResult(SearchResultKind.REFERENCE, '(1)', 0);
+      assertHasResult(SearchResultKind.REFERENCE, '(2)', 0);
+    });
+  }
+
+  test_field_explicit() {
+    addTestFile('''
+class A {
+  var fff; // declaration
+  A(this.fff); // in constructor
+  m() {
+    fff = 2;
+    fff += 3;
+    print(fff); // in m()
+    fff(); // in m()
+  }
+}
+main(A a) {
+  a.fff = 20;
+  a.fff += 30;
+  print(a.fff); // in main()
+  a.fff(); // in main()
+}
+''');
+    return findElementReferences('fff; // declaration', false).then((_) {
+      expect(searchElement.kind, ElementKind.FIELD);
+      expect(results, hasLength(10));
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration');
+      assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor');
+      // m()
+      assertHasResult(SearchResultKind.WRITE, 'fff = 2;');
+      assertHasResult(SearchResultKind.WRITE, 'fff += 3;');
+      assertHasResult(SearchResultKind.READ, 'fff); // in m()');
+      assertHasResult(SearchResultKind.INVOCATION, 'fff(); // in m()');
+      // main()
+      assertHasResult(SearchResultKind.WRITE, 'fff = 20;');
+      assertHasResult(SearchResultKind.WRITE, 'fff += 30;');
+      assertHasResult(SearchResultKind.READ, 'fff); // in main()');
+      assertHasResult(SearchResultKind.INVOCATION, 'fff(); // in main()');
+    });
+  }
+
+  test_field_implicit() {
+    addTestFile('''
+class A {
+  var  get fff => null;
+  void set fff(x) {}
+  m() {
+    print(fff); // in m()
+    fff = 1;
+  }
+}
+main(A a) {
+  print(a.fff); // in main()
+  a.fff = 10;
+}
+''');
+    var forGetter = findElementReferences('fff =>', false).then((_) {
+      expect(searchElement.kind, ElementKind.FIELD);
+      expect(results, hasLength(4));
+      assertHasResult(SearchResultKind.READ, 'fff); // in m()');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
+      assertHasResult(SearchResultKind.READ, 'fff); // in main()');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
+    });
+    var forSetter = findElementReferences('fff(x) {}', false).then((_) {
+      expect(results, hasLength(4));
+      assertHasResult(SearchResultKind.READ, 'fff); // in m()');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 1;');
+      assertHasResult(SearchResultKind.READ, 'fff); // in main()');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
+    });
+    return Future.wait([forGetter, forSetter]);
+  }
+
+  test_field_inFormalParameter() {
+    addTestFile('''
+class A {
+  var fff; // declaration
+  A(this.fff); // in constructor
+  m() {
+    fff = 2;
+    print(fff); // in m()
+  }
+}
+''');
+    return findElementReferences('fff); // in constructor', false).then((_) {
+      expect(searchElement.kind, ElementKind.FIELD);
+      expect(results, hasLength(4));
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration');
+      assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 2;');
+      assertHasResult(SearchResultKind.READ, 'fff); // in m()');
+    });
+  }
+
+  test_function() {
+    addTestFile('''
+fff(p) {}
+main() {
+  fff(1);
+  print(fff);
+}
+''');
+    return findElementReferences('fff(p) {}', false).then((_) {
+      expect(searchElement.kind, ElementKind.FUNCTION);
+      expect(results, hasLength(2));
+      assertHasResult(SearchResultKind.INVOCATION, 'fff(1)');
+      assertHasResult(SearchResultKind.REFERENCE, 'fff);');
+    });
+  }
+
+  test_hierarchy_field_explicit() {
+    addTestFile('''
+class A {
+  int fff; // in A
+}
+class B extends A {
+  int fff; // in B
+}
+class C extends B {
+  int fff; // in C
+}
+main(A a, B b, C c) {
+  a.fff = 10;
+  b.fff = 20;
+  c.fff = 30;
+}
+''');
+    return findElementReferences('fff; // in B', false).then((_) {
+      expect(searchElement.kind, ElementKind.FIELD);
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in A');
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in B');
+      assertHasResult(SearchResultKind.DECLARATION, 'fff; // in C');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 10;');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 20;');
+      assertHasResult(SearchResultKind.WRITE, 'fff = 30;');
+    });
+  }
+
+  test_hierarchy_method() {
+    addTestFile('''
+class A {
+  mmm() {} // in A
+}
+class B extends A {
+  mmm() {} // in B
+}
+class C extends B {
+  mmm() {} // in C
+}
+main(A a, B b, C c) {
+  a.mmm(10);
+  b.mmm(20);
+  c.mmm(30);
+}
+''');
+    return findElementReferences('mmm() {} // in B', false).then((_) {
+      expect(searchElement.kind, ElementKind.METHOD);
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)');
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)');
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)');
+    });
+  }
+
+  test_localVariable() {
+    addTestFile('''
+main() {
+  var vvv = 1;
+  print(vvv);
+  vvv += 3;
+  vvv = 2;
+  vvv();
+}
+''');
+    return findElementReferences('vvv = 1', false).then((_) {
+      expect(searchElement.kind, ElementKind.LOCAL_VARIABLE);
+      expect(results, hasLength(5));
+      assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1');
+      assertHasResult(SearchResultKind.READ, 'vvv);');
+      assertHasResult(SearchResultKind.READ_WRITE, 'vvv += 3');
+      assertHasResult(SearchResultKind.WRITE, 'vvv = 2');
+      assertHasResult(SearchResultKind.INVOCATION, 'vvv();');
+    });
+  }
+
+  test_method() {
+    addTestFile('''
+class A {
+  mmm(p) {}
+  m() {
+    mmm(1);
+    print(mmm); // in m()
+  }
+}
+main(A a) {
+  a.mmm(10);
+  print(a.mmm); // in main()
+}
+''');
+    return findElementReferences('mmm(p) {}', false).then((_) {
+      expect(searchElement.kind, ElementKind.METHOD);
+      expect(results, hasLength(4));
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(1);');
+      assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in m()');
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);');
+      assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in main()');
+    });
+  }
+
+  test_method_propagatedType() {
+    addTestFile('''
+class A {
+  mmm(p) {}
+}
+main() {
+  var a = new A();
+  a.mmm(10);
+  print(a.mmm);
+}
+''');
+    return findElementReferences('mmm(p) {}', false).then((_) {
+      expect(searchElement.kind, ElementKind.METHOD);
+      expect(results, hasLength(2));
+      assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);');
+      assertHasResult(SearchResultKind.REFERENCE, 'mmm);');
+    });
+  }
+
+  test_oneUnit_twoLibraries() {
+    var pathA = '/project/bin/libA.dart';
+    var pathB = '/project/bin/libB.dart';
+    var codeA = '''
+library lib;
+part 'test.dart';
+main() {
+  fff(1);
+}
+''';
+    var codeB = '''
+library lib;
+part 'test.dart';
+main() {
+  fff(2);
+}
+''';
+    addFile(pathA, codeA);
+    addFile(pathB, codeB);
+    addTestFile('''
+part of lib;
+fff(p) {}
+''');
+    return findElementReferences('fff(p) {}', false).then((_) {
+      expect(searchElement.kind, ElementKind.FUNCTION);
+      expect(results, hasLength(2));
+      findResult(
+          SearchResultKind.INVOCATION,
+          pathA,
+          codeA.indexOf('fff(1)'),
+          3,
+          true);
+      findResult(
+          SearchResultKind.INVOCATION,
+          pathB,
+          codeB.indexOf('fff(2)'),
+          3,
+          true);
+    });
+  }
+
+  test_oneUnit_zeroLibraries() {
+    addTestFile('''
+part of lib;
+fff(p) {}
+main() {
+  fff(10);
+}
+''');
+    return findElementReferences('fff(p) {}', false).then((_) {
+      expect(results, isEmpty);
+    });
+  }
+
+  test_parameter() {
+    addTestFile('''
+main(ppp) {
+  print(ppp);
+  ppp += 3;
+  ppp = 2;
+  ppp();
+}
+''');
+    return findElementReferences('ppp) {', false).then((_) {
+      expect(searchElement.kind, ElementKind.PARAMETER);
+      expect(results, hasLength(5));
+      assertHasResult(SearchResultKind.DECLARATION, 'ppp) {');
+      assertHasResult(SearchResultKind.READ, 'ppp);');
+      assertHasResult(SearchResultKind.READ_WRITE, 'ppp += 3');
+      assertHasResult(SearchResultKind.WRITE, 'ppp = 2');
+      assertHasResult(SearchResultKind.INVOCATION, 'ppp();');
+    });
+  }
+
+  test_path_inConstructor_named() {
+    addTestFile('''
+library my_lib;
+class A {}
+class B {
+  B.named() {
+    A a = null;
+  }
+}
+''');
+    return findElementReferences('A {}', false).then((_) {
+      assertHasResult(SearchResultKind.REFERENCE, 'A a = null;');
+      expect(getPathString(result.path), '''
+LOCAL_VARIABLE a
+CONSTRUCTOR named
+CLASS B
+COMPILATION_UNIT test.dart
+LIBRARY my_lib''');
+    });
+  }
+
+  test_path_inConstructor_unnamed() {
+    addTestFile('''
+library my_lib;
+class A {}
+class B {
+  B() {
+    A a = null;
+  }
+}
+''');
+    return findElementReferences('A {}', false).then((_) {
+      assertHasResult(SearchResultKind.REFERENCE, 'A a = null;');
+      expect(getPathString(result.path), '''
+LOCAL_VARIABLE a
+CONSTRUCTOR 
+CLASS B
+COMPILATION_UNIT test.dart
+LIBRARY my_lib''');
+    });
+  }
+
+  test_path_inFunction() {
+    addTestFile('''
+library my_lib;
+class A {}
+main() {
+  A a = null;
+}
+''');
+    return findElementReferences('A {}', false).then((_) {
+      assertHasResult(SearchResultKind.REFERENCE, 'A a = null;');
+      expect(getPathString(result.path), '''
+LOCAL_VARIABLE a
+FUNCTION main
+COMPILATION_UNIT test.dart
+LIBRARY my_lib''');
+    });
+  }
+
+  test_potential_disabled() {
+    addTestFile('''
+class A {
+  test(p) {}
+}
+main(A a, p) {
+  a.test(1);
+  p.test(2);
+}
+''');
+    return findElementReferences('test(p) {}', false).then((_) {
+      assertHasResult(SearchResultKind.INVOCATION, 'test(1);');
+      assertNoResult(SearchResultKind.INVOCATION, 'test(2);');
+    });
+  }
+
+  test_potential_field() {
+    addTestFile('''
+class A {
+  var test; // declaration
+}
+main(A a, p) {
+  a.test = 1;
+  p.test = 2;
+  print(p.test); // p
+}
+''');
+    return findElementReferences('test; // declaration', true).then((_) {
+      {
+        assertHasResult(SearchResultKind.WRITE, 'test = 1;');
+        expect(result.isPotential, isFalse);
+      }
+      {
+        assertHasResult(SearchResultKind.WRITE, 'test = 2;');
+        expect(result.isPotential, isTrue);
+      }
+      {
+        assertHasResult(SearchResultKind.READ, 'test); // p');
+        expect(result.isPotential, isTrue);
+      }
+    });
+  }
+
+  test_potential_method() {
+    addTestFile('''
+class A {
+  test(p) {}
+}
+main(A a, p) {
+  a.test(1);
+  p.test(2);
+}
+''');
+    return findElementReferences('test(p) {}', true).then((_) {
+      {
+        assertHasResult(SearchResultKind.INVOCATION, 'test(1);');
+        expect(result.isPotential, isFalse);
+      }
+      {
+        assertHasResult(SearchResultKind.INVOCATION, 'test(2);');
+        expect(result.isPotential, isTrue);
+      }
+    });
+  }
+
+  test_topLevelVariable_explicit() {
+    addTestFile('''
+var vvv = 1;
+main() {
+  print(vvv);
+  vvv += 3;
+  vvv = 2;
+  vvv();
+}
+''');
+    return findElementReferences('vvv = 1', false).then((_) {
+      expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE);
+      expect(results, hasLength(5));
+      assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1;');
+      assertHasResult(SearchResultKind.READ, 'vvv);');
+      assertHasResult(SearchResultKind.WRITE, 'vvv += 3');
+      assertHasResult(SearchResultKind.WRITE, 'vvv = 2');
+      assertHasResult(SearchResultKind.INVOCATION, 'vvv();');
+    });
+  }
+
+  test_topLevelVariable_implicit() {
+    addTestFile('''
+get vvv => null;
+set vvv(x) {}
+main() {
+  print(vvv);
+  vvv = 1;
+}
+''');
+    var forGetter = findElementReferences('vvv =>', false).then((_) {
+      expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE);
+      expect(results, hasLength(2));
+      assertHasResult(SearchResultKind.READ, 'vvv);');
+      assertHasResult(SearchResultKind.WRITE, 'vvv = 1;');
+    });
+    var forSetter = findElementReferences('vvv(x) {}', false).then((_) {
+      expect(results, hasLength(2));
+      assertHasResult(SearchResultKind.READ, 'vvv);');
+      assertHasResult(SearchResultKind.WRITE, 'vvv = 1;');
+    });
+    return Future.wait([forGetter, forSetter]);
+  }
+
+  test_typeReference_class() {
+    addTestFile('''
+main() {
+  int a = 1;
+  int b = 2;
+}
+''');
+    return findElementReferences('int a', false).then((_) {
+      expect(searchElement.kind, ElementKind.CLASS);
+      assertHasResult(SearchResultKind.REFERENCE, 'int a');
+      assertHasResult(SearchResultKind.REFERENCE, 'int b');
+    });
+  }
+
+  test_typeReference_functionType() {
+    addTestFile('''
+typedef F();
+main(F f) {
+}
+''');
+    return findElementReferences('F()', false).then((_) {
+      expect(searchElement.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+      expect(results, hasLength(1));
+      assertHasResult(SearchResultKind.REFERENCE, 'F f');
+    });
+  }
+
+  test_typeReference_typeVariable() {
+    addTestFile('''
+class A<T> {
+  T f;
+  T m() => null;
+}
+''');
+    return findElementReferences('T> {', false).then((_) {
+      expect(searchElement.kind, ElementKind.TYPE_PARAMETER);
+      expect(results, hasLength(2));
+      assertHasResult(SearchResultKind.REFERENCE, 'T f;');
+      assertHasResult(SearchResultKind.REFERENCE, 'T m()');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
new file mode 100644
index 0000000..bad6bc5
--- /dev/null
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2014, 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.search.member_declarations;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_search_domain.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('findMemberDeclarations', () {
+    runReflectiveTests(MemberDeclarationsTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class MemberDeclarationsTest extends AbstractSearchDomainTest {
+  void assertHasDeclaration(ElementKind kind, String className) {
+    result = findTopLevelResult(kind, className);
+    if (result == null) {
+      fail('Not found: kind=$kind in="$className"\nin\n' + results.join('\n'));
+    }
+  }
+
+  void assertNoDeclaration(ElementKind kind, String className) {
+    result = findTopLevelResult(kind, className);
+    if (result != null) {
+      fail('Unexpected: kind=$kind in="$className"\nin\n' + results.join('\n'));
+    }
+  }
+
+  Future findMemberDeclarations(String name) {
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', SEARCH_FIND_MEMBER_DECLARATIONS);
+      request.setParameter(NAME, name);
+      Response response = handleSuccessfulRequest(request);
+      searchId = response.getResult(ID);
+      results.clear();
+      return waitForSearchResults();
+    });
+  }
+
+  SearchResult findTopLevelResult(ElementKind kind, String enclosingClass) {
+    for (SearchResult result in results) {
+      Element element = result.path[0];
+      Element clazz = result.path[1];
+      if (element.kind == kind && clazz.name == enclosingClass) {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  test_localVariable() {
+    addTestFile('''
+class A {
+  main() {
+    var foo = 42;
+  }
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, isEmpty);
+    });
+  }
+
+  test_localVariable_forIn() {
+    addTestFile('''
+class A {
+  main() {
+    for (int foo in []) {
+    }
+  }
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, isEmpty);
+    });
+  }
+
+  test_methodField() {
+    addTestFile('''
+class A {
+  foo() {}
+  bar() {}
+}
+class B {
+  int foo;
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, hasLength(2));
+      assertHasDeclaration(ElementKind.METHOD, 'A');
+      assertHasDeclaration(ElementKind.FIELD, 'B');
+    });
+  }
+
+  test_methodGetter() {
+    addTestFile('''
+class A {
+  foo() {}
+  bar() {}
+}
+class B {
+  get foo => null;
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, hasLength(2));
+      assertHasDeclaration(ElementKind.METHOD, 'A');
+      assertHasDeclaration(ElementKind.GETTER, 'B');
+    });
+  }
+
+  test_methodGetterSetter() {
+    addTestFile('''
+class A {
+  foo() {}
+  bar() {}
+}
+class B {
+  get foo => null;
+  set foo(x) {}
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, hasLength(3));
+      assertHasDeclaration(ElementKind.METHOD, 'A');
+      assertHasDeclaration(ElementKind.GETTER, 'B');
+      assertHasDeclaration(ElementKind.SETTER, 'B');
+    });
+  }
+
+  test_methodMethod() {
+    addTestFile('''
+class A {
+  foo() {}
+  bar() {}
+}
+class B {
+  foo() {}
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, hasLength(2));
+      assertHasDeclaration(ElementKind.METHOD, 'A');
+      assertHasDeclaration(ElementKind.METHOD, 'B');
+    });
+  }
+
+  test_methodSetter() {
+    addTestFile('''
+class A {
+  foo() {}
+  bar() {}
+}
+class B {
+  set foo(x) {}
+}
+''');
+    return findMemberDeclarations('foo').then((_) {
+      expect(results, hasLength(2));
+      assertHasDeclaration(ElementKind.METHOD, 'A');
+      assertHasDeclaration(ElementKind.SETTER, 'B');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/search/member_references_test.dart b/pkg/analysis_server/test/search/member_references_test.dart
new file mode 100644
index 0000000..c09fe13
--- /dev/null
+++ b/pkg/analysis_server/test/search/member_references_test.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2014, 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.search.member_references;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_search_domain.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('MemberReferencesTest', () {
+    runReflectiveTests(MemberReferencesTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class MemberReferencesTest extends AbstractSearchDomainTest {
+  void assertHasRef(SearchResultKind kind, String search, bool isPotential) {
+    assertHasResult(kind, search);
+    expect(result.isPotential, isPotential);
+  }
+
+  Future findMemberReferences(String name) {
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
+      request.setParameter(NAME, name);
+      Response response = handleSuccessfulRequest(request);
+      searchId = response.getResult(ID);
+      results.clear();
+      return waitForSearchResults();
+    });
+  }
+
+  test_fields_explicit() {
+    addTestFile('''
+class A {
+  var foo;
+}
+class B {
+  var foo;
+}
+mainResolved(A a, B b) {
+  a.foo = 1;
+  b.foo = 2;
+  print(a.foo); // resolved A
+  print(b.foo); // resolved B
+}
+mainUnresolved(a, b) {
+  a.foo = 10;
+  b.foo = 20;
+  print(a.foo); // unresolved A
+  print(b.foo); // unresolved B
+}
+''');
+    return findMemberReferences('foo').then((_) {
+      assertHasRef(SearchResultKind.WRITE, 'foo = 1;', false);
+      assertHasRef(SearchResultKind.WRITE, 'foo = 2;', false);
+      assertHasRef(SearchResultKind.READ, 'foo); // resolved A', false);
+      assertHasRef(SearchResultKind.READ, 'foo); // resolved B', false);
+      assertHasRef(SearchResultKind.WRITE, 'foo = 10;', true);
+      assertHasRef(SearchResultKind.WRITE, 'foo = 20;', true);
+      assertHasRef(SearchResultKind.READ, 'foo); // unresolved A', true);
+      assertHasRef(SearchResultKind.READ, 'foo); // unresolved B', true);
+    });
+  }
+
+  test_fields_implicit() {
+    addTestFile('''
+class A {
+  get foo => null;
+}
+class B {
+  get foo => null;
+}
+mainResolved(A a, B b) {
+  print(a.foo); // resolved A
+  print(b.foo); // resolved B
+}
+mainUnresolved(a, b) {
+  print(a.foo); // unresolved A
+  print(b.foo); // unresolved B
+}
+''');
+    return findMemberReferences('foo').then((_) {
+      assertHasRef(SearchResultKind.READ, 'foo); // resolved A', false);
+      assertHasRef(SearchResultKind.READ, 'foo); // resolved B', false);
+      assertHasRef(SearchResultKind.READ, 'foo); // unresolved A', true);
+      assertHasRef(SearchResultKind.READ, 'foo); // unresolved B', true);
+    });
+  }
+
+  test_methods() {
+    addTestFile('''
+class A {
+  foo() {}
+}
+class B {
+  foo() {}
+}
+mainResolved(A a, B b) {
+  a.foo(1);
+  b.foo(2);
+}
+mainUnresolved(a, b) {
+  a.foo(10);
+  b.foo(20);
+}
+''');
+    return findMemberReferences('foo').then((_) {
+      assertHasRef(SearchResultKind.INVOCATION, 'foo(1)', false);
+      assertHasRef(SearchResultKind.INVOCATION, 'foo(2)', false);
+      assertHasRef(SearchResultKind.INVOCATION, 'foo(10)', true);
+      assertHasRef(SearchResultKind.INVOCATION, 'foo(20)', true);
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/search/search_domain_test.dart b/pkg/analysis_server/test/search/search_domain_test.dart
new file mode 100644
index 0000000..d97ccd7
--- /dev/null
+++ b/pkg/analysis_server/test/search/search_domain_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, 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.search.domain;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_domain.dart';
+import 'package:analysis_testing/mock_sdk.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:unittest/unittest.dart';
+
+import '../mocks.dart';
+
+
+main() {
+  groupSep = ' | ';
+
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  SearchDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel,
+        resourceProvider,
+        new MockPackageMapProvider(),
+        null);
+    server.defaultSdk = new MockSdk();
+    handler = new SearchDomainHandler(server);
+  });
+
+  group('SearchDomainHandler', () {
+    test('findMemberReferences', () {
+      var request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
+      request.setParameter(NAME, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/search/search_result_test.dart b/pkg/analysis_server/test/search/search_result_test.dart
new file mode 100644
index 0000000..ea2dc8c
--- /dev/null
+++ b/pkg/analysis_server/test/search/search_result_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, 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.search.search_result;
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('SearchResult', () {
+    runReflectiveTests(SearchResultTest);
+  });
+  group('SearchResultKind', () {
+    runReflectiveTests(SearchResultKindTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class SearchResultKindTest {
+  void test_fromEngine() {
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.DECLARATION),
+        SearchResultKind.DECLARATION);
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.READ),
+        SearchResultKind.READ);
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.READ_WRITE),
+        SearchResultKind.READ_WRITE);
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.WRITE),
+        SearchResultKind.WRITE);
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.REFERENCE),
+        SearchResultKind.REFERENCE);
+    expect(
+        new SearchResultKind.fromEngine(MatchKind.INVOCATION),
+        SearchResultKind.INVOCATION);
+    expect(new SearchResultKind.fromEngine(null), SearchResultKind.UNKNOWN);
+  }
+
+  void test_fromName() {
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.DECLARATION.name),
+        SearchResultKind.DECLARATION);
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.READ.name),
+        SearchResultKind.READ);
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.READ_WRITE.name),
+        SearchResultKind.READ_WRITE);
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.WRITE.name),
+        SearchResultKind.WRITE);
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.REFERENCE.name),
+        SearchResultKind.REFERENCE);
+    expect(
+        new SearchResultKind.fromName(SearchResultKind.INVOCATION.name),
+        SearchResultKind.INVOCATION);
+    expect(new SearchResultKind.fromName(null), SearchResultKind.UNKNOWN);
+  }
+
+  void test_toString() {
+    expect(SearchResultKind.DECLARATION.toString(), 'DECLARATION');
+  }
+}
+
+
+@ReflectiveTestCase()
+class SearchResultTest {
+  void test_fromJson() {
+    Map<String, Object> map = {
+      KIND: 'READ',
+      IS_POTENTIAL: true,
+      LOCATION: {
+        FILE: '/test.dart',
+        OFFSET: 1,
+        LENGTH: 2,
+        START_LINE: 3,
+        START_COLUMN: 4
+      },
+      PATH: [
+          new Element(
+              ElementKind.FIELD,
+              'myField',
+              new Location('/lib.dart', 10, 20, 30, 40),
+              false,
+              false).toJson()]
+    };
+    SearchResult result = new SearchResult.fromJson(map);
+    expect(result.kind, SearchResultKind.READ);
+    expect(result.location.file, '/test.dart');
+    expect(result.location.offset, 1);
+    expect(result.location.length, 2);
+    expect(result.location.startLine, 3);
+    expect(result.location.startColumn, 4);
+    expect(result.path, hasLength(1));
+    expect(result.path[0].kind, ElementKind.FIELD);
+    expect(result.path[0].name, 'myField');
+    expect(result.path[0].location.file, '/lib.dart');
+    expect(result.path[0].location.offset, 10);
+    // touch toJson();
+    expect(result.toJson(), hasLength(4));
+    // touch asJson();
+    expect(SearchResult.asJson(result), hasLength(4));
+    // touch toString();
+    expect(result.toString(), hasLength(greaterThan(10)));
+  }
+}
diff --git a/pkg/analysis_server/test/search/test_all.dart b/pkg/analysis_server/test/search/test_all.dart
new file mode 100644
index 0000000..ba3a431
--- /dev/null
+++ b/pkg/analysis_server/test/search/test_all.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, 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.search;
+
+import 'package:unittest/unittest.dart';
+
+import 'element_references_test.dart' as element_references_test;
+import 'member_references_test.dart' as member_references_test;
+import 'member_declarations_test.dart' as member_declarations;
+import 'search_domain_test.dart' as search_domain_test;
+import 'search_result_test.dart' as search_result_test;
+import 'top_level_declarations_test.dart' as top_level_declarations_test;
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('search', () {
+    element_references_test.main();
+    member_declarations.main();
+    member_references_test.main();
+    search_domain_test.main();
+    search_result_test.main();
+    top_level_declarations_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
new file mode 100644
index 0000000..6c1fb83
--- /dev/null
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2014, 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.search.top_level_declarations;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/search/search_result.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:unittest/unittest.dart';
+
+import 'abstract_search_domain.dart';
+import 'dart:async';
+import 'package:analysis_server/src/computer/element.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('findTopLevelDeclarations', () {
+    runReflectiveTests(TopLevelDeclarationsTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class TopLevelDeclarationsTest extends AbstractSearchDomainTest {
+  Future findTopLevelDeclarations(String pattern) {
+    return waitForTasksFinished().then((_) {
+      Request request = new Request('0', SEARCH_FIND_TOP_LEVEL_DECLARATIONS);
+      request.setParameter(PATTERN, pattern);
+      Response response = handleSuccessfulRequest(request);
+      searchId = response.getResult(ID);
+      results.clear();
+      return waitForSearchResults();
+    });
+  }
+
+  void assertHasDeclaration(ElementKind kind, String name) {
+    result = findTopLevelResult(kind, name);
+    if (result == null) {
+      fail('Not found: kind=$kind name="$name"\nin\n' + results.join('\n'));
+    }
+  }
+
+  void assertNoDeclaration(ElementKind kind, String name) {
+    result = findTopLevelResult(kind, name);
+    if (result != null) {
+      fail('Unexpected: kind=$kind name="$name"\nin\n' + results.join('\n'));
+    }
+  }
+
+  SearchResult findTopLevelResult(ElementKind kind, String name) {
+    for (SearchResult result in results) {
+      Element element = result.path[0];
+      if (element.kind == kind && element.name == name) {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  test_startEndPattern() {
+    addTestFile('''
+class A {} // A
+class B = Object with A;
+typedef C();
+D() {}
+var E = null;
+class ABC {}
+''');
+    return findTopLevelDeclarations('^[A-E]\$').then((_) {
+      assertHasDeclaration(ElementKind.CLASS, 'A');
+      assertHasDeclaration(ElementKind.CLASS, 'B');
+      assertHasDeclaration(ElementKind.FUNCTION_TYPE_ALIAS, 'C');
+      assertHasDeclaration(ElementKind.FUNCTION, 'D');
+      assertHasDeclaration(ElementKind.TOP_LEVEL_VARIABLE, 'E');
+      assertNoDeclaration(ElementKind.CLASS, 'ABC');
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index daaac12..6871fba 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -12,17 +12,18 @@
 import 'analysis_notification_overrides_test.dart' as analysis_notification_overrides_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
+import 'completion_test.dart' as completion_test;
 import 'computer/test_all.dart' as computer_test_all;
 import 'context_directory_manager_test.dart' as context_directory_manager_test;
 import 'domain_analysis_test.dart' as domain_analysis_test;
 import 'domain_completion_test.dart' as domain_completion_test;
 import 'domain_edit_test.dart' as domain_edit_test;
-import 'domain_search_test.dart' as domain_search_test;
 import 'domain_server_test.dart' as domain_server_test;
 import 'operation/test_all.dart' as operation_test_all;
 import 'package_map_provider_test.dart' as package_map_provider_test;
 import 'package_uri_resolver_test.dart' as package_uri_resolver_test;
 import 'protocol_test.dart' as protocol_test;
+import 'search/test_all.dart' as search_all;
 import 'socket_server_test.dart' as socket_server_test;
 
 /**
@@ -39,17 +40,18 @@
     analysis_notification_overrides_test.main();
     analysis_server_test.main();
     channel_test.main();
+    completion_test.main();
     computer_test_all.main();
     context_directory_manager_test.main();
     domain_analysis_test.main();
     domain_completion_test.main();
     domain_edit_test.main();
-    domain_search_test.main();
     domain_server_test.main();
     operation_test_all.main();
     package_map_provider_test.main();
     package_uri_resolver_test.main();
     protocol_test.main();
+    search_all.main();
     socket_server_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_services/lib/correction/change.dart b/pkg/analysis_services/lib/correction/change.dart
new file mode 100644
index 0000000..aead362
--- /dev/null
+++ b/pkg/analysis_services/lib/correction/change.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2014, 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.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.correction.change;
+
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A description of a single change to one or more files. 
+ */
+class Change {
+  /**
+   * A textual description of the change to be applied. 
+   */
+  final String message;
+
+  /**
+   * A list of the [FileEdit]s used to effect the change. 
+   */
+  final List<FileEdit> edits = <FileEdit>[];
+
+  Change(this.message);
+
+  /**
+   * Adds the given [FileEdit] to the list.
+   */
+  void add(FileEdit edit) {
+    edits.add(edit);
+  }
+
+  @override
+  String toString() => "Change(message=$message, edits=${edits.join(' ')})";
+}
+
+
+/**
+ * A description of a single change to a single file. 
+ */
+class Edit {
+  /**
+   * The offset of the region to be modified. 
+   */
+  final int offset;
+
+  /**
+   * The length of the region to be modified.
+   */
+  final int length;
+
+  /**
+   * The text that is to replace the specified region in the original text. 
+   */
+  final String replacement;
+
+  Edit(this.offset, this.length, this.replacement);
+
+  Edit.range(SourceRange range, String replacement) : this(
+      range.offset,
+      range.length,
+      replacement);
+
+  /**
+   * The offset of a character immediately after the region to be modified. 
+   */
+  int get end => offset + length;
+
+  @override
+  String toString() =>
+      "(offset=$offset, length=$length, replacement=:>$replacement<:)";
+}
+
+
+/**
+ * A description of a set of changes to a single file. 
+ */
+class FileEdit {
+  /**
+   * The file to be modified.
+   */
+  final String file;
+
+  /**
+   * A list of the [Edit]s used to effect the change. 
+   */
+  final List<Edit> edits = <Edit>[];
+
+  FileEdit(this.file);
+
+  /**
+   * Adds the given [Edit] to the list.
+   */
+  void add(Edit edit) {
+    edits.add(edit);
+  }
+
+  @override
+  String toString() => "FileEdit(file=$file, edits=${edits.join(' ')})";
+}
diff --git a/pkg/analysis_services/lib/correction/fix.dart b/pkg/analysis_services/lib/correction/fix.dart
new file mode 100644
index 0000000..7ff90d2
--- /dev/null
+++ b/pkg/analysis_services/lib/correction/fix.dart
@@ -0,0 +1,285 @@
+// Copyright (c) 2014, 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 services.correction.fix;
+
+import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_services/correction/source_range_factory.dart' as rf;
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * Computes [Fix]s for the given [AnalysisError].
+ *
+ * Returns the computed [Fix]s, not `null`.
+ */
+List<Fix> computeFixes(SearchEngine searchEngine, String file,
+    CompilationUnit unit, AnalysisError error) {
+  var processor = new _FixProcessor(searchEngine, file, unit, error);
+  return processor.compute();
+}
+
+
+/**
+ * A description of a single proposed fix for some problem.
+ */
+class Fix {
+  final FixKind kind;
+  final Change change;
+
+  Fix(this.kind, this.change);
+
+  @override
+  String toString() {
+    return '[kind=$kind, change=$change]';
+  }
+}
+
+
+/**
+ * An enumeration of possible quick fix kinds.
+ */
+class FixKind {
+  static const ADD_PACKAGE_DEPENDENCY =
+      const FixKind(
+          'QF_ADD_PACKAGE_DEPENDENCY',
+          50,
+          "Add dependency on package '%s'");
+  static const ADD_SUPER_CONSTRUCTOR_INVOCATION =
+      const FixKind(
+          'QF_ADD_SUPER_CONSTRUCTOR_INVOCATION',
+          50,
+          "Add super constructor %s invocation");
+  static const CHANGE_TO = const FixKind('QF_CHANGE_TO', 51, "Change to '%s'");
+  static const CHANGE_TO_STATIC_ACCESS =
+      const FixKind(
+          'QF_CHANGE_TO_STATIC_ACCESS',
+          50,
+          "Change access to static using '%s'");
+  static const CREATE_CLASS =
+      const FixKind('QF_CREATE_CLASS', 50, "Create class '%s'");
+  static const CREATE_CONSTRUCTOR =
+      const FixKind('QF_CREATE_CONSTRUCTOR', 50, "Create constructor '%s'");
+  static const CREATE_CONSTRUCTOR_SUPER =
+      const FixKind(
+          'QF_CREATE_CONSTRUCTOR_SUPER',
+          50,
+          "Create constructor to call %s");
+  static const CREATE_FUNCTION =
+      const FixKind('QF_CREATE_FUNCTION', 49, "Create function '%s'");
+  static const CREATE_METHOD =
+      const FixKind('QF_CREATE_METHOD', 50, "Create method '%s'");
+  static const CREATE_MISSING_OVERRIDES =
+      const FixKind(
+          'QF_CREATE_MISSING_OVERRIDES',
+          50,
+          "Create %d missing override(s)");
+  static const CREATE_NO_SUCH_METHOD =
+      const FixKind('QF_CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
+  static const CREATE_PART =
+      const FixKind('QF_CREATE_PART', 50, "Create part '%s'");
+  static const IMPORT_LIBRARY_PREFIX =
+      const FixKind(
+          'QF_IMPORT_LIBRARY_PREFIX',
+          51,
+          "Use imported library '%s' with prefix '%s'");
+  static const IMPORT_LIBRARY_PROJECT =
+      const FixKind('QF_IMPORT_LIBRARY_PROJECT', 51, "Import library '%s'");
+  static const IMPORT_LIBRARY_SDK =
+      const FixKind('QF_IMPORT_LIBRARY_SDK', 51, "Import library '%s'");
+  static const IMPORT_LIBRARY_SHOW =
+      const FixKind('QF_IMPORT_LIBRARY_SHOW', 51, "Update library '%s' import");
+  static const INSERT_SEMICOLON =
+      const FixKind('QF_INSERT_SEMICOLON', 50, "Insert ';'");
+  static const MAKE_CLASS_ABSTRACT =
+      const FixKind('QF_MAKE_CLASS_ABSTRACT', 50, "Make class '%s' abstract");
+  static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION =
+      const FixKind(
+          'QF_REMOVE_PARAMETERS_IN_GETTER_DECLARATION',
+          50,
+          "Remove parameters in getter declaration");
+  static const REMOVE_PARENTHESIS_IN_GETTER_INVOCATION =
+      const FixKind(
+          'QF_REMOVE_PARENTHESIS_IN_GETTER_INVOCATION',
+          50,
+          "Remove parentheses in getter invocation");
+  static const REMOVE_UNNECASSARY_CAST =
+      const FixKind('QF_REMOVE_UNNECASSARY_CAST', 50, "Remove unnecessary cast");
+  static const REMOVE_UNUSED_IMPORT =
+      const FixKind('QF_REMOVE_UNUSED_IMPORT', 50, "Remove unused import");
+  static const REPLACE_BOOLEAN_WITH_BOOL =
+      const FixKind(
+          'QF_REPLACE_BOOLEAN_WITH_BOOL',
+          50,
+          "Replace 'boolean' with 'bool'");
+  static const USE_CONST =
+      const FixKind('QF_USE_CONST', 50, "Change to constant");
+  static const USE_EFFECTIVE_INTEGER_DIVISION =
+      const FixKind(
+          'QF_USE_EFFECTIVE_INTEGER_DIVISION',
+          50,
+          "Use effective integer division ~/");
+  static const USE_EQ_EQ_NULL =
+      const FixKind('QF_USE_EQ_EQ_NULL', 50, "Use == null instead of 'is Null'");
+  static const USE_NOT_EQ_NULL =
+      const FixKind('QF_USE_NOT_EQ_NULL', 50, "Use != null instead of 'is! Null'");
+
+  final name;
+  final int relevance;
+  final String message;
+
+  const FixKind(this.name, this.relevance, this.message);
+}
+
+
+/**
+ * The computer for Dart fixes.
+ */
+class _FixProcessor {
+  final SearchEngine searchEngine;
+  final String file;
+  final CompilationUnit unit;
+  final AnalysisError error;
+
+  final List<Fix> fixes = <Fix>[];
+  final List<Edit> edits = <Edit>[];
+
+
+  _FixProcessor(this.searchEngine, this.file, this.unit, this.error);
+
+  List<Fix> compute() {
+    ErrorCode errorCode = error.errorCode;
+    if (errorCode == StaticWarningCode.UNDEFINED_CLASS_BOOLEAN) {
+      _addFix_boolInsteadOfBoolean();
+    }
+    return fixes;
+  }
+
+  void _addFix(FixKind kind, List args) {
+    FileEdit fileEdit = new FileEdit(file);
+    edits.forEach((edit) => fileEdit.add(edit));
+    // prepare Change
+    String message = JavaString.format(kind.message, args);
+    Change change = new Change(message);
+    change.add(fileEdit);
+    // add Fix
+    var fix = new Fix(kind, change);
+    fixes.add(fix);
+  }
+
+  void _addFix_boolInsteadOfBoolean() {
+    SourceRange range = rf.rangeError(error);
+    _addReplaceEdit(range, "bool");
+    _addFix(FixKind.REPLACE_BOOLEAN_WITH_BOOL, []);
+  }
+
+  /**
+   * Adds a new [Edit] to [edits].
+   */
+  void _addReplaceEdit(SourceRange range, String text) {
+    Edit edit = new Edit.range(range, text);
+    edits.add(edit);
+  }
+}
+
+
+///**
+// * An enumeration of possible quick assist kinds.
+// */
+//class AssistKind {
+//  static const QA_ADD_PART_DIRECTIVE =
+//      const AssistKind('QA_ADD_PART_DIRECTIVE', 30, "Add 'part' directive");
+//  static const QA_ADD_TYPE_ANNOTATION =
+//      const AssistKind('QA_ADD_TYPE_ANNOTATION', 30, "Add type annotation");
+//  static const QA_ASSIGN_TO_LOCAL_VARIABLE =
+//      const AssistKind(
+//          'QA_ASSIGN_TO_LOCAL_VARIABLE',
+//          30,
+//          "Assign value to new local variable");
+//  static const QA_CONVERT_INTO_BLOCK_BODY =
+//      const AssistKind('QA_CONVERT_INTO_BLOCK_BODY', 30, "Convert into block body");
+//  static const QA_CONVERT_INTO_EXPRESSION_BODY =
+//      const AssistKind(
+//          'QA_CONVERT_INTO_EXPRESSION_BODY',
+//          30,
+//          "Convert into expression body");
+//  static const QA_CONVERT_INTO_IS_NOT =
+//      const AssistKind('QA_CONVERT_INTO_IS_NOT', 30, "Convert into is!");
+//  static const QA_CONVERT_INTO_IS_NOT_EMPTY =
+//      const AssistKind(
+//          'QA_CONVERT_INTO_IS_NOT_EMPTY',
+//          30,
+//          "Convert into 'isNotEmpty'");
+//  static const QA_EXCHANGE_OPERANDS =
+//      const AssistKind('QA_EXCHANGE_OPERANDS', 30, "Exchange operands");
+//  static const QA_EXTRACT_CLASS =
+//      const AssistKind('QA_EXTRACT_CLASS', 30, "Extract class into file '%s'");
+//  static const QA_IMPORT_ADD_SHOW =
+//      const AssistKind('QA_IMPORT_ADD_SHOW', 30, "Add explicit 'show' combinator");
+//  static const QA_INVERT_IF_STATEMENT =
+//      const AssistKind('QA_INVERT_IF_STATEMENT', 30, "Invert 'if' statement");
+//  static const QA_JOIN_IF_WITH_INNER =
+//      const AssistKind(
+//          'QA_JOIN_IF_WITH_INNER',
+//          30,
+//          "Join 'if' statement with inner 'if' statement");
+//  static const QA_JOIN_IF_WITH_OUTER =
+//      const AssistKind(
+//          'QA_JOIN_IF_WITH_OUTER',
+//          30,
+//          "Join 'if' statement with outer 'if' statement");
+//  static const QA_JOIN_VARIABLE_DECLARATION =
+//      const AssistKind(
+//          'QA_JOIN_VARIABLE_DECLARATION',
+//          30,
+//          "Join variable declaration");
+//  static const QA_REMOVE_TYPE_ANNOTATION =
+//      const AssistKind('QA_REMOVE_TYPE_ANNOTATION', 29, "Remove type annotation");
+//  static const QA_REPLACE_CONDITIONAL_WITH_IF_ELSE =
+//      const AssistKind(
+//          'QA_REPLACE_CONDITIONAL_WITH_IF_ELSE',
+//          30,
+//          "Replace conditional with 'if-else'");
+//  static const QA_REPLACE_IF_ELSE_WITH_CONDITIONAL =
+//      const AssistKind(
+//          'QA_REPLACE_IF_ELSE_WITH_CONDITIONAL',
+//          30,
+//          "Replace 'if-else' with conditional ('c ? x : y')");
+//  static const QA_SPLIT_AND_CONDITION =
+//      const AssistKind('QA_SPLIT_AND_CONDITION', 30, "Split && condition");
+//  static const QA_SPLIT_VARIABLE_DECLARATION =
+//      const AssistKind(
+//          'QA_SPLIT_VARIABLE_DECLARATION',
+//          30,
+//          "Split variable declaration");
+//  static const QA_SURROUND_WITH_BLOCK =
+//      const AssistKind('QA_SURROUND_WITH_BLOCK', 30, "Surround with block");
+//  static const QA_SURROUND_WITH_DO_WHILE =
+//      const AssistKind('QA_SURROUND_WITH_DO_WHILE', 30, "Surround with 'do-while'");
+//  static const QA_SURROUND_WITH_FOR =
+//      const AssistKind('QA_SURROUND_WITH_FOR', 30, "Surround with 'for'");
+//  static const QA_SURROUND_WITH_FOR_IN =
+//      const AssistKind('QA_SURROUND_WITH_FOR_IN', 30, "Surround with 'for-in'");
+//  static const QA_SURROUND_WITH_IF =
+//      const AssistKind('QA_SURROUND_WITH_IF', 30, "Surround with 'if'");
+//  static const QA_SURROUND_WITH_TRY_CATCH =
+//      const AssistKind('QA_SURROUND_WITH_TRY_CATCH', 30, "Surround with 'try-catch'");
+//  static const QA_SURROUND_WITH_TRY_FINALLY =
+//      const AssistKind(
+//          'QA_SURROUND_WITH_TRY_FINALLY',
+//          30,
+//          "Surround with 'try-finally'");
+//  static const QA_SURROUND_WITH_WHILE =
+//      const AssistKind('QA_SURROUND_WITH_WHILE', 30, "Surround with 'while'");
+//
+//  final name;
+//  final int relevance;
+//  final String message;
+//
+//  const AssistKind(this.name, this.relevance, this.message);
+//}
diff --git a/pkg/analysis_services/lib/correction/source_range_factory.dart b/pkg/analysis_services/lib/correction/source_range_factory.dart
new file mode 100644
index 0000000..4637ed8
--- /dev/null
+++ b/pkg/analysis_services/lib/correction/source_range_factory.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, 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.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.correction.source_range_factory;
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+SourceRange rangeElementName(Element element) {
+  return new SourceRange(element.nameOffset, element.name.length);
+}
+
+SourceRange rangeEndEnd(a, b) {
+  int offset = a.end;
+  var length = b.end - offset;
+  return new SourceRange(offset, length);
+}
+
+SourceRange rangeEndLength(a, int length) {
+  return new SourceRange(a.nameOffset, length);
+}
+
+SourceRange rangeEndStart(a, b) {
+  int offset = a.end;
+  var length = b.offset - offset;
+  return new SourceRange(offset, length);
+}
+
+SourceRange rangeError(AnalysisError error) {
+  return new SourceRange(error.offset, error.length);
+}
+
+SourceRange rangeNode(AstNode node) {
+  return new SourceRange(node.offset, node.length);
+}
+
+SourceRange rangeNodes(List<AstNode> nodes) {
+  if (nodes.isEmpty) {
+    return new SourceRange(0, 0);
+  }
+  AstNode first = nodes.first;
+  AstNode last = nodes.last;
+  return rangeStartEnd(first, last);
+}
+
+SourceRange rangeStartEnd(a, b) {
+  int offset = a.offset;
+  var length = b.end - offset;
+  return new SourceRange(offset, length);
+}
+
+SourceRange rangeStartLength(a, int length) {
+  int offset = a.offset;
+  return new SourceRange(offset, length);
+}
+
+SourceRange rangeStartStart(a, b) {
+  int offset = a.offset;
+  var length = b.offset - offset;
+  return new SourceRange(offset, length);
+}
+
+SourceRange rangeToken(Token node) {
+  return new SourceRange(node.offset, node.length);
+}
diff --git a/pkg/analysis_services/lib/index/index.dart b/pkg/analysis_services/lib/index/index.dart
index d8bb20d..f69b89b 100644
--- a/pkg/analysis_services/lib/index/index.dart
+++ b/pkg/analysis_services/lib/index/index.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.
 
-library engine.index;
+library services.index;
 
 import 'dart:async';
 
@@ -119,237 +119,99 @@
  */
 class IndexConstants {
   /**
-   * Reference to some closing tag of an XML element.
+   * Left: an Angular element.
+   *   Is referenced at.
+   * Right: location.
+   */
+  static final Relationship ANGULAR_REFERENCE =
+      Relationship.getRelationship("angular-reference");
+
+  /**
+   * Left: an Angular component.
+   *   Is closed "/>" at.
+   * Right: location.
    */
   static final Relationship ANGULAR_CLOSING_TAG_REFERENCE =
       Relationship.getRelationship("angular-closing-tag-reference");
 
   /**
-   * Reference to some [AngularElement].
+   * Left: the Universe or a Library.
+   *   Defines an Element.
+   * Right: an Element declaration.
    */
-  static final Relationship ANGULAR_REFERENCE = Relationship.getRelationship(
-      "angular-reference");
+  static final Relationship DEFINES = Relationship.getRelationship("defines");
 
   /**
-   * The relationship used to indicate that a container (the left-operand)
-   * contains the definition of a class at a specific location (the right
-   * operand).
+   * Left: class.
+   *   Is extended by.
+   * Right: other class declaration.
    */
-  static final Relationship DEFINES_CLASS = Relationship.getRelationship(
-      "defines-class");
+  static final Relationship IS_EXTENDED_BY =
+      Relationship.getRelationship("is-extended-by");
 
   /**
-   * The relationship used to indicate that a container (the left-operand)
-   * contains the definition of a class type alias at a specific location (the
-   * right operand).
+   * Left: class.
+   *   Is implemented by.
+   * Right: other class declaration.
    */
-  static final Relationship DEFINES_CLASS_ALIAS = Relationship.getRelationship(
-      "defines-class-alias");
+  static final Relationship IS_IMPLEMENTED_BY =
+      Relationship.getRelationship("is-implemented-by");
 
   /**
-   * The relationship used to indicate that a container (the left-operand)
-   * contains the definition of a function at a specific location (the right
-   * operand).
+   * Left: class.
+   *   Is mixed into.
+   * Right: other class declaration.
    */
-  static final Relationship DEFINES_FUNCTION = Relationship.getRelationship(
-      "defines-function");
+  static final Relationship IS_MIXED_IN_BY =
+      Relationship.getRelationship("is-mixed-in-by");
 
   /**
-   * The relationship used to indicate that a container (the left-operand)
-   * contains the definition of a function type at a specific location (the
-   * right operand).
+   * Left: local variable, parameter.
+   *   Is read at.
+   * Right: location.
    */
-  static final Relationship DEFINES_FUNCTION_TYPE =
-      Relationship.getRelationship("defines-function-type");
+  static final Relationship IS_READ_BY =
+      Relationship.getRelationship("is-read-by");
 
   /**
-   * The relationship used to indicate that a container (the left-operand)
-   * contains the definition of a method at a specific location (the right
-   * operand).
+   * Left: local variable, parameter.
+   *   Is both read and written at.
+   * Right: location.
    */
-  static final Relationship DEFINES_VARIABLE = Relationship.getRelationship(
-      "defines-variable");
+  static final Relationship IS_READ_WRITTEN_BY =
+      Relationship.getRelationship("is-read-written-by");
 
   /**
-   * The relationship used to indicate that a name (the left-operand) is defined
-   * at a specific location (the right operand).
+   * Left: local variable, parameter.
+   *   Is written at.
+   * Right: location.
    */
-  static final Relationship IS_DEFINED_BY = Relationship.getRelationship(
-      "is-defined-by");
+  static final Relationship IS_WRITTEN_BY =
+      Relationship.getRelationship("is-written-by");
 
   /**
-   * The relationship used to indicate that a type (the left-operand) is
-   * extended by a type at a specific location (the right operand).
+   * Left: function, method, variable, getter.
+   *   Is invoked at.
+   * Right: location.
    */
-  static final Relationship IS_EXTENDED_BY = Relationship.getRelationship(
-      "is-extended-by");
+  static final Relationship IS_INVOKED_BY =
+      Relationship.getRelationship("is-invoked-by");
 
   /**
-   * The relationship used to indicate that a type (the left-operand) is
-   * implemented by a type at a specific location (the right operand).
+   * Left: function, function type, class, field, method.
+   *   Is referenced (and not invoked, read/written) at.
+   * Right: location.
    */
-  static final Relationship IS_IMPLEMENTED_BY = Relationship.getRelationship(
-      "is-implemented-by");
+  static final Relationship IS_REFERENCED_BY =
+      Relationship.getRelationship("is-referenced-by");
 
   /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * invoked at a specific location (the right operand). This is used for
-   * functions.
+   * Left: name element.
+   *   Is defined by.
+   * Right: concrete element declaration.
    */
-  static final Relationship IS_INVOKED_BY = Relationship.getRelationship(
-      "is-invoked-by");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * invoked at a specific location (the right operand). This is used for
-   * methods.
-   */
-  static final Relationship IS_INVOKED_BY_QUALIFIED =
-      Relationship.getRelationship("is-invoked-by-qualified");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * invoked at a specific location (the right operand). This is used for
-   * methods.
-   */
-  static final Relationship IS_INVOKED_BY_UNQUALIFIED =
-      Relationship.getRelationship("is-invoked-by-unqualified");
-
-  /**
-   * The relationship used to indicate that a type (the left-operand) is mixed
-   * into a type at a specific location (the right operand).
-   */
-  static final Relationship IS_MIXED_IN_BY = Relationship.getRelationship(
-      "is-mixed-in-by");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the
-   * left-operand) is read at a specific location (the right operand).
-   */
-  static final Relationship IS_READ_BY = Relationship.getRelationship(
-      "is-read-by");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the
-   * left-operand) is both read and modified at a specific location (the right
-   * operand).
-   */
-  static final Relationship IS_READ_WRITTEN_BY = Relationship.getRelationship(
-      "is-read-written-by");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * referenced at a specific location (the right operand). This is used for
-   * everything except read/write operations for fields, parameters, and
-   * variables. Those use either [IS_REFERENCED_BY_QUALIFIED],
-   * [IS_REFERENCED_BY_UNQUALIFIED], [IS_READ_BY], [IS_WRITTEN_BY] or
-   * [IS_READ_WRITTEN_BY], as appropriate.
-   */
-  static final Relationship IS_REFERENCED_BY = Relationship.getRelationship(
-      "is-referenced-by");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * referenced at a specific location (the right operand). This is used for
-   * field accessors and methods.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED =
-      Relationship.getRelationship("is-referenced-by-qualified");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is referenced at a specific location (the right operand). This is used for
-   * qualified resolved references to methods and fields.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED_RESOLVED =
-      Relationship.getRelationship("is-referenced-by-qualified-resolved");
-
-  /**
-   * The relationship used to indicate that an [NameElement] (the left-operand)
-   * is referenced at a specific location (the right operand). This is used for
-   * qualified unresolved references to methods and fields.
-   */
-  static final Relationship IS_REFERENCED_BY_QUALIFIED_UNRESOLVED =
-      Relationship.getRelationship("is-referenced-by-qualified-unresolved");
-
-  /**
-   * The relationship used to indicate that an element (the left-operand) is
-   * referenced at a specific location (the right operand). This is used for
-   * field accessors and methods.
-   */
-  static final Relationship IS_REFERENCED_BY_UNQUALIFIED =
-      Relationship.getRelationship("is-referenced-by-unqualified");
-
-  /**
-   * The relationship used to indicate that a parameter or variable (the
-   * left-operand) is modified (assigned to) at a specific location (the right
-   * operand).
-   */
-  static final Relationship IS_WRITTEN_BY = Relationship.getRelationship(
-      "is-written-by");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is invoked at a specific location (the right operand). This is used for
-   * resolved invocations.
-   */
-  static final Relationship NAME_IS_INVOKED_BY_RESOLVED =
-      Relationship.getRelationship("name-is-invoked-by-resolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is invoked at a specific location (the right operand). This is used for
-   * unresolved invocations.
-   */
-  static final Relationship NAME_IS_INVOKED_BY_UNRESOLVED =
-      Relationship.getRelationship("name-is-invoked-by-unresolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is read at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_BY_RESOLVED =
-      Relationship.getRelationship("name-is-read-by-resolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is read at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_BY_UNRESOLVED =
-      Relationship.getRelationship("name-is-read-by-unresolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is both read and written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_WRITTEN_BY_RESOLVED =
-      Relationship.getRelationship("name-is-read-written-by-resolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is both read and written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_READ_WRITTEN_BY_UNRESOLVED =
-      Relationship.getRelationship("name-is-read-written-by-unresolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_WRITTEN_BY_RESOLVED =
-      Relationship.getRelationship("name-is-written-by-resolved");
-
-  /**
-   * The relationship used to indicate that a [NameElement] (the left-operand)
-   * is written at a specific location (the right operand).
-   */
-  static final Relationship NAME_IS_WRITTEN_BY_UNRESOLVED =
-      Relationship.getRelationship("name-is-written-by-unresolved");
-
-  /**
-   * An element used to represent the universe.
-   */
-  static final Element UNIVERSE = UniverseElement.INSTANCE;
+  static final Relationship NAME_IS_DEFINED_BY =
+      Relationship.getRelationship("name-is-defined-by");
 
   IndexConstants._();
 }
@@ -363,6 +225,9 @@
  * within that resource.
  */
 class Location {
+  static const int _FLAG_QUALIFIED = 1 << 0;
+  static const int _FLAG_RESOLVED = 1 << 1;
+
   /**
    * An empty array of locations.
    */
@@ -384,21 +249,53 @@
   final int length;
 
   /**
-   * Initializes a newly create location to be relative to the given element at
+   * The flags of this location.
+   */
+  int _flags;
+
+  /**
+   * Initializes a newly created location to be relative to the given element at
    * the given [offset] with the given [length].
    *
    * [element] - the [Element] containing this location.
-   * [offset] - the offset within the resource containing the [element].
+   * [offset] - the offset within the resource containing [element].
    * [length] - the length of this location
    */
-  Location(this.element, this.offset, this.length) {
+  Location(this.element, this.offset, this.length, {bool isQualified: false,
+      bool isResolved: true}) {
     if (element == null) {
       throw new ArgumentError("element location cannot be null");
     }
+    _flags = 0;
+    if (isQualified) {
+      _flags |= _FLAG_QUALIFIED;
+    }
+    if (isResolved) {
+      _flags |= _FLAG_RESOLVED;
+    }
   }
 
+  /**
+   * Returns `true` if this location is a qualified reference.
+   */
+  bool get isQualified => (_flags & _FLAG_QUALIFIED) != 0;
+
+  /**
+   * Returns `true` if this location is a resolved reference.
+   */
+  bool get isResolved => (_flags & _FLAG_RESOLVED) != 0;
+
   @override
-  String toString() => "[${offset} - ${(offset + length)}) in ${element}";
+  String toString() {
+    String flagsStr = '';
+    if (isQualified) {
+      flagsStr += ' qualified';
+    }
+    if (isResolved) {
+      flagsStr += ' resolved';
+    }
+    return '[${offset} - ${(offset + length)}) $flagsStr in ${element}';
+  }
 }
 
 
@@ -408,8 +305,10 @@
 class LocationWithData<D> extends Location {
   final D data;
 
-  LocationWithData(Location location, this.data) : super(location.element,
-      location.offset, location.length);
+  LocationWithData(Location location, this.data) : super(
+      location.element,
+      location.offset,
+      location.length);
 }
 
 
diff --git a/pkg/analysis_services/lib/index/index_store.dart b/pkg/analysis_services/lib/index/index_store.dart
index cb678ac..e04c012 100644
--- a/pkg/analysis_services/lib/index/index_store.dart
+++ b/pkg/analysis_services/lib/index/index_store.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.
 
-library engine.index_store;
+library services.index_store;
 
 import 'dart:async';
 
diff --git a/pkg/analysis_services/lib/index/local_file_index.dart b/pkg/analysis_services/lib/index/local_file_index.dart
index 3e202d9..b819ef1 100644
--- a/pkg/analysis_services/lib/index/local_file_index.dart
+++ b/pkg/analysis_services/lib/index/local_file_index.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.
 
-library engine.index.local_file_index;
+library services.index.local_file_index;
 
 import 'dart:io';
 
diff --git a/pkg/analysis_services/lib/index/local_memory_index.dart b/pkg/analysis_services/lib/index/local_memory_index.dart
index 7f4c8fa..cbd73d4 100644
--- a/pkg/analysis_services/lib/index/local_memory_index.dart
+++ b/pkg/analysis_services/lib/index/local_memory_index.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.
 
-library engine.index.memory_file_index;
+library services.index.memory_file_index;
 
 import 'package:analysis_services/index/index.dart';
 import 'package:analysis_services/src/index/local_index.dart';
diff --git a/pkg/analysis_services/lib/search/hierarchy.dart b/pkg/analysis_services/lib/search/hierarchy.dart
new file mode 100644
index 0000000..4b0623f
--- /dev/null
+++ b/pkg/analysis_services/lib/search/hierarchy.dart
@@ -0,0 +1,198 @@
+// Copyright (c) 2014, 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.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library services.hierarchy;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
+
+
+/**
+ * Returns direct children of [parent].
+ */
+List<Element> getChildren(Element parent, [String name]) {
+  List<Element> children = <Element>[];
+  parent.visitChildren(new _ElementVisitorAdapter((Element element) {
+    if (name == null || element.displayName == name) {
+      children.add(element);
+    }
+  }));
+  return children;
+}
+
+
+/**
+ * Returns direct non-synthetic children of the given [ClassElement].
+ *
+ * Includes: fields, accessors and methods.
+ * Excludes: constructors and synthetic elements.
+ */
+List<Element> getClassMembers(ClassElement clazz, [String name]) {
+  List<Element> members = <Element>[];
+  clazz.visitChildren(new _ElementVisitorAdapter((Element element) {
+    if (element.isSynthetic) {
+      return;
+    }
+    if (element is ConstructorElement) {
+      return;
+    }
+    if (name != null && element.displayName != name) {
+      return;
+    }
+    if (element is ExecutableElement) {
+      members.add(element);
+    }
+    if (element is FieldElement) {
+      members.add(element);
+    }
+  }));
+  return members;
+}
+
+
+/**
+ * Returns a [Set] with direct subclasses of [seed].
+ */
+Future<Set<ClassElement>> getDirectSubClasses(SearchEngine searchEngine,
+    ClassElement seed) {
+  return searchEngine.searchSubtypes(seed).then((List<SearchMatch> matches) {
+    Set<ClassElement> subClasses = new HashSet<ClassElement>();
+    for (SearchMatch match in matches) {
+      ClassElement subClass = match.element;
+      if (subClass.context == seed.context) {
+        subClasses.add(subClass);
+      }
+    }
+    return subClasses;
+  });
+}
+
+
+/**
+ * @return all implementations of the given {@link ClassMemberElement} is its superclasses and
+ *         their subclasses.
+ */
+Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine,
+    ClassMemberElement member) {
+  Set<ClassMemberElement> result = new HashSet<ClassMemberElement>();
+  // constructor
+  if (member is ConstructorElement) {
+    result.add(member);
+    return new Future.value(result);
+  }
+  // method, field, etc
+  String name = member.displayName;
+  ClassElement memberClass = member.enclosingElement;
+  List<Future> futures = <Future>[];
+  Set<ClassElement> searchClasses = getSuperClasses(memberClass);
+  searchClasses.add(memberClass);
+  for (ClassElement superClass in searchClasses) {
+    // ignore if super- class does not declare member
+    if (getClassMembers(superClass, name).isEmpty) {
+      continue;
+    }
+    // check all sub- classes
+    var subClassFuture = getSubClasses(searchEngine, superClass);
+    var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) {
+      subClasses.add(superClass);
+      for (ClassElement subClass in subClasses) {
+        List<Element> subClassMembers = getChildren(subClass, name);
+        for (Element member in subClassMembers) {
+          if (member is ClassMemberElement) {
+            result.add(member);
+          }
+        }
+      }
+    });
+    futures.add(membersFuture);
+  }
+  return Future.wait(futures).then((_) {
+    return result;
+  });
+}
+
+
+/**
+ * Returns a [Set] with all direct and indirect subclasses of [seed].
+ */
+Future<Set<ClassElement>> getSubClasses(SearchEngine searchEngine,
+    ClassElement seed) {
+  Set<ClassElement> subs = new HashSet<ClassElement>();
+  // prepare queue
+  List<ClassElement> queue = new List<ClassElement>();
+  queue.add(seed);
+  // schedule subclasss search
+  addSubClasses() {
+    // add direct subclasses of the next class
+    while (queue.isNotEmpty) {
+      ClassElement clazz = queue.removeLast();
+      if (subs.add(clazz)) {
+        return getDirectSubClasses(searchEngine, clazz).then((directSubs) {
+          queue.addAll(directSubs);
+          return new Future(addSubClasses);
+        });
+      }
+    }
+    // done
+    subs.remove(seed);
+    return subs;
+  }
+  return new Future(addSubClasses);
+}
+
+
+/**
+ * Returns a [Set] with all direct and indirect superclasses of [seed].
+ */
+Set<ClassElement> getSuperClasses(ClassElement seed) {
+  Set<ClassElement> result = new HashSet<ClassElement>();
+  // prepare queue
+  List<ClassElement> queue = new List<ClassElement>();
+  queue.add(seed);
+  // process queue
+  while (!queue.isEmpty) {
+    ClassElement current = queue.removeLast();
+    // add if not checked already
+    if (!result.add(current)) {
+      continue;
+    }
+    // append supertype
+    {
+      InterfaceType superType = current.supertype;
+      if (superType != null) {
+        queue.add(superType.element);
+      }
+    }
+    // append interfaces
+    for (InterfaceType intf in current.interfaces) {
+      queue.add(intf.element);
+    }
+  }
+  // we don't need "seed" itself
+  result.remove(seed);
+  return result;
+}
+
+
+typedef void ElementProcessor(Element element);
+
+/**
+ * A [GeneralizingElementVisitor] adapter for [ElementProcessor].
+ */
+class _ElementVisitorAdapter extends GeneralizingElementVisitor {
+  final ElementProcessor processor;
+
+  _ElementVisitorAdapter(this.processor);
+
+  @override
+  void visitElement(Element element) {
+    processor(element);
+  }
+}
diff --git a/pkg/analysis_services/lib/search/search_engine.dart b/pkg/analysis_services/lib/search/search_engine.dart
index 3aac8ba..7ffa6ab 100644
--- a/pkg/analysis_services/lib/search/search_engine.dart
+++ b/pkg/analysis_services/lib/search/search_engine.dart
@@ -5,7 +5,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 
-library engine.search_engine;
+library services.search_engine;
 
 import 'dart:async';
 
@@ -17,18 +17,6 @@
 
 
 /**
- * A [Comparator] that can be used to sort the [SearchMatch]s based on the names
- * of the matched elements.
- */
-final Comparator<SearchMatch> SEARCH_MATCH_NAME_COMPARATOR =
-    (SearchMatch firstMatch, SearchMatch secondMatch) {
-  String firstName = firstMatch.element.displayName;
-  String secondName = secondMatch.element.displayName;
-  return firstName.compareTo(secondName);
-};
-
-
-/**
  * Returns a new [SearchEngine] instance based on the given [Index].
  */
 SearchEngine createSearchEngine(Index index) {
@@ -54,239 +42,34 @@
       const MatchKind('ANGULAR_CLOSING_TAG_REFERENCE');
 
   /**
-   * A declaration of a class.
+   * A declaration of an element.
    */
-  static const MatchKind CLASS_DECLARATION =
-      const MatchKind('CLASS_DECLARATION');
+  static const MatchKind DECLARATION = const MatchKind('DECLARATION');
 
   /**
-   * A declaration of a class alias.
+   * A reference to an element in which it is being read.
    */
-  static const MatchKind CLASS_ALIAS_DECLARATION =
-      const MatchKind('CLASS_ALIAS_DECLARATION');
+  static const MatchKind READ = const MatchKind('READ');
 
   /**
-   * A declaration of a constructor.
+   * A reference to an element in which it is being both read and written.
    */
-  static const MatchKind CONSTRUCTOR_DECLARATION =
-      const MatchKind('CONSTRUCTOR_DECLARATION');
+  static const MatchKind READ_WRITE = const MatchKind('READ_WRITE');
 
   /**
-   * A reference to a constructor in which the constructor is being referenced.
+   * A reference to an element in which it is being written.
    */
-  static const MatchKind CONSTRUCTOR_REFERENCE =
-      const MatchKind('CONSTRUCTOR_REFERENCE');
+  static const MatchKind WRITE = const MatchKind('WRITE');
 
   /**
-   * A reference to a type in which the type was extended.
+   * A reference to an element in which it is being invoked.
    */
-  static const MatchKind EXTENDS_REFERENCE =
-      const MatchKind('EXTENDS_REFERENCE');
+  static const MatchKind INVOCATION = const MatchKind('INVOCATION');
 
   /**
-   * A reference to a field in which the field's value is being invoked.
+   * A reference to an element in which it is referenced.
    */
-  static const MatchKind FIELD_INVOCATION = const MatchKind('FIELD_INVOCATION');
-
-  /**
-   * A reference to a field (from field formal parameter).
-   */
-  static const MatchKind FIELD_REFERENCE = const MatchKind('FIELD_REFERENCE');
-
-  /**
-   * A reference to a field in which the field's value is being read.
-   */
-  static const MatchKind FIELD_READ = const MatchKind('FIELD_READ');
-
-  /**
-   * A reference to a field in which the field's value is being written.
-   */
-  static const MatchKind FIELD_WRITE = const MatchKind('FIELD_WRITE');
-
-  /**
-   * A declaration of a function.
-   */
-  static const MatchKind FUNCTION_DECLARATION =
-      const MatchKind('FUNCTION_DECLARATION');
-
-  /**
-   * A reference to a function in which the function is being executed.
-   */
-  static const MatchKind FUNCTION_EXECUTION =
-      const MatchKind('FUNCTION_EXECUTION');
-
-  /**
-   * A reference to a function in which the function is being referenced.
-   */
-  static const MatchKind FUNCTION_REFERENCE =
-      const MatchKind('FUNCTION_REFERENCE');
-
-  /**
-   * A declaration of a function type.
-   */
-  static const MatchKind FUNCTION_TYPE_DECLARATION =
-      const MatchKind('FUNCTION_TYPE_DECLARATION');
-
-  /**
-   * A reference to a function type.
-   */
-  static const MatchKind FUNCTION_TYPE_REFERENCE =
-      const MatchKind('FUNCTION_TYPE_REFERENCE');
-
-  /**
-   * A reference to a type in which the type was implemented.
-   */
-  static const MatchKind IMPLEMENTS_REFERENCE =
-      const MatchKind('IMPLEMENTS_REFERENCE');
-
-  /**
-   * A reference to a [ImportElement].
-   */
-  static const MatchKind IMPORT_REFERENCE = const MatchKind('IMPORT_REFERENCE');
-
-  /**
-   * A reference to a class that is implementing a specified type.
-   */
-  static const MatchKind INTERFACE_IMPLEMENTED =
-      const MatchKind('INTERFACE_IMPLEMENTED');
-
-  /**
-   * A reference to a [LibraryElement].
-   */
-  static const MatchKind LIBRARY_REFERENCE =
-      const MatchKind('LIBRARY_REFERENCE');
-
-  /**
-   * A reference to a method in which the method is being invoked.
-   */
-  static const MatchKind METHOD_INVOCATION =
-      const MatchKind('METHOD_INVOCATION');
-
-  /**
-   * A reference to a method in which the method is being referenced.
-   */
-  static const MatchKind METHOD_REFERENCE = const MatchKind('METHOD_REFERENCE');
-
-  /**
-   * A declaration of a name.
-   */
-  static const MatchKind NAME_DECLARATION = const MatchKind('NAME_DECLARATION');
-
-  /**
-   * A reference to a name, resolved.
-   */
-  static const MatchKind NAME_REFERENCE_RESOLVED =
-      const MatchKind('NAME_REFERENCE_RESOLVED');
-
-  /**
-   * An invocation of a name, resolved.
-   */
-  static const MatchKind NAME_INVOCATION_RESOLVED =
-      const MatchKind('NAME_INVOCATION_RESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being read.
-   */
-  static const MatchKind NAME_READ_RESOLVED =
-      const MatchKind('NAME_READ_RESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being read and written.
-   */
-  static const MatchKind NAME_READ_WRITE_RESOLVED =
-      const MatchKind('NAME_READ_WRITE_RESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being written.
-   */
-  static const MatchKind NAME_WRITE_RESOLVED =
-      const MatchKind('NAME_WRITE_RESOLVED');
-
-  /**
-   * An invocation of a name, unresolved.
-   */
-  static const MatchKind NAME_INVOCATION_UNRESOLVED =
-      const MatchKind('NAME_INVOCATION_UNRESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being read.
-   */
-  static const MatchKind NAME_READ_UNRESOLVED =
-      const MatchKind('NAME_READ_UNRESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being read and written.
-   */
-  static const MatchKind NAME_READ_WRITE_UNRESOLVED =
-      const MatchKind('NAME_READ_WRITE_UNRESOLVED');
-
-  /**
-   * A reference to a name in which the name's value is being written.
-   */
-  static const MatchKind NAME_WRITE_UNRESOLVED =
-      const MatchKind('NAME_WRITE_UNRESOLVED');
-
-  /**
-   * A reference to a name, unresolved.
-   */
-  static const MatchKind NAME_REFERENCE_UNRESOLVED =
-      const MatchKind('NAME_REFERENCE_UNRESOLVED');
-
-  /**
-   * A reference to a named parameter in invocation.
-   */
-  static const MatchKind NAMED_PARAMETER_REFERENCE =
-      const MatchKind('NAMED_PARAMETER_REFERENCE');
-
-  /**
-   * A reference to a property accessor.
-   */
-  static const MatchKind PROPERTY_ACCESSOR_REFERENCE =
-      const MatchKind('PROPERTY_ACCESSOR_REFERENCE');
-
-  /**
-   * A reference to a type.
-   */
-  static const MatchKind TYPE_REFERENCE = const MatchKind('TYPE_REFERENCE');
-
-  /**
-   * A reference to a type parameter.
-   */
-  static const MatchKind TYPE_PARAMETER_REFERENCE =
-      const MatchKind('TYPE_PARAMETER_REFERENCE');
-
-  /**
-   * A reference to a [CompilationUnitElement].
-   */
-  static const MatchKind UNIT_REFERENCE = const MatchKind('UNIT_REFERENCE');
-
-  /**
-   * A declaration of a variable.
-   */
-  static const MatchKind VARIABLE_DECLARATION =
-      const MatchKind('VARIABLE_DECLARATION');
-
-  /**
-   * A reference to a variable in which the variable's value is being read.
-   */
-  static const MatchKind VARIABLE_READ = const MatchKind('VARIABLE_READ');
-
-  /**
-   * A reference to a variable in which the variable's value is being both read
-   * and write.
-   */
-  static const MatchKind VARIABLE_READ_WRITE =
-      const MatchKind('VARIABLE_READ_WRITE');
-
-  /**
-   * A reference to a variable in which the variables's value is being written.
-   */
-  static const MatchKind VARIABLE_WRITE = const MatchKind('VARIABLE_WRITE');
-
-  /**
-   * A reference to a type in which the type was mixed in.
-   */
-  static const MatchKind WITH_REFERENCE = const MatchKind('WITH_REFERENCE');
+  static const MatchKind REFERENCE = const MatchKind('REFERENCE');
 
   final String name;
 
diff --git a/pkg/analysis_services/lib/src/index/index_contributor.dart b/pkg/analysis_services/lib/src/index/index_contributor.dart
index 3a1c97e..c1c850e 100644
--- a/pkg/analysis_services/lib/src/index/index_contributor.dart
+++ b/pkg/analysis_services/lib/src/index/index_contributor.dart
@@ -129,16 +129,20 @@
         if (property.propertyKind.callsGetter()) {
           PropertyAccessorElement getter = field.getter;
           if (getter != null) {
-            _store.recordRelationship(getter,
-                IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+            _store.recordRelationship(
+                getter,
+                IndexConstants.IS_REFERENCED_BY,
+                location);
           }
         }
         // setter reference
         if (property.propertyKind.callsSetter()) {
           PropertyAccessorElement setter = field.setter;
           if (setter != null) {
-            _store.recordRelationship(setter,
-                IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
+            _store.recordRelationship(
+                setter,
+                IndexConstants.IS_REFERENCED_BY,
+                location);
           }
         }
       }
@@ -169,7 +173,8 @@
    * [store] - the [IndexStore] to record relations into.
    */
   _AngularHtmlIndexContributor(this._store) {
-    _indexContributor = new _AngularHtmlIndexContributor_forEmbeddedDart(_store,
+    _indexContributor = new _AngularHtmlIndexContributor_forEmbeddedDart(
+        _store,
         this);
   }
 
@@ -179,7 +184,9 @@
     if (expression is SimpleIdentifier) {
       Element element = expression.bestElement;
       if (element is AngularElement) {
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+        _store.recordRelationship(
+            element,
+            IndexConstants.ANGULAR_REFERENCE,
             _createLocationForIdentifier(expression));
         return;
       }
@@ -203,7 +210,9 @@
     if (element != null) {
       ht.Token nameToken = node.nameToken;
       Location location = _createLocationForToken(nameToken);
-      _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+      _store.recordRelationship(
+          element,
+          IndexConstants.ANGULAR_REFERENCE,
           location);
     }
     return super.visitXmlAttributeNode(node);
@@ -217,15 +226,19 @@
       {
         ht.Token tagToken = node.tagToken;
         Location location = _createLocationForToken(tagToken);
-        _store.recordRelationship(element, IndexConstants.ANGULAR_REFERENCE,
+        _store.recordRelationship(
+            element,
+            IndexConstants.ANGULAR_REFERENCE,
             location);
       }
       // maybe add closing tag range
       ht.Token closingTag = node.closingTag;
       if (closingTag != null) {
         Location location = _createLocationForToken(closingTag);
-        _store.recordRelationship(element,
-            IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE, location);
+        _store.recordRelationship(
+            element,
+            IndexConstants.ANGULAR_CLOSING_TAG_REFERENCE,
+            location);
       }
     }
     return super.visitXmlTagNode(node);
@@ -234,8 +247,8 @@
   Location _createLocationForIdentifier(SimpleIdentifier identifier) =>
       new Location(_htmlUnitElement, identifier.offset, identifier.length);
 
-  Location _createLocationForToken(ht.Token token) => new Location(
-      _htmlUnitElement, token.offset, token.length);
+  Location _createLocationForToken(ht.Token token) =>
+      new Location(_htmlUnitElement, token.offset, token.length);
 }
 
 
@@ -243,7 +256,8 @@
   final _AngularHtmlIndexContributor angularContributor;
 
   _AngularHtmlIndexContributor_forEmbeddedDart(IndexStore store,
-      this.angularContributor) : super(store);
+      this.angularContributor) : super(
+      store);
 
   @override
   Element peekElement() => angularContributor._htmlUnitElement;
@@ -251,8 +265,8 @@
   @override
   void recordRelationship(Element element, Relationship relationship,
       Location location) {
-    AngularElement angularElement = AngularHtmlUnitResolver.getAngularElement(
-        element);
+    AngularElement angularElement =
+        AngularHtmlUnitResolver.getAngularElement(element);
     if (angularElement != null) {
       element = angularElement;
       relationship = IndexConstants.ANGULAR_REFERENCE;
@@ -382,7 +396,7 @@
     ClassElement element = node.element;
     enterScope(element);
     try {
-      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS);
+      _recordElementDefinition(element);
       {
         ExtendsClause extendsClause = node.extendsClause;
         if (extendsClause != null) {
@@ -392,8 +406,10 @@
           InterfaceType superType = element.supertype;
           if (superType != null) {
             ClassElement objectElement = superType.element;
-            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY,
-                _createLocationFromOffset(node.name.offset, 0));
+            recordRelationship(
+                objectElement,
+                IndexConstants.IS_EXTENDED_BY,
+                _createLocationForOffset(node.name.offset, 0));
           }
         }
       }
@@ -424,7 +440,7 @@
     ClassElement element = node.element;
     enterScope(element);
     try {
-      _recordElementDefinition(element, IndexConstants.DEFINES_CLASS_ALIAS);
+      _recordElementDefinition(element);
       {
         TypeName superclassNode = node.superclass;
         if (superclassNode != null) {
@@ -475,12 +491,12 @@
       if (node.name != null) {
         int start = node.period.offset;
         int end = node.name.end;
-        location = _createLocationFromOffset(start, end - start);
+        location = _createLocationForOffset(start, end - start);
       } else {
         int start = node.returnType.end;
-        location = _createLocationFromOffset(start, 0);
+        location = _createLocationForOffset(start, 0);
       }
-      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
+      recordRelationship(element, IndexConstants.NAME_IS_DEFINED_BY, location);
     }
     // visit children
     enterScope(element);
@@ -495,8 +511,9 @@
   Object visitConstructorName(ConstructorName node) {
     ConstructorElement element = node.staticElement;
     // in 'class B = A;' actually A constructors are invoked
-    if (element != null && element.isSynthetic && element.redirectedConstructor
-        != null) {
+    if (element != null &&
+        element.isSynthetic &&
+        element.redirectedConstructor != null) {
       element = element.redirectedConstructor;
     }
     // prepare location
@@ -504,10 +521,10 @@
     if (node.name != null) {
       int start = node.period.offset;
       int end = node.name.end;
-      location = _createLocationFromOffset(start, end - start);
+      location = _createLocationForOffset(start, end - start);
     } else {
       int start = node.type.end;
-      location = _createLocationFromOffset(start, 0);
+      location = _createLocationForOffset(start, 0);
     }
     // record relationship
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
@@ -515,6 +532,17 @@
   }
 
   @override
+  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+    LocalVariableElement element = node.element;
+    enterScope(element);
+    try {
+      return super.visitDeclaredIdentifier(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     ExportElement element = node.element;
     if (element != null) {
@@ -538,7 +566,7 @@
   @override
   Object visitFunctionDeclaration(FunctionDeclaration node) {
     Element element = node.element;
-    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION);
+    _recordElementDefinition(element);
     enterScope(element);
     try {
       return super.visitFunctionDeclaration(node);
@@ -550,7 +578,7 @@
   @override
   Object visitFunctionTypeAlias(FunctionTypeAlias node) {
     Element element = node.element;
-    _recordElementDefinition(element, IndexConstants.DEFINES_FUNCTION_TYPE);
+    _recordElementDefinition(element);
     return super.visitFunctionTypeAlias(node);
   }
 
@@ -569,9 +597,8 @@
     MethodElement element = node.bestElement;
     if (element is MethodElement) {
       Token operator = node.leftBracket;
-      Location location = _createLocationFromToken(operator);
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
-          location);
+      Location location = _createLocationForToken(operator, element != null);
+      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
     }
     return super.visitIndexExpression(node);
   }
@@ -590,29 +617,22 @@
   @override
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
+    Location location = _createLocationForNode(name);
+    // element invocation
     Element element = name.bestElement;
-    if (element is MethodElement || element is PropertyAccessorElement) {
-      Location location = _createLocationFromNode(name);
-      Relationship relationship;
-      if (node.target != null) {
-        relationship = IndexConstants.IS_INVOKED_BY_QUALIFIED;
-      } else {
-        relationship = IndexConstants.IS_INVOKED_BY_UNQUALIFIED;
-      }
-      recordRelationship(element, relationship, location);
-    }
-    if (element is FunctionElement || element is VariableElement) {
-      Location location = _createLocationFromNode(name);
+    if (element is MethodElement ||
+        element is PropertyAccessorElement ||
+        element is FunctionElement ||
+        element is VariableElement) {
       recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
     }
     // name invocation
     {
       Element nameElement = new NameElement(name.name);
-      Location location = _createLocationFromNode(name);
-      Relationship kind = element != null ?
-          IndexConstants.NAME_IS_INVOKED_BY_RESOLVED :
-          IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED;
-      _store.recordRelationship(nameElement, kind, location);
+      _store.recordRelationship(
+          nameElement,
+          IndexConstants.IS_INVOKED_BY,
+          location);
     }
     _recordImportElementReferenceWithoutPrefix(name);
     return super.visitMethodInvocation(node);
@@ -621,14 +641,14 @@
   @override
   Object visitPartDirective(PartDirective node) {
     Element element = node.element;
-    Location location = _createLocationFromNode(node.uri);
+    Location location = _createLocationForNode(node.uri);
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     return super.visitPartDirective(node);
   }
 
   @override
   Object visitPartOfDirective(PartOfDirective node) {
-    Location location = _createLocationFromNode(node.libraryName);
+    Location location = _createLocationForNode(node.libraryName);
     recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
     return null;
   }
@@ -648,76 +668,66 @@
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
     Element nameElement = new NameElement(node.name);
-    Location location = _createLocationFromNode(node);
+    Location location = _createLocationForNode(node);
     // name in declaration
     if (node.inDeclarationContext()) {
-      recordRelationship(nameElement, IndexConstants.IS_DEFINED_BY, location);
+      recordRelationship(
+          nameElement,
+          IndexConstants.NAME_IS_DEFINED_BY,
+          location);
       return null;
     }
     // prepare information
     Element element = node.bestElement;
-    // TODO(scheglov) fix resolver to resolve to Field, not an accessor
-    if (node.parent is Combinator && element is PropertyAccessorElement) {
-      element = (element as PropertyAccessorElement).variable;
-    }
-    // qualified name reference
-    _recordQualifiedMemberReference(node, element, nameElement, location);
     // stop if already handled
     if (_isAlreadyHandledName(node)) {
       return null;
     }
     // record name read/write
-    {
+    if (element != null && element.enclosingElement is ClassElement ||
+        element == null && location.isQualified) {
       bool inGetterContext = node.inGetterContext();
       bool inSetterContext = node.inSetterContext();
       if (inGetterContext && inSetterContext) {
-        Relationship kind = element != null ?
-            IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED :
-            IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
+        _store.recordRelationship(
+            nameElement,
+            IndexConstants.IS_READ_WRITTEN_BY,
+            location);
       } else if (inGetterContext) {
-        Relationship kind = element != null ?
-            IndexConstants.NAME_IS_READ_BY_RESOLVED :
-            IndexConstants.NAME_IS_READ_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
+        _store.recordRelationship(
+            nameElement,
+            IndexConstants.IS_READ_BY,
+            location);
       } else if (inSetterContext) {
-        Relationship kind = element != null ?
-            IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED :
-            IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED;
-        _store.recordRelationship(nameElement, kind, location);
+        _store.recordRelationship(
+            nameElement,
+            IndexConstants.IS_WRITTEN_BY,
+            location);
       }
     }
+    // this.field parameter
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
     // record specific relations
-    if (element is ClassElement || element is FunctionElement || element is
-        FunctionTypeAliasElement || element is LabelElement || element is
-        TypeParameterElement) {
+    if (element is ClassElement ||
+        element is FunctionElement ||
+        element is FunctionTypeAliasElement ||
+        element is LabelElement ||
+        element is MethodElement ||
+        element is PropertyAccessorElement ||
+        element is PropertyInducingElement ||
+        element is TypeParameterElement) {
       recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
-    } else if (element is PropertyInducingElement) {
-      location = _getLocationWithInitializerType(node, location);
-      recordRelationship(element,
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-          location);
-    } else if (element is FieldFormalParameterElement) {
-      FieldFormalParameterElement fieldParameter = element;
-      FieldElement field = fieldParameter.field;
-      recordRelationship(field, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-          location);
     } else if (element is PrefixElement) {
       _recordImportElementReferenceWithPrefix(node);
-    } else if (element is PropertyAccessorElement || element is MethodElement) {
-      location = _getLocationWithTypeAssignedToField(node, element, location);
-      if (node.isQualified) {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-            location);
-      } else {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-            location);
-      }
     } else if (element is ParameterElement || element is LocalVariableElement) {
       bool inGetterContext = node.inGetterContext();
       bool inSetterContext = node.inSetterContext();
       if (inGetterContext && inSetterContext) {
-        recordRelationship(element, IndexConstants.IS_READ_WRITTEN_BY,
+        recordRelationship(
+            element,
+            IndexConstants.IS_READ_WRITTEN_BY,
             location);
       } else if (inGetterContext) {
         recordRelationship(element, IndexConstants.IS_READ_BY, location);
@@ -738,10 +748,10 @@
     if (node.constructorName != null) {
       int start = node.period.offset;
       int end = node.constructorName.end;
-      location = _createLocationFromOffset(start, end - start);
+      location = _createLocationForOffset(start, end - start);
     } else {
       int start = node.keyword.end;
-      location = _createLocationFromOffset(start, 0);
+      location = _createLocationForOffset(start, 0);
     }
     recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
     return super.visitSuperConstructorInvocation(node);
@@ -752,7 +762,7 @@
     VariableDeclarationList variables = node.variables;
     for (VariableDeclaration variableDeclaration in variables.variables) {
       Element element = variableDeclaration.element;
-      _recordElementDefinition(element, IndexConstants.DEFINES_VARIABLE);
+      _recordElementDefinition(element);
     }
     return super.visitTopLevelVariableDeclaration(node);
   }
@@ -774,9 +784,9 @@
     // record declaration
     {
       SimpleIdentifier name = node.name;
-      Location location = _createLocationFromNode(name);
+      Location location = _createLocationForNode(name);
       location = _getLocationWithExpressionType(location, node.initializer);
-      recordRelationship(element, IndexConstants.IS_DEFINED_BY, location);
+      recordRelationship(element, IndexConstants.NAME_IS_DEFINED_BY, location);
     }
     // visit
     enterScope(element);
@@ -816,8 +826,20 @@
   /**
    * @return the [Location] representing location of the [AstNode].
    */
-  Location _createLocationFromNode(AstNode node) => _createLocationFromOffset(
-      node.offset, node.length);
+  Location _createLocationForNode(AstNode node) {
+    bool isQualified = _isQualifiedClassMemberAccess(node);
+    bool isResolved = true;
+    if (node is SimpleIdentifier) {
+      isResolved = node.bestElement != null;
+    }
+    Element element = peekElement();
+    return new Location(
+        element,
+        node.offset,
+        node.length,
+        isQualified: isQualified,
+        isResolved: isResolved);
+  }
 
   /**
    * [offset] - the offset of the location within [Source].
@@ -826,7 +848,7 @@
    * Returns the [Location] representing the given offset and length within the
    * inner-most [Element].
    */
-  Location _createLocationFromOffset(int offset, int length) {
+  Location _createLocationForOffset(int offset, int length) {
     Element element = peekElement();
     return new Location(element, offset, length);
   }
@@ -834,8 +856,15 @@
   /**
    * @return the [Location] representing location of the [Token].
    */
-  Location _createLocationFromToken(Token token) => _createLocationFromOffset(
-      token.offset, token.length);
+  Location _createLocationForToken(Token token, bool isResolved) {
+    Element element = peekElement();
+    return new Location(
+        element,
+        token.offset,
+        token.length,
+        isQualified: true,
+        isResolved: isResolved);
+  }
 
   /**
    * Exit the current scope.
@@ -856,13 +885,35 @@
     return false;
   }
 
+  bool _isQualifiedClassMemberAccess(AstNode node) {
+    if (node is SimpleIdentifier) {
+      AstNode parent = node.parent;
+      if (parent is PrefixedIdentifier && parent.identifier == node) {
+        return parent.prefix.staticElement is! PrefixElement;
+      }
+      if (parent is PropertyAccess && parent.propertyName == node) {
+        return parent.realTarget != null;
+      }
+      if (parent is MethodInvocation && parent.methodName == node) {
+        Expression target = parent.realTarget;
+        if (target is SimpleIdentifier &&
+            target.staticElement is PrefixElement) {
+          return false;
+        }
+        return target != null;
+      }
+    }
+    return false;
+  }
+
   /**
    * Records the [Element] definition in the library and universe.
    */
-  void _recordElementDefinition(Element element, Relationship relationship) {
+  void _recordElementDefinition(Element element) {
     Location location = createLocation(element);
+    Relationship relationship = IndexConstants.DEFINES;
     recordRelationship(_libraryElement, relationship, location);
-    recordRelationship(IndexConstants.UNIVERSE, relationship, location);
+    recordRelationship(UniverseElement.INSTANCE, relationship, location);
   }
 
   /**
@@ -874,8 +925,10 @@
     if (info != null) {
       int offset = prefixNode.offset;
       int length = info._periodEnd - offset;
-      Location location = _createLocationFromOffset(offset, length);
-      recordRelationship(info._element, IndexConstants.IS_REFERENCED_BY,
+      Location location = _createLocationForOffset(offset, length);
+      recordRelationship(
+          info._element,
+          IndexConstants.IS_REFERENCED_BY,
           location);
     }
   }
@@ -892,11 +945,13 @@
       return;
     }
     Element element = node.staticElement;
-    ImportElement importElement = _internalGetImportElement(_libraryElement,
-        null, element, _importElementsMap);
+    ImportElement importElement =
+        _internalGetImportElement(_libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
-      Location location = _createLocationFromOffset(node.offset, 0);
-      recordRelationship(importElement, IndexConstants.IS_REFERENCED_BY,
+      Location location = _createLocationForOffset(node.offset, 0);
+      recordRelationship(
+          importElement,
+          IndexConstants.IS_REFERENCED_BY,
           location);
     }
   }
@@ -907,9 +962,11 @@
    */
   void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
     if (library != null) {
-      Location location = _createLocationFromNode(node.uri);
-      recordRelationship(library.definingCompilationUnit,
-          IndexConstants.IS_REFERENCED_BY, location);
+      Location location = _createLocationForNode(node.uri);
+      recordRelationship(
+          library.definingCompilationUnit,
+          IndexConstants.IS_REFERENCED_BY,
+          location);
     }
   }
 
@@ -918,7 +975,7 @@
    */
   void _recordOperatorReference(Token operator, Element element) {
     // prepare location
-    Location location = _createLocationFromToken(operator);
+    Location location = _createLocationForToken(operator, element != null);
     // record name reference
     {
       String name = operator.lexeme;
@@ -932,49 +989,32 @@
         name = name.substring(0, name.length - 1);
       }
       Element nameElement = new NameElement(name);
-      Relationship relationship = element != null ?
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED :
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
-      recordRelationship(nameElement, relationship, location);
+      recordRelationship(nameElement, IndexConstants.IS_INVOKED_BY, location);
     }
     // record element reference
     if (element != null) {
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
-          location);
+      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
     }
   }
 
   /**
-   * Records reference if the given [SimpleIdentifier] looks like a qualified property access
-   * or method invocation.
-   */
-  void _recordQualifiedMemberReference(SimpleIdentifier node, Element element,
-      Element nameElement, Location location) {
-    if (node.isQualified) {
-      Relationship relationship = element != null ?
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED :
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED;
-      recordRelationship(nameElement, relationship, location);
-    }
-  }
-
-  /**
-   * Records extends/implements relationships between given [ClassElement] and [Type] of
-   * "superNode".
+   * Records a relation between [superNode] and its [Element].
    */
   void _recordSuperType(TypeName superNode, Relationship relationship) {
     if (superNode != null) {
       Identifier superName = superNode.name;
       if (superName != null) {
         Element superElement = superName.staticElement;
-        recordRelationship(superElement, relationship, _createLocationFromNode(
-            superNode));
+        recordRelationship(
+            superElement,
+            relationship,
+            _createLocationForNode(superNode));
       }
     }
   }
 
   /**
-   * @return the [Location] representing location of the [Element].
+   * Creates a [Location] representing declaration of the [Element].
    */
   static Location createLocation(Element element) {
     if (element != null) {
@@ -1002,8 +1042,8 @@
     _ImportElementInfo info = new _ImportElementInfo();
     // prepare environment
     AstNode parent = prefixNode.parent;
-    CompilationUnit unit = prefixNode.getAncestor((node) => node is
-        CompilationUnit);
+    CompilationUnit unit =
+        prefixNode.getAncestor((node) => node is CompilationUnit);
     LibraryElement libraryElement = unit.element.library;
     // prepare used element
     Element usedElement = null;
@@ -1028,8 +1068,11 @@
     // find ImportElement
     String prefix = prefixNode.name;
     Map<ImportElement, Set<Element>> importElementsMap = {};
-    info._element = _internalGetImportElement(libraryElement, prefix,
-        usedElement, importElementsMap);
+    info._element = _internalGetImportElement(
+        libraryElement,
+        prefix,
+        usedElement,
+        importElementsMap);
     if (info._element == null) {
       return null;
     }
@@ -1051,83 +1094,6 @@
   }
 
   /**
-   * If the given node is the part of the [ConstructorFieldInitializer], returns location with
-   * type of the initializer expression.
-   */
-  static Location _getLocationWithInitializerType(SimpleIdentifier node,
-      Location location) {
-    if (node.parent is ConstructorFieldInitializer) {
-      ConstructorFieldInitializer initializer = node.parent as
-          ConstructorFieldInitializer;
-      if (identical(initializer.fieldName, node)) {
-        location = _getLocationWithExpressionType(location,
-            initializer.expression);
-      }
-    }
-    return location;
-  }
-
-  /**
-   * If the given identifier has a synthetic [PropertyAccessorElement], i.e.
-   * accessor for normal field, and it is LHS of assignment, then include [Type]
-   * of the assigned value into the [Location].
-   *
-   * [identifier] - the identifier to record location.
-   * [element] - the [Element] of the identifier.
-   * [location] - the raw location
-   *
-   * Returns the [Location] with the type of the assigned value
-   */
-  static Location
-      _getLocationWithTypeAssignedToField(SimpleIdentifier identifier,
-      Element element, Location location) {
-    // TODO(scheglov) decide if we want to remember assigned types
-    // we need accessor
-    if (element is! PropertyAccessorElement) {
-      return location;
-    }
-    PropertyAccessorElement accessor = element as PropertyAccessorElement;
-    // should be setter
-    if (!accessor.isSetter) {
-      return location;
-    }
-    // accessor should be synthetic, i.e. field normal
-    if (!accessor.isSynthetic) {
-      return location;
-    }
-    // should be LHS of assignment
-    AstNode parent;
-    {
-      AstNode node = identifier;
-      parent = node.parent;
-      // new T().field = x;
-      if (parent is PropertyAccess) {
-        PropertyAccess propertyAccess = parent as PropertyAccess;
-        if (identical(propertyAccess.propertyName, node)) {
-          node = propertyAccess;
-          parent = propertyAccess.parent;
-        }
-      }
-      // obj.field = x;
-      if (parent is PrefixedIdentifier) {
-        PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
-        if (identical(prefixedIdentifier.identifier, node)) {
-          node = prefixedIdentifier;
-          parent = prefixedIdentifier.parent;
-        }
-      }
-    }
-    // OK, remember the type
-    if (parent is AssignmentExpression) {
-      AssignmentExpression assignment = parent as AssignmentExpression;
-      Expression rhs = assignment.rightHandSide;
-      location = _getLocationWithExpressionType(location, rhs);
-    }
-    // done
-    return location;
-  }
-
-  /**
    * @return the [ImportElement] that declares given [PrefixElement] and imports library
    *         with given "usedElement".
    */
@@ -1186,8 +1152,8 @@
       if (importElementsMap.containsKey(importElement)) {
         continue;
       }
-      Namespace namespace = new NamespaceBuilder(
-          ).createImportNamespaceForDirective(importElement);
+      Namespace namespace =
+          new NamespaceBuilder().createImportNamespaceForDirective(importElement);
       Set<Element> elements = new Set.from(namespace.definedNames.values);
       importElementsMap[importElement] = elements;
     }
diff --git a/pkg/analysis_services/lib/src/index/store/codec.dart b/pkg/analysis_services/lib/src/index/store/codec.dart
index 108f936..a49b9ef 100644
--- a/pkg/analysis_services/lib/src/index/store/codec.dart
+++ b/pkg/analysis_services/lib/src/index/store/codec.dart
@@ -6,10 +6,10 @@
 
 import 'dart:collection';
 
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/src/index/store/collection.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analysis_services/src/index/store/collection.dart';
-import 'package:analysis_services/index/index.dart';
 
 
 /**
@@ -110,6 +110,20 @@
     return index;
   }
 
+  /**
+   * Returns an integer that corresponds to an approximated location of the given {@link Element}.
+   */
+  int encodeHash(Element element) {
+    List<int> path = _getLocationPathLimited(element);
+    int index = _pathToIndex[path];
+    if (index == null) {
+      index = _indexToPath.length;
+      _pathToIndex[path] = index;
+      _indexToPath.add(path);
+    }
+    return index;
+  }
+
   List<String> _getLocationComponents(List<int> path) {
     int length = path.length;
     List<String> components = new List<String>();
@@ -152,6 +166,21 @@
     }
   }
 
+  /**
+   * Returns an approximation of the given {@link Element}'s location.
+   */
+  List<int> _getLocationPathLimited(Element element) {
+    List<String> components = element.location.components;
+    int length = components.length;
+    String firstComponent = components[0];
+    String lastComponent = components[length - 1];
+    firstComponent = firstComponent.substring(1);
+    lastComponent = _substringBeforeAt(lastComponent);
+    int firstId = _stringCodec.encode(firstComponent);
+    int lastId = _stringCodec.encode(lastComponent);
+    return <int>[firstId, lastId];
+  }
+
   bool _hasLocalOffset(List<String> components) {
     for (String component in components) {
       if (component.indexOf('@') != -1) {
@@ -160,6 +189,14 @@
     }
     return false;
   }
+
+  String _substringBeforeAt(String str) {
+    int atOffset = str.indexOf('@');
+    if (atOffset != -1) {
+      str = str.substring(0, atOffset);
+    }
+    return str;
+  }
 }
 
 
diff --git a/pkg/analysis_services/lib/src/index/store/split_store.dart b/pkg/analysis_services/lib/src/index/store/split_store.dart
index 49e3ba0..5a81f59 100644
--- a/pkg/analysis_services/lib/src/index/store/split_store.dart
+++ b/pkg/analysis_services/lib/src/index/store/split_store.dart
@@ -83,14 +83,15 @@
       _DataInputStream stream = new _DataInputStream(bytes);
       return _readNode(stream);
     }).catchError((e, stackTrace) {
-      _logger.logError2('Exception during reading index file ${name}',
+      _logger.logError2(
+          'Exception during reading index file ${name}',
           new CaughtException(e, stackTrace));
     });
   }
 
   @override
-  IndexNode newNode(AnalysisContext context) => new IndexNode(context,
-      elementCodec, _relationshipCodec);
+  IndexNode newNode(AnalysisContext context) =>
+      new IndexNode(context, elementCodec, _relationshipCodec);
 
   @override
   Future putNode(String name, IndexNode node) {
@@ -108,7 +109,8 @@
       var bytes = stream.getBytes();
       return _fileManager.write(name, bytes);
     }).catchError((e, stackTrace) {
-      _logger.logError2('Exception during reading index file ${name}',
+      _logger.logError2(
+          'Exception during reading index file ${name}',
           new CaughtException(e, stackTrace));
     });
   }
@@ -137,7 +139,8 @@
     int elementId = stream.readInt();
     int offset = stream.readInt();
     int length = stream.readInt();
-    return new LocationData.forData(elementId, offset, length);
+    int flags = stream.readInt();
+    return new LocationData.forData(elementId, offset, length, flags);
   }
 
   IndexNode _readNode(_DataInputStream stream) {
@@ -198,6 +201,7 @@
         stream.writeInt(location.elementId);
         stream.writeInt(location.offset);
         stream.writeInt(location.length);
+        stream.writeInt(location.flags);
       }
     });
   }
@@ -254,8 +258,12 @@
    */
   List<Location> getRelationships(Element element, Relationship relationship) {
     // prepare key
-    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
-        _relationshipCodec, element, relationship);
+    RelationKeyData key =
+        new RelationKeyData.forObject(
+            _elementCodec,
+            _relationshipCodec,
+            element,
+            relationship);
     // find LocationData(s)
     List<LocationData> locationDatas = _relations[key];
     if (locationDatas == null) {
@@ -281,8 +289,12 @@
    */
   void recordRelationship(Element element, Relationship relationship,
       Location location) {
-    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
-        _relationshipCodec, element, relationship);
+    RelationKeyData key =
+        new RelationKeyData.forObject(
+            _elementCodec,
+            _relationshipCodec,
+            element,
+            relationship);
     // prepare LocationData(s)
     List<LocationData> locationDatas = _relations[key];
     if (locationDatas == null) {
@@ -299,16 +311,22 @@
  * A container with information about a [Location].
  */
 class LocationData {
+  static const int _FLAG_QUALIFIED = 1 << 0;
+  static const int _FLAG_RESOLVED = 1 << 1;
+
   final int elementId;
   final int offset;
   final int length;
+  final int flags;
 
-  LocationData.forData(this.elementId, this.offset, this.length);
+  LocationData.forData(this.elementId, this.offset, this.length, this.flags);
 
   LocationData.forObject(ElementCodec elementCodec, Location location)
       : elementId = elementCodec.encode(location.element),
         offset = location.offset,
-        length = location.length;
+        length = location.length,
+        flags = (location.isQualified ? _FLAG_QUALIFIED : 0) |
+          (location.isResolved ? _FLAG_RESOLVED : 0);
 
   @override
   int get hashCode {
@@ -321,8 +339,10 @@
       return false;
     }
     LocationData other = obj;
-    return other.elementId == elementId && other.offset == offset &&
-        other.length == length;
+    return other.elementId == elementId &&
+        other.offset == offset &&
+        other.length == length &&
+        other.flags == flags;
   }
 
   /**
@@ -333,7 +353,14 @@
     if (element == null) {
       return null;
     }
-    return new Location(element, offset, length);
+    bool isQualified = (flags & _FLAG_QUALIFIED) != 0;
+    bool isResovled = (flags & _FLAG_RESOLVED) != 0;
+    return new Location(
+        element,
+        offset,
+        length,
+        isQualified: isQualified,
+        isResolved: isResovled);
   }
 }
 
@@ -414,8 +441,8 @@
       return false;
     }
     RelationKeyData other = obj;
-    return other.elementId == elementId && other.relationshipId ==
-        relationshipId;
+    return other.elementId == elementId &&
+        other.relationshipId == relationshipId;
   }
 }
 
@@ -436,8 +463,8 @@
    * Order of keys: contextId, nodeId, Relationship.
    */
   Map<int, Map<int, Map<Relationship, List<LocationData>>>>
-      _contextNodeRelations = new HashMap<int, Map<int, Map<Relationship,
-      List<LocationData>>>>();
+      _contextNodeRelations =
+      new HashMap<int, Map<int, Map<Relationship, List<LocationData>>>>();
 
   /**
    * The mapping of library [Source] to the [Source]s of part units.
@@ -613,8 +640,7 @@
       return new Future.value(locations);
     }
     // prepare node names
-    String name = _getElementName(element);
-    int nameId = _stringCodec.encode(name);
+    int nameId = _elementCodec.encodeHash(element);
     List<int> nodeNameIds = _nameToNodeNames.get(nameId);
     // prepare Future(s) for reading each IndexNode
     List<Future<List<Location>>> nodeFutures = <Future<List<Location>>>[];
@@ -742,8 +768,8 @@
           List<LocationData> nodeLocations = nodeRelations[relationship];
           if (nodeLocations != null) {
             for (LocationData locationData in nodeLocations) {
-              Location location = locationData.getLocation(context,
-                  _elementCodec);
+              Location location =
+                  locationData.getLocation(context, _elementCodec);
               if (location != null) {
                 locations.add(location);
               }
@@ -771,8 +797,7 @@
   }
 
   void _recordNodeNameForElement(Element element) {
-    String name = _getElementName(element);
-    int nameId = _stringCodec.encode(name);
+    int nameId = _elementCodec.encodeHash(element);
     _nameToNodeNames.add(nameId, _currentNodeNameId);
   }
 
diff --git a/pkg/analysis_services/lib/src/search/search_engine.dart b/pkg/analysis_services/lib/src/search/search_engine.dart
index def5e32..be7afca 100644
--- a/pkg/analysis_services/lib/src/search/search_engine.dart
+++ b/pkg/analysis_services/lib/src/search/search_engine.dart
@@ -29,8 +29,8 @@
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
         element,
-        IndexConstants.IS_DEFINED_BY,
-        MatchKind.NAME_DECLARATION);
+        IndexConstants.NAME_IS_DEFINED_BY,
+        MatchKind.DECLARATION);
     return requestor.merge().then((matches) {
       return matches.where((match) {
         return match.element.enclosingElement is ClassElement;
@@ -42,55 +42,16 @@
   Future<List<SearchMatch>> searchMemberReferences(String name) {
     NameElement element = new NameElement(name);
     _Requestor requestor = new _Requestor(_index);
-    // rought
-//    requestor.add(
-//        element,
-//        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-//        MatchKind.NAME_REFERENCE_RESOLVED);
-//    requestor.add(
-//        element,
-//        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-//        MatchKind.NAME_REFERENCE_UNRESOLVED,
-//        isResolved: false);
-    // granular resolved operations
     requestor.add(
         element,
-        IndexConstants.NAME_IS_INVOKED_BY_RESOLVED,
-        MatchKind.NAME_INVOCATION_RESOLVED);
+        IndexConstants.IS_INVOKED_BY,
+        MatchKind.INVOCATION);
+    requestor.add(element, IndexConstants.IS_READ_BY, MatchKind.READ);
     requestor.add(
         element,
-        IndexConstants.NAME_IS_READ_BY_RESOLVED,
-        MatchKind.NAME_READ_RESOLVED);
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED,
-        MatchKind.NAME_READ_WRITE_RESOLVED);
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED,
-        MatchKind.NAME_WRITE_RESOLVED);
-    // granular unresolved operations
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED,
-        MatchKind.NAME_INVOCATION_UNRESOLVED,
-        isResolved: false);
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_READ_BY_UNRESOLVED,
-        MatchKind.NAME_READ_UNRESOLVED,
-        isResolved: false);
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED,
-        MatchKind.NAME_READ_WRITE_UNRESOLVED,
-        isResolved: false);
-    requestor.add(
-        element,
-        IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED,
-        MatchKind.NAME_WRITE_UNRESOLVED,
-        isResolved: false);
-    // done
+        IndexConstants.IS_READ_WRITTEN_BY,
+        MatchKind.READ_WRITE);
+    requestor.add(element, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
     return requestor.merge();
   }
 
@@ -141,18 +102,9 @@
   @override
   Future<List<SearchMatch>> searchSubtypes(ClassElement type) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        type,
-        IndexConstants.IS_EXTENDED_BY,
-        MatchKind.EXTENDS_REFERENCE);
-    requestor.add(
-        type,
-        IndexConstants.IS_MIXED_IN_BY,
-        MatchKind.WITH_REFERENCE);
-    requestor.add(
-        type,
-        IndexConstants.IS_IMPLEMENTED_BY,
-        MatchKind.IMPLEMENTS_REFERENCE);
+    requestor.add(type, IndexConstants.IS_EXTENDED_BY, MatchKind.REFERENCE);
+    requestor.add(type, IndexConstants.IS_MIXED_IN_BY, MatchKind.REFERENCE);
+    requestor.add(type, IndexConstants.IS_IMPLEMENTED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -160,26 +112,7 @@
   Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) {
     UniverseElement universe = UniverseElement.INSTANCE;
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        universe,
-        IndexConstants.DEFINES_CLASS,
-        MatchKind.CLASS_DECLARATION);
-    requestor.add(
-        universe,
-        IndexConstants.DEFINES_CLASS_ALIAS,
-        MatchKind.CLASS_ALIAS_DECLARATION);
-    requestor.add(
-        universe,
-        IndexConstants.DEFINES_FUNCTION_TYPE,
-        MatchKind.FUNCTION_TYPE_DECLARATION);
-    requestor.add(
-        universe,
-        IndexConstants.DEFINES_FUNCTION,
-        MatchKind.FUNCTION_DECLARATION);
-    requestor.add(
-        universe,
-        IndexConstants.DEFINES_VARIABLE,
-        MatchKind.VARIABLE_DECLARATION);
+    requestor.add(universe, IndexConstants.DEFINES, MatchKind.DECLARATION);
     RegExp regExp = new RegExp(pattern);
     return requestor.merge().then((List<SearchMatch> matches) {
       return matches.where((SearchMatch match) {
@@ -204,20 +137,15 @@
 
   Future<List<SearchMatch>> _searchReferences_Class(ClassElement clazz) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        clazz,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.TYPE_REFERENCE);
+    requestor.add(clazz, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>>
       _searchReferences_CompilationUnit(CompilationUnitElement unit) {
+    // TODO(merge?)
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        unit,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.UNIT_REFERENCE);
+    requestor.add(unit, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -226,12 +154,12 @@
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
         constructor,
-        IndexConstants.IS_DEFINED_BY,
-        MatchKind.CONSTRUCTOR_DECLARATION);
+        IndexConstants.NAME_IS_DEFINED_BY,
+        MatchKind.DECLARATION);
     requestor.add(
         constructor,
         IndexConstants.IS_REFERENCED_BY,
-        MatchKind.CONSTRUCTOR_REFERENCE);
+        MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -241,43 +169,15 @@
     PropertyAccessorElement setter = field.setter;
     _Requestor requestor = new _Requestor(_index);
     // field itself
-    requestor.add(
-        field,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.FIELD_REFERENCE);
-    requestor.add(
-        field,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        MatchKind.FIELD_REFERENCE);
+    requestor.add(field, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     // getter
     if (getter != null) {
-      requestor.add(
-          getter,
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-          MatchKind.FIELD_READ);
-      requestor.add(
-          getter,
-          IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-          MatchKind.FIELD_READ);
-      requestor.add(
-          getter,
-          IndexConstants.IS_INVOKED_BY_QUALIFIED,
-          MatchKind.FIELD_INVOCATION);
-      requestor.add(
-          getter,
-          IndexConstants.IS_INVOKED_BY_UNQUALIFIED,
-          MatchKind.FIELD_INVOCATION);
+      requestor.add(getter, IndexConstants.IS_REFERENCED_BY, MatchKind.READ);
+      requestor.add(getter, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     }
     // setter
     if (setter != null) {
-      requestor.add(
-          setter,
-          IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-          MatchKind.FIELD_WRITE);
-      requestor.add(
-          setter,
-          IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-          MatchKind.FIELD_WRITE);
+      requestor.add(setter, IndexConstants.IS_REFERENCED_BY, MatchKind.WRITE);
     }
     // done
     return requestor.merge();
@@ -289,30 +189,21 @@
     requestor.add(
         function,
         IndexConstants.IS_REFERENCED_BY,
-        MatchKind.FUNCTION_REFERENCE);
-    requestor.add(
-        function,
-        IndexConstants.IS_INVOKED_BY,
-        MatchKind.FUNCTION_EXECUTION);
+        MatchKind.REFERENCE);
+    requestor.add(function, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>>
       _searchReferences_FunctionTypeAlias(FunctionTypeAliasElement alias) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        alias,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.FUNCTION_TYPE_REFERENCE);
+    requestor.add(alias, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>> _searchReferences_Import(ImportElement imp) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        imp,
-        IndexConstants.IS_REFERENCED_BY,
-        MatchKind.IMPORT_REFERENCE);
+    requestor.add(imp, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -321,26 +212,20 @@
     requestor.add(
         library,
         IndexConstants.IS_REFERENCED_BY,
-        MatchKind.LIBRARY_REFERENCE);
+        MatchKind.REFERENCE);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>>
       _searchReferences_LocalVariable(LocalVariableElement variable) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(variable, IndexConstants.IS_READ_BY, MatchKind.VARIABLE_READ);
+    requestor.add(variable, IndexConstants.IS_READ_BY, MatchKind.READ);
     requestor.add(
         variable,
         IndexConstants.IS_READ_WRITTEN_BY,
-        MatchKind.VARIABLE_READ_WRITE);
-    requestor.add(
-        variable,
-        IndexConstants.IS_WRITTEN_BY,
-        MatchKind.VARIABLE_WRITE);
-    requestor.add(
-        variable,
-        IndexConstants.IS_INVOKED_BY,
-        MatchKind.FUNCTION_EXECUTION);
+        MatchKind.READ_WRITE);
+    requestor.add(variable, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
+    requestor.add(variable, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
@@ -349,48 +234,28 @@
     if (method is MethodMember) {
       method = (method as MethodMember).baseElement;
     }
-    requestor.add(
-        method,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        MatchKind.METHOD_REFERENCE);
-    requestor.add(
-        method,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        MatchKind.METHOD_REFERENCE);
-    requestor.add(
-        method,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        MatchKind.METHOD_INVOCATION);
-    requestor.add(
-        method,
-        IndexConstants.IS_INVOKED_BY_UNQUALIFIED,
-        MatchKind.METHOD_INVOCATION);
+    requestor.add(method, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
+    requestor.add(method, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>>
       _searchReferences_Parameter(ParameterElement parameter) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        parameter,
-        IndexConstants.IS_READ_BY,
-        MatchKind.VARIABLE_READ);
+    requestor.add(parameter, IndexConstants.IS_READ_BY, MatchKind.READ);
     requestor.add(
         parameter,
         IndexConstants.IS_READ_WRITTEN_BY,
-        MatchKind.VARIABLE_READ_WRITE);
-    requestor.add(
-        parameter,
-        IndexConstants.IS_WRITTEN_BY,
-        MatchKind.VARIABLE_WRITE);
+        MatchKind.READ_WRITE);
+    requestor.add(parameter, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
     requestor.add(
         parameter,
         IndexConstants.IS_REFERENCED_BY,
-        MatchKind.NAMED_PARAMETER_REFERENCE);
+        MatchKind.REFERENCE);
     requestor.add(
         parameter,
         IndexConstants.IS_INVOKED_BY,
-        MatchKind.FUNCTION_EXECUTION);
+        MatchKind.INVOCATION);
     return requestor.merge();
   }
 
@@ -399,12 +264,8 @@
     _Requestor requestor = new _Requestor(_index);
     requestor.add(
         accessor,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        MatchKind.PROPERTY_ACCESSOR_REFERENCE);
-    requestor.add(
-        accessor,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        MatchKind.PROPERTY_ACCESSOR_REFERENCE);
+        IndexConstants.IS_REFERENCED_BY,
+        MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -414,7 +275,7 @@
     requestor.add(
         typeParameter,
         IndexConstants.IS_REFERENCED_BY,
-        MatchKind.TYPE_PARAMETER_REFERENCE);
+        MatchKind.REFERENCE);
     return requestor.merge();
   }
 }
@@ -426,23 +287,18 @@
 
   _Requestor(this.index);
 
-  void add(Element element2, Relationship relationship, MatchKind kind,
-      {bool isResolved: true}) {
-    Future relationsFuture = index.getRelationships(element2, relationship);
+  void add(Element element, Relationship relationship, MatchKind kind) {
+    Future relationsFuture = index.getRelationships(element, relationship);
     Future matchesFuture = relationsFuture.then((List<Location> locations) {
-      bool isQualified =
-          relationship == IndexConstants.IS_REFERENCED_BY_QUALIFIED ||
-          relationship == IndexConstants.IS_INVOKED_BY_QUALIFIED;
       List<SearchMatch> matches = <SearchMatch>[];
       for (Location location in locations) {
-        Element element = location.element;
         matches.add(
             new SearchMatch(
                 kind,
-                element,
+                location.element,
                 new SourceRange(location.offset, location.length),
-                isResolved,
-                isQualified));
+                location.isResolved,
+                location.isQualified));
       }
       return matches;
     });
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index 194caf2..d679c35 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -1,12 +1,12 @@
 name: analysis_services
-version: 0.2.0
+version: 0.4.0
 author: Dart Team <misc@dartlang.org>
 description: A set of services on top of Analysis Engine
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.21.1 <1.0.0'
+  analyzer: '>=0.22.0-dev <0.23.0'
 dev_dependencies:
-  analysis_testing: '>=0.3.0 <1.0.0'
+  analysis_testing: '>=0.4.0 <0.5.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_services/test/correction/fix_test.dart b/pkg/analysis_services/test/correction/fix_test.dart
new file mode 100644
index 0000000..f7f6005
--- /dev/null
+++ b/pkg/analysis_services/test/correction/fix_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, 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.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library test.services.correction.fix;
+
+import 'package:analysis_services/correction/change.dart';
+import 'package:analysis_services/correction/fix.dart';
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/error.dart';
+import 'package:unittest/unittest.dart';
+
+import '../index/abstract_single_unit.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('FixProcessorTest', () {
+    runReflectiveTests(FixProcessorTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class FixProcessorTest extends AbstractSingleUnitTest {
+  Index index;
+  SearchEngineImpl searchEngine;
+
+  void assertHasFix(FixKind kind, String expected) {
+    AnalysisError error = _findErrorToFix();
+    Fix fix = _computeFix(kind, error);
+    // apply to "file"
+    List<FileEdit> fileEdits = fix.change.edits;
+    expect(fileEdits, hasLength(1));
+    String actualCode = _applyEdits(testCode, fix.change.edits[0].edits);
+    // verify
+    expect(expected, actualCode);
+  }
+
+  void setUp() {
+    super.setUp();
+    index = createLocalMemoryIndex();
+    searchEngine = new SearchEngineImpl(index);
+    verifyNoTestUnitErrors = false;
+  }
+
+  void test_boolean() {
+    _indexTestUnit('''
+main() {
+  boolean v;
+}
+''');
+    assertHasFix(FixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
+main() {
+  bool v;
+}
+''');
+  }
+
+  String _applyEdits(String code, List<Edit> edits) {
+    edits.sort((a, b) => b.offset - a.offset);
+    edits.forEach((Edit edit) {
+      code = code.substring(0, edit.offset) +
+          edit.replacement +
+          code.substring(edit.end);
+    });
+    return code;
+  }
+
+  Fix _computeFix(FixKind kind, AnalysisError error) {
+    List<Fix> fixes = computeFixes(searchEngine, testFile, testUnit, error);
+    for (Fix fix in fixes) {
+      if (fix.kind == kind) {
+        return fix;
+      }
+    }
+    throw fail('Expected to find fix $kind in\n${fixes.join('\n')}');
+  }
+
+  AnalysisError _findErrorToFix() {
+    List<AnalysisError> errors = context.getErrors(testSource).errors;
+    expect(
+        errors,
+        hasLength(1),
+        reason: 'Exactly 1 error expected, but ${errors.length} found:\n' +
+            errors.join('\n'));
+    return errors[0];
+  }
+
+  void _indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(context, testUnit);
+  }
+}
diff --git a/pkg/analysis_services/test/correction/test_all.dart b/pkg/analysis_services/test/correction/test_all.dart
new file mode 100644
index 0000000..169f143
--- /dev/null
+++ b/pkg/analysis_services/test/correction/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2014, 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.services.correction;
+
+import 'package:unittest/unittest.dart';
+
+import 'fix_test.dart' as fix_processor_test;
+
+/// Utility for manually running all tests.
+main() {
+  groupSep = ' | ';
+  group('correction', () {
+    fix_processor_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_services/test/index/abstract_single_unit.dart b/pkg/analysis_services/test/index/abstract_single_unit.dart
index 7dc112d..85629ac 100644
--- a/pkg/analysis_services/test/index/abstract_single_unit.dart
+++ b/pkg/analysis_services/test/index/abstract_single_unit.dart
@@ -17,6 +17,7 @@
   bool verifyNoTestUnitErrors = true;
 
   String testCode;
+  String testFile = '/test.dart';
   Source testSource;
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
@@ -82,7 +83,7 @@
 
   void resolveTestUnit(String code) {
     testCode = code;
-    testSource = addSource('/test.dart', code);
+    testSource = addSource(testFile, code);
     testUnit = resolveLibraryUnit(testSource);
     if (verifyNoTestUnitErrors) {
       assertNoErrorsInSource(testSource);
diff --git a/pkg/analysis_services/test/index/dart_index_contributor_test.dart b/pkg/analysis_services/test/index/dart_index_contributor_test.dart
index b5087b6..9912459 100644
--- a/pkg/analysis_services/test/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_services/test/index/dart_index_contributor_test.dart
@@ -33,7 +33,9 @@
       actual,
       expected.element,
       expected.offset,
-      expected.length);
+      expected.length,
+      expected.isQualified,
+      expected.isResolved);
 }
 
 
@@ -41,10 +43,12 @@
  * Returns `true` if the [actual] location the expected properties.
  */
 bool _equalsLocationProperties(Location actual, Element expectedElement,
-    int expectedOffset, int expectedLength) {
+    int expectedOffset, int expectedLength, bool isQualified, bool isResolved) {
   return expectedElement == actual.element &&
       expectedOffset == actual.offset &&
-      expectedLength == actual.length;
+      expectedLength == actual.length &&
+      isQualified == actual.isQualified &&
+      isResolved == actual.isResolved;
 }
 
 
@@ -63,6 +67,11 @@
   IndexStore store = new MockIndexStore();
   List<RecordedRelation> recordedRelations = <RecordedRelation>[];
 
+  CompilationUnitElement importedUnit({int index: 0}) {
+    List<ImportElement> imports = testLibraryElement.imports;
+    return imports[index].importedLibrary.definingCompilationUnit;
+  }
+
   void setUp() {
     super.setUp();
     when(store.aboutToIndexDart(context, anyObject)).thenReturn(true);
@@ -77,23 +86,207 @@
     });
   }
 
-  void test_FieldElement_noAssignedType_notLHS() {
+  void test_NameElement_field() {
     _indexTestUnit('''
 class A {
-  var myField;
-  main() {
-    print(myField);
+  int field;
+}
+main(A a, p) {
+  print(a.field); // r
+  print(p.field); // ur
+  {
+    var field = 42;
+    print(field); // not a member
   }
-}''');
+}
+''');
     // prepare elements
-    Element mainElement = findElement("main");
-    FieldElement fieldElement = findElement("myField");
-    PropertyAccessorElement getterElement = fieldElement.getter;
+    Element mainElement = findElement('main');
+    FieldElement fieldElement = findElement('field');
+    Element nameElement = new NameElement('field');
     // verify
     _assertRecordedRelation(
-        getterElement,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'myField);'));
+        nameElement,
+        IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(fieldElement, 'field;'));
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.IS_READ_BY,
+        _expectedLocationQ(mainElement, 'field); // r'));
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.IS_READ_BY,
+        _expectedLocationQU(mainElement, 'field); // ur'));
+    _assertNoRecordedRelation(
+        nameElement,
+        IndexConstants.IS_READ_BY,
+        _expectedLocation(mainElement, 'field); // not a member'));
+  }
+
+  void test_NameElement_method() {
+    _indexTestUnit('''
+class A {
+  method() {}
+}
+main(A a, p) {
+  a.method(); // r
+  p.method(); // ur
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    MethodElement methodElement = findElement('method');
+    Element nameElement = new NameElement('method');
+    // verify
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(methodElement, 'method() {}'));
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'method(); // r'));
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, 'method(); // ur'));
+  }
+
+  void test_NameElement_isDefinedBy_localVariable_inForEach() {
+    _indexTestUnit('''
+class A {
+  main() {
+    for (int test in []) {
+    }
+  }
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    LocalVariableElement testElement = findElement('test');
+    Element nameElement = new NameElement('test');
+    // verify
+    _assertRecordedRelation(
+        nameElement,
+        IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(testElement, 'test in []'));
+  }
+
+  void test_NameElement_operator_resolved() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(A a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    // binary
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+ 5', length: 1));
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+= 5', length: 2));
+    _assertRecordedRelation(
+        new NameElement('=='),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '== 5', length: 2));
+    // prefix
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++a', length: 2));
+    _assertRecordedRelation(
+        new NameElement('-'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '--a', length: 2));
+    _assertRecordedRelation(
+        new NameElement('~'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '~a', length: 1));
+    // postfix
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++;', length: 2));
+    _assertRecordedRelation(
+        new NameElement('-'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '--;', length: 2));
+  }
+
+
+  void test_NameElement_operator_unresolved() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    // binary
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '+ 5', length: 1));
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '+= 5', length: 2));
+    _assertRecordedRelation(
+        new NameElement('=='),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '== 5', length: 2));
+    // prefix
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '++a', length: 2));
+    _assertRecordedRelation(
+        new NameElement('-'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '--a', length: 2));
+    _assertRecordedRelation(
+        new NameElement('~'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '~a', length: 1));
+    // postfix
+    _assertRecordedRelation(
+        new NameElement('+'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '++;', length: 2));
+    _assertRecordedRelation(
+        new NameElement('-'),
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '--;', length: 2));
   }
 
   void test_definesClass() {
@@ -102,7 +295,7 @@
     ClassElement classElement = findElement("A");
     // verify
     _assertDefinesTopLevelElement(
-        IndexConstants.DEFINES_CLASS,
+        IndexConstants.DEFINES,
         _expectedLocation(classElement, 'A {}'));
   }
 
@@ -114,7 +307,7 @@
     Element classElement = findElement("MyClass");
     // verify
     _assertDefinesTopLevelElement(
-        IndexConstants.DEFINES_CLASS_ALIAS,
+        IndexConstants.DEFINES,
         _expectedLocation(classElement, 'MyClass ='));
   }
 
@@ -124,28 +317,28 @@
     FunctionElement functionElement = findElement("myFunction");
     // verify
     _assertDefinesTopLevelElement(
-        IndexConstants.DEFINES_FUNCTION,
+        IndexConstants.DEFINES,
         _expectedLocation(functionElement, 'myFunction() {}'));
   }
 
+
   void test_definesFunctionType() {
     _indexTestUnit('typedef MyFunction(int p);');
     // prepare elements
     FunctionTypeAliasElement typeAliasElement = findElement("MyFunction");
     // verify
     _assertDefinesTopLevelElement(
-        IndexConstants.DEFINES_FUNCTION_TYPE,
+        IndexConstants.DEFINES,
         _expectedLocation(typeAliasElement, 'MyFunction(int p);'));
   }
 
-
   void test_definesVariable() {
     _indexTestUnit('var myVar = 42;');
     // prepare elements
     VariableElement varElement = findElement("myVar");
     // verify
     _assertDefinesTopLevelElement(
-        IndexConstants.DEFINES_VARIABLE,
+        IndexConstants.DEFINES,
         _expectedLocation(varElement, 'myVar = 42;'));
   }
 
@@ -180,12 +373,12 @@
     // verify
     _assertRecordedRelation(
         consA,
-        IndexConstants.IS_DEFINED_BY,
+        IndexConstants.NAME_IS_DEFINED_BY,
         _expectedLocation(classA, '() {}'));
     _assertRecordedRelation(
         consA_foo,
-        IndexConstants.IS_DEFINED_BY,
-        _expectedLocation(classA, '.foo() {}', '.foo'.length));
+        IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(classA, '.foo() {}', length: 4));
   }
 
   void test_isDefinedBy_NameElement_method() {
@@ -199,11 +392,10 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.IS_DEFINED_BY,
+        IndexConstants.NAME_IS_DEFINED_BY,
         _expectedLocation(methodElement, 'm() {}'));
   }
 
-
   void test_isDefinedBy_NameElement_operator() {
     _indexTestUnit('''
 class A {
@@ -215,10 +407,11 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.IS_DEFINED_BY,
-        _expectedLocation(methodElement, '+(o) {}', 1));
+        IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(methodElement, '+(o) {}', length: 1));
   }
 
+
   void test_isExtendedBy_ClassDeclaration() {
     _indexTestUnit('''
 class A {} // 1
@@ -245,9 +438,10 @@
     _assertRecordedRelation(
         classElementObject,
         IndexConstants.IS_EXTENDED_BY,
-        _expectedLocation(classElementA, 'A {}', 0));
+        _expectedLocation(classElementA, 'A {}', length: 0));
   }
 
+
   void test_isExtendedBy_ClassTypeAlias() {
     _indexTestUnit('''
 class A {} // 1
@@ -295,13 +489,13 @@
         _expectedLocation(classElementC, 'B; // 3'));
   }
 
-
-  void test_isInvokedByQualified_FieldElement() {
+  void test_isInvokedBy_FieldElement() {
     _indexTestUnit('''
 class A {
   var field;
   main() {
-    this.field();
+    this.field(); // q
+    field(); // nq
   }
 }''');
     // prepare elements
@@ -311,86 +505,38 @@
     // verify
     _assertRecordedRelation(
         getterElement,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'field();'));
-  }
-
-
-  void test_isInvokedByQualified_MethodElement() {
-    _indexTestUnit('''
-class A {
-  foo() {}
-  main() {
-    this.foo();
-  }
-}''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    Element methodElement = findElement("foo");
-    // verify
-    var location = _expectedLocation(mainElement, 'foo();');
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'field(); // q'));
     _assertRecordedRelation(
-        methodElement,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        location);
-    _assertNoRecordedRelation(
-        methodElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        location);
-  }
-
-  void test_isInvokedByQualified_MethodElement_propagatedType() {
-    _indexTestUnit('''
-class A {
-  foo() {}
-}
-main() {
-  var a = new A();
-  a.foo();
-}
-''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    Element methodElement = findElement("foo");
-    // verify
-    _assertRecordedRelation(
-        methodElement,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'foo();'));
-  }
-
-  void test_isInvokedByUnqualified_MethodElement() {
-    _indexTestUnit('''
-class A {
-  foo() {}
-  main() {
-    foo();
-  }
-}''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    Element methodElement = findElement("foo");
-    // verify
-    _assertRecordedRelation(
-        methodElement,
-        IndexConstants.IS_INVOKED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'foo();'));
+        getterElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'field(); // nq'));
   }
 
   void test_isInvokedBy_FunctionElement() {
-    _indexTestUnit('''
+    addSource('/lib.dart', '''
+library lib;
 foo() {}
+''');
+    _indexTestUnit('''
+import 'lib.dart';
+import 'lib.dart' as pref;
 main() {
-  foo();
+  pref.foo(); // q
+  foo(); // nq
 }''');
     // prepare elements
     Element mainElement = findElement("main");
-    FunctionElement functionElement = findElement("foo");
+    FunctionElement functionElement = importedUnit().functions[0];
     // verify
     _assertRecordedRelation(
         functionElement,
         IndexConstants.IS_INVOKED_BY,
-        _expectedLocation(mainElement, 'foo();'));
+        _expectedLocation(mainElement, 'foo(); // q'));
+    _assertRecordedRelation(
+        functionElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'foo(); // nq'));
   }
 
   void test_isInvokedBy_LocalVariableElement() {
@@ -409,6 +555,49 @@
         _expectedLocation(mainElement, 'v();'));
   }
 
+  void test_isInvokedBy_MethodElement() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+  main() {
+    this.foo(); // q
+    foo(); // nq
+  }
+}''');
+    // prepare elements
+    Element mainElement = findElement("main");
+    Element methodElement = findElement("foo");
+    // verify
+    _assertRecordedRelation(
+        methodElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'foo(); // q'));
+    _assertRecordedRelation(
+        methodElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocation(mainElement, 'foo(); // nq'));
+  }
+
+  void test_isInvokedBy_MethodElement_propagatedType() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+}
+main() {
+  var a = new A();
+  a.foo();
+}
+''');
+    // prepare elements
+    Element mainElement = findElement("main");
+    Element methodElement = findElement("foo");
+    // verify
+    _assertRecordedRelation(
+        methodElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'foo();'));
+  }
+
   void test_isInvokedBy_ParameterElement() {
     _indexTestUnit('''
 main(p()) {
@@ -424,6 +613,85 @@
         _expectedLocation(mainElement, 'p();'));
   }
 
+  void test_isInvokedBy_operator_binary() {
+    _indexTestUnit('''
+class A {
+  operator +(other) => this;
+}
+main(A a) {
+  print(a + 1);
+  a += 2;
+  ++a;
+  a++;
+}
+''');
+    // prepare elements
+    MethodElement element = findElement('+');
+    Element mainElement = findElement('main');
+    // verify
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+ 1', length: 1));
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+= 2', length: 2));
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++a;', length: 2));
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++;', length: 2));
+  }
+
+  void test_isInvokedBy_operator_index() {
+    _indexTestUnit('''
+class A {
+  operator [](i) => null;
+  operator []=(i, v) {}
+}
+main(A a) {
+  print(a[0]);
+  a[1] = 42;
+}
+''');
+    // prepare elements
+    MethodElement readElement = findElement("[]");
+    MethodElement writeElement = findElement("[]=");
+    Element mainElement = findElement('main');
+    // verify
+    _assertRecordedRelation(
+        readElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '[0]', length: 1));
+    _assertRecordedRelation(
+        writeElement,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '[1] =', length: 1));
+  }
+
+  void test_isInvokedBy_operator_prefix() {
+    _indexTestUnit('''
+class A {
+  A operator ~() => this;
+}
+main(A a) {
+  print(~a);
+}
+''');
+    // prepare elements
+    MethodElement element = findElement("~");
+    Element mainElement = findElement('main');
+    // verify
+    _assertRecordedRelation(
+        element,
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '~a', length: 1));
+  }
+
   void test_isMixedInBy_ClassDeclaration() {
     _indexTestUnit('''
 class A {} // 1
@@ -520,546 +788,6 @@
         _expectedLocation(mainElement, 'v += 1'));
   }
 
-  void test_isReferencedByQualifiedResolved_NameElement_field() {
-    _indexTestUnit('''
-class A {
-  int field;
-}
-main(A a) {
-  print(a.field);
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    Element nameElement = new NameElement('field');
-    // verify
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, 'field);'));
-  }
-
-  void test_isReferencedByQualifiedResolved_NameElement_method() {
-    _indexTestUnit('''
-class A {
-  method() {}
-}
-main(A a) {
-  a.method();
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    Element nameElement = new NameElement('method');
-    // verify
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, 'method();'));
-  }
-
-  void test_isReferencedByQualifiedResolved_NameElement_operator() {
-    _indexTestUnit('''
-class A {
-  operator +(o) {}
-  operator -(o) {}
-  operator ~() {}
-  operator ==(o) {}
-}
-main(A a) {
-  a + 5;
-  a += 5;
-  a == 5;
-  ++a;
-  --a;
-  ~a;
-  a++;
-  a--;
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    // binary
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '+ 5', '+'.length));
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '+= 5', '+='.length));
-    _assertRecordedRelation(
-        new NameElement('=='),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '== 5', '=='.length));
-    // prefix
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '++a', '++'.length));
-    _assertRecordedRelation(
-        new NameElement('-'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '--a', '--'.length));
-    _assertRecordedRelation(
-        new NameElement('~'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '~a', '~'.length));
-    // postfix
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '++;', '++'.length));
-    _assertRecordedRelation(
-        new NameElement('-'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED,
-        _expectedLocation(mainElement, '--;', '--'.length));
-  }
-
-  void test_isReferencedByQualifiedUnresolved_NameElement_field() {
-    _indexTestUnit('''
-class A {
-  int field;
-}
-main(var a) {
-  print(a.field);
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    FieldElement fieldElement = findElement('field');
-    Element nameElement = new NameElement('field');
-    // verify
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_DEFINED_BY,
-        _expectedLocation(fieldElement, 'field;'));
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, 'field);'));
-  }
-
-  void test_isReferencedByQualifiedUnresolved_NameElement_method() {
-    _indexTestUnit('''
-class A {
-  method() {}
-}
-main(var a) {
-  a.method();
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    MethodElement methodElement = findElement('method');
-    Element nameElement = new NameElement('method');
-    // verify
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_DEFINED_BY,
-        _expectedLocation(methodElement, 'method() {}'));
-    _assertRecordedRelation(
-        nameElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, 'method();'));
-  }
-
-  void test_isReferencedByQualifiedUnresolved_NameElement_operator() {
-    _indexTestUnit('''
-class A {
-  operator +(o) {}
-  operator -(o) {}
-  operator ~() {}
-  operator ==(o) {}
-}
-main(a) {
-  a + 5;
-  a += 5;
-  a == 5;
-  ++a;
-  --a;
-  ~a;
-  a++;
-  a--;
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    // binary
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '+ 5', '+'.length));
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '+= 5', '+='.length));
-    _assertRecordedRelation(
-        new NameElement('=='),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '== 5', '=='.length));
-    // prefix
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '++a', '++'.length));
-    _assertRecordedRelation(
-        new NameElement('-'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '--a', '--'.length));
-    _assertRecordedRelation(
-        new NameElement('~'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '~a', '~'.length));
-    // postfix
-    _assertRecordedRelation(
-        new NameElement('+'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '++;', '++'.length));
-    _assertRecordedRelation(
-        new NameElement('-'),
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED,
-        _expectedLocation(mainElement, '--;', '--'.length));
-  }
-
-  void test_isReferencedByQualified_ConstructorElement() {
-    _indexTestUnit('''
-class A implements B {
-  A() {}
-  A.foo() {}
-}
-class B extends A {
-  B() : super(); // marker-1
-  B.foo() : super.foo(); // marker-2
-  factory B.bar() = A.foo; // marker-3
-}
-main() {
-  new A(); // marker-main-1
-  new A.foo(); // marker-main-2
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    var isConstructor = (node) => node is ConstructorDeclaration;
-    ConstructorElement consA = findNodeElementAtString("A()", isConstructor);
-    ConstructorElement consA_foo =
-        findNodeElementAtString("A.foo()", isConstructor);
-    ConstructorElement consB = findNodeElementAtString("B()", isConstructor);
-    ConstructorElement consB_foo =
-        findNodeElementAtString("B.foo()", isConstructor);
-    ConstructorElement consB_bar =
-        findNodeElementAtString("B.bar()", isConstructor);
-    // A()
-    _assertRecordedRelation(
-        consA,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(consB, '(); // marker-1', 0));
-    _assertRecordedRelation(
-        consA,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, '(); // marker-main-1', 0));
-    // A.foo()
-    _assertRecordedRelation(
-        consA_foo,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(consB_foo, '.foo(); // marker-2', '.foo'.length));
-    _assertRecordedRelation(
-        consA_foo,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(consB_bar, '.foo; // marker-3', '.foo'.length));
-    _assertRecordedRelation(
-        consA_foo,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, '.foo(); // marker-main-2', '.foo'.length));
-  }
-
-  void test_isReferencedByQualified_ConstructorElement_classTypeAlias() {
-    _indexTestUnit('''
-class M {}
-class A implements B {
-  A() {}
-  A.named() {}
-}
-class B = A with M;
-main() {
-  new B(); // marker-main-1
-  new B.named(); // marker-main-2
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    var isConstructor = (node) => node is ConstructorDeclaration;
-    ConstructorElement consA = findNodeElementAtString("A()", isConstructor);
-    ConstructorElement consA_named =
-        findNodeElementAtString("A.named()", isConstructor);
-    // verify
-    _assertRecordedRelation(
-        consA,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, '(); // marker-main-1', 0));
-    _assertRecordedRelation(
-        consA_named,
-        IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, '.named(); // marker-main-2', '.named'.length));
-  }
-
-  void test_isReferencedByQualified_FieldElement() {
-    _indexTestUnit('''
-class A {
-  static var field;
-}
-main() {
-  A.field = 1;
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    FieldElement fieldElement = findElement('field');
-    PropertyAccessorElement setterElement = fieldElement.setter;
-    // verify
-    _assertRecordedRelation(
-        setterElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'field = 1'));
-  }
-
-  void test_isReferencedByQualified_MethodElement() {
-    _indexTestUnit('''
-class A {
-  foo() {}
-  main() {
-    print(this.foo);
-  }
-}
-''');
-    // prepare elements
-    Element fooElement = findElement('foo');
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        fooElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'foo);'));
-  }
-
-  void test_isReferencedByQualified_MethodElement_operator_binary() {
-    _indexTestUnit('''
-class A {
-  operator +(other) => this;
-}
-main(A a) {
-  print(a + 1);
-  a += 2;
-  ++a;
-  a++;
-}
-''');
-    // prepare elements
-    Element element = findElement('+');
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '+ 1', "+".length));
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '+= 2', "+=".length));
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '++a;', "++".length));
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '++;', "++".length));
-  }
-
-  void test_isReferencedByQualified_MethodElement_operator_index() {
-    _indexTestUnit('''
-class A {
-  operator [](i) => null;
-  operator []=(i, v) {}
-}
-main(A a) {
-  print(a[0]);
-  a[1] = 42;
-}
-''');
-    // prepare elements
-    MethodElement readElement = findElement("[]");
-    MethodElement writeElement = findElement("[]=");
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        readElement,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '[0]', "[".length));
-    _assertRecordedRelation(
-        writeElement,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '[1] =', "[".length));
-  }
-
-  void test_isReferencedByQualified_MethodElement_operator_prefix() {
-    _indexTestUnit('''
-class A {
-  A operator ~() => this;
-}
-main(A a) {
-  print(~a);
-}
-''');
-    // prepare elements
-    MethodElement element = findElement("~");
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_INVOKED_BY_QUALIFIED,
-        _expectedLocation(mainElement, '~a', "~".length));
-  }
-
-  void test_isReferencedByQualified_PropertyAccessorElement_method_getter() {
-    _indexTestUnit('''
-class A {
-  get foo => 42;
-  main() {
-    print(this.foo);
-  }
-}
-''');
-    // prepare elements
-    PropertyAccessorElement element = findNodeElementAtString('foo =>');
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'foo);'));
-    _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
-  }
-
-  void test_isReferencedByQualified_PropertyAccessorElement_method_setter() {
-    _indexTestUnit('''
-class A {
-  set foo(x) {}
-  main() {
-    this.foo = 42;
-  }
-}
-''');
-    // prepare elements
-    PropertyAccessorElement element = findNodeElementAtString('foo(x)');
-    Element mainElement = findElement('main');
-    // verify
-    _assertRecordedRelation(
-        element,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'foo = 42;'));
-    _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
-  }
-
-  void test_isReferencedByQualified_PropertyAccessorElement_topLevelField() {
-    addSource('/lib.dart', '''
-library lib;
-var myVar;
-''');
-    _indexTestUnit('''
-import 'lib.dart' as pref;
-main() {
-  pref.myVar = 1;
-  print(pref.myVar);
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    ImportElement importElement = testLibraryElement.imports[0];
-    CompilationUnitElement impUnit =
-        importElement.importedLibrary.definingCompilationUnit;
-    TopLevelVariableElement myVar = impUnit.topLevelVariables[0];
-    PropertyAccessorElement getter = myVar.getter;
-    PropertyAccessorElement setter = myVar.setter;
-    // verify
-    _assertRecordedRelation(
-        setter,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'myVar = 1'));
-    _assertRecordedRelation(
-        getter,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(mainElement, 'myVar);'));
-  }
-
-  void test_isReferencedByUnqualified_FieldElement() {
-    _indexTestUnit('''
-class A {
-  var field;
-  main() {
-    field = 5;
-    print(field);
-  }
-}''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    FieldElement fieldElement = findElement("field");
-    PropertyAccessorElement getter = fieldElement.getter;
-    PropertyAccessorElement setter = fieldElement.setter;
-    // verify
-    _assertRecordedRelation(
-        setter,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'field = 5'));
-    _assertRecordedRelation(
-        getter,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'field);'));
-  }
-
-  void test_isReferencedByUnqualified_MethodElement() {
-    _indexTestUnit('''
-class A {
-  method() {}
-  main() {
-    print(method);
-  }
-}''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    MethodElement methodElement = findElement("method");
-    // verify
-    _assertRecordedRelation(
-        methodElement,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'method);'));
-    _assertNoRecordedRelation(
-        methodElement,
-        IndexConstants.IS_REFERENCED_BY,
-        null);
-  }
-
-  void test_isReferencedByUnqualified_TopLevelVariableElement() {
-    _indexTestUnit('''
-var topVariable;
-main() {
-  topVariable = 5;
-  print(topVariable);
-}''');
-    // prepare elements
-    Element mainElement = findElement("main");
-    TopLevelVariableElement variableElement = findElement("topVariable");
-    // verify
-    _assertRecordedRelation(
-        variableElement.setter,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'topVariable = 5'));
-    _assertRecordedRelation(
-        variableElement.getter,
-        IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
-        _expectedLocation(mainElement, 'topVariable);'));
-  }
-
   void test_isReferencedBy_ClassElement() {
     _indexTestUnit('''
 class A {
@@ -1135,7 +863,88 @@
     _assertRecordedRelation(
         myUnitElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, "'my_unit.dart';", "'my_unit.dart'".length));
+        _expectedLocation(testUnitElement, "'my_unit.dart';", length: 14));
+  }
+
+  void test_isReferencedBy_ConstructorElement() {
+    _indexTestUnit('''
+class A implements B {
+  A() {}
+  A.foo() {}
+}
+class B extends A {
+  B() : super(); // marker-1
+  B.foo() : super.foo(); // marker-2
+  factory B.bar() = A.foo; // marker-3
+}
+main() {
+  new A(); // marker-main-1
+  new A.foo(); // marker-main-2
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    var isConstructor = (node) => node is ConstructorDeclaration;
+    ConstructorElement consA = findNodeElementAtString("A()", isConstructor);
+    ConstructorElement consA_foo =
+        findNodeElementAtString("A.foo()", isConstructor);
+    ConstructorElement consB = findNodeElementAtString("B()", isConstructor);
+    ConstructorElement consB_foo =
+        findNodeElementAtString("B.foo()", isConstructor);
+    ConstructorElement consB_bar =
+        findNodeElementAtString("B.bar()", isConstructor);
+    // A()
+    _assertRecordedRelation(
+        consA,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB, '(); // marker-1', length: 0));
+    _assertRecordedRelation(
+        consA,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '(); // marker-main-1', length: 0));
+    // A.foo()
+    _assertRecordedRelation(
+        consA_foo,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB_foo, '.foo(); // marker-2', length: 4));
+    _assertRecordedRelation(
+        consA_foo,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(consB_bar, '.foo; // marker-3', length: 4));
+    _assertRecordedRelation(
+        consA_foo,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '.foo(); // marker-main-2', length: 4));
+  }
+
+  void test_isReferencedBy_ConstructorElement_classTypeAlias() {
+    _indexTestUnit('''
+class M {}
+class A implements B {
+  A() {}
+  A.named() {}
+}
+class B = A with M;
+main() {
+  new B(); // marker-main-1
+  new B.named(); // marker-main-2
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    var isConstructor = (node) => node is ConstructorDeclaration;
+    ConstructorElement consA = findNodeElementAtString("A()", isConstructor);
+    ConstructorElement consA_named =
+        findNodeElementAtString("A.named()", isConstructor);
+    // verify
+    _assertRecordedRelation(
+        consA,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '(); // marker-main-1', length: 0));
+    _assertRecordedRelation(
+        consA_named,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, '.named(); // marker-main-2', length: 6));
   }
 
   void test_isReferencedBy_ConstructorFieldInitializer() {
@@ -1152,10 +961,46 @@
     // verify
     _assertRecordedRelation(
         fieldElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        IndexConstants.IS_REFERENCED_BY,
         _expectedLocation(constructorElement, 'field = 5'));
   }
 
+  void test_isReferencedBy_FieldElement() {
+    _indexTestUnit('''
+class A {
+  var field;
+  main() {
+    this.field = 5; // q
+    print(this.field); // q
+    field = 5; // nq
+    print(field); // nq
+  }
+}
+''');
+    // prepare elements
+    Element mainElement = findElement("main");
+    FieldElement fieldElement = findElement("field");
+    PropertyAccessorElement getter = fieldElement.getter;
+    PropertyAccessorElement setter = fieldElement.setter;
+    // verify
+    _assertRecordedRelation(
+        setter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocationQ(mainElement, 'field = 5; // q'));
+    _assertRecordedRelation(
+        getter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocationQ(mainElement, 'field); // q'));
+    _assertRecordedRelation(
+        setter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'field = 5; // nq'));
+    _assertRecordedRelation(
+        getter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'field); // nq'));
+  }
+
   void test_isReferencedBy_FieldFormalParameterElement() {
     _indexTestUnit('''
 class A {
@@ -1169,29 +1014,10 @@
     // verify
     _assertRecordedRelation(
         fieldElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
+        IndexConstants.IS_REFERENCED_BY,
         _expectedLocation(fieldParameterElement, 'field);'));
   }
 
-  void test_isReferencedBy_TopLevelVariableElement() {
-    addSource('/lib.dart', '''
-library lib;
-var V;
-''');
-    _indexTestUnit('''
-import 'lib.dart' show V; // imp
-''');
-    // prepare elements
-    var libElement = testLibraryElement.imports[0].importedLibrary;
-    var libUnit = libElement.definingCompilationUnit;
-    TopLevelVariableElement fieldElement = libUnit.topLevelVariables[0];
-    // verify
-    _assertRecordedRelation(
-        fieldElement,
-        IndexConstants.IS_REFERENCED_BY_QUALIFIED,
-        _expectedLocation(testUnitElement, 'V; // imp'));
-  }
-
   void test_isReferencedBy_FunctionElement() {
     _indexTestUnit('''
 foo() {}
@@ -1259,28 +1085,28 @@
     _assertRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'myVar = 1;', 0));
+        _expectedLocation(mainElement, 'myVar = 1;', length: 0));
     _assertRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'myFunction();', 0));
+        _expectedLocation(mainElement, 'myFunction();', length: 0));
     _assertNoRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'print(0);', 0));
+        _expectedLocation(mainElement, 'print(0);', length: 0));
     // no references from import combinators
     _assertNoRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, 'myVar, ', 0));
+        _expectedLocation(testUnitElement, 'myVar, ', length: 0));
     _assertNoRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, 'myFunction hide', 0));
+        _expectedLocation(testUnitElement, 'myFunction hide', length: 0));
     _assertNoRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, 'myToHide;', 0));
+        _expectedLocation(testUnitElement, 'myToHide;', length: 0));
   }
 
   void test_isReferencedBy_ImportElement_withPrefix() {
@@ -1308,11 +1134,11 @@
     _assertRecordedRelation(
         importElementA,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.myVar = 1;', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.myVar = 1;', length: 5));
     _assertRecordedRelation(
         importElementB,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.MyClass();', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.MyClass();', length: 5));
   }
 
   void test_isReferencedBy_ImportElement_withPrefix_combinators() {
@@ -1339,11 +1165,11 @@
     _assertRecordedRelation(
         importElementA,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.A();', length: 5));
     _assertRecordedRelation(
         importElementB,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.B();', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.B();', length: 5));
   }
 
   void test_isReferencedBy_ImportElement_withPrefix_invocation() {
@@ -1364,7 +1190,7 @@
     _assertRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.myFunc();', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.myFunc();', length: 5));
   }
 
   void test_isReferencedBy_ImportElement_withPrefix_oneCandidate() {
@@ -1386,7 +1212,7 @@
     _assertRecordedRelation(
         importElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
+        _expectedLocation(mainElement, 'pref.A();', length: 5));
   }
 
   void test_isReferencedBy_ImportElement_withPrefix_unresolvedElement() {
@@ -1453,7 +1279,7 @@
     _assertRecordedRelation(
         libUnitElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
+        _expectedLocation(testUnitElement, "'lib.dart'", length: 10));
   }
 
   void test_isReferencedBy_LibraryElement_import() {
@@ -1470,7 +1296,30 @@
     _assertRecordedRelation(
         libUnitElement,
         IndexConstants.IS_REFERENCED_BY,
-        _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
+        _expectedLocation(testUnitElement, "'lib.dart'", length: 10));
+  }
+
+  void test_isReferencedBy_MethodElement() {
+    _indexTestUnit('''
+class A {
+  method() {}
+  main() {
+    print(this.method); // q
+    print(method); // nq
+  }
+}''');
+    // prepare elements
+    Element mainElement = findElement("main");
+    MethodElement methodElement = findElement("method");
+    // verify
+    _assertRecordedRelation(
+        methodElement,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocationQ(mainElement, 'method); // q'));
+    _assertRecordedRelation(
+        methodElement,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'method); // nq'));
   }
 
   void test_isReferencedBy_ParameterElement() {
@@ -1490,6 +1339,46 @@
         _expectedLocation(mainElement, 'p: 1'));
   }
 
+  void test_isReferencedBy_TopLevelVariableElement() {
+    addSource('/lib.dart', '''
+library lib;
+var V;
+''');
+    _indexTestUnit('''
+import 'lib.dart' show V; // imp
+import 'lib.dart' as pref;
+main() {
+  pref.V = 5; // q
+  print(pref.V); // q
+  V = 5; // nq
+  print(V); // nq
+}''');
+    // prepare elements
+    TopLevelVariableElement variable = importedUnit().topLevelVariables[0];
+    Element mainElement = findElement("main");
+    // verify
+    _assertRecordedRelation(
+        variable,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(testUnitElement, 'V; // imp'));
+    _assertRecordedRelation(
+        variable.setter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'V = 5; // q'));
+    _assertRecordedRelation(
+        variable.getter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'V); // q'));
+    _assertRecordedRelation(
+        variable.setter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'V = 5; // nq'));
+    _assertRecordedRelation(
+        variable.getter,
+        IndexConstants.IS_REFERENCED_BY,
+        _expectedLocation(mainElement, 'V); // nq'));
+  }
+
   void test_isReferencedBy_TypeParameterElement() {
     _indexTestUnit('''
 class A<T> {
@@ -1625,16 +1514,16 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_INVOKED_BY_RESOLVED,
-        _expectedLocation(mainElement, 'test(1)'));
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'test(1)'));
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED,
-        _expectedLocation(mainElement, 'test(2)'));
+        IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, 'test(2)'));
     _assertNoRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_READ_BY_UNRESOLVED,
-        _expectedLocation(mainElement, 'test(2)'));
+        IndexConstants.IS_READ_BY,
+        _expectedLocationQU(mainElement, 'test(2)'));
   }
 
   void test_nameIsReadBy() {
@@ -1652,12 +1541,12 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_READ_BY_RESOLVED,
-        _expectedLocation(mainElement, 'test); // a'));
+        IndexConstants.IS_READ_BY,
+        _expectedLocationQ(mainElement, 'test); // a'));
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_READ_BY_UNRESOLVED,
-        _expectedLocation(mainElement, 'test); // p'));
+        IndexConstants.IS_READ_BY,
+        _expectedLocationQU(mainElement, 'test); // p'));
   }
 
   void test_nameIsReadWrittenBy() {
@@ -1675,12 +1564,12 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED,
-        _expectedLocation(mainElement, 'test += 1'));
+        IndexConstants.IS_READ_WRITTEN_BY,
+        _expectedLocationQ(mainElement, 'test += 1'));
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED,
-        _expectedLocation(mainElement, 'test += 2'));
+        IndexConstants.IS_READ_WRITTEN_BY,
+        _expectedLocationQU(mainElement, 'test += 2'));
   }
 
   void test_nameIsWrittenBy() {
@@ -1698,12 +1587,12 @@
     // verify
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED,
-        _expectedLocation(mainElement, 'test = 1'));
+        IndexConstants.IS_WRITTEN_BY,
+        _expectedLocationQ(mainElement, 'test = 1'));
     _assertRecordedRelation(
         nameElement,
-        IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED,
-        _expectedLocation(mainElement, 'test = 2'));
+        IndexConstants.IS_WRITTEN_BY,
+        _expectedLocationQU(mainElement, 'test = 2'));
   }
 
   void test_nullUnit() {
@@ -1762,13 +1651,37 @@
     return null;
   }
 
-  ExpectedLocation _expectedLocation(Element element, String search, [int length
-      = -1]) {
+  ExpectedLocation _expectedLocation(Element element, String search,
+      {int length: -1, bool isQualified: false, bool isResolved: true}) {
     int offset = findOffset(search);
     if (length == -1) {
       length = getLeadingIdentifierLength(search);
     }
-    return new ExpectedLocation(element, offset, length);
+    return new ExpectedLocation(
+        element,
+        offset,
+        length,
+        isQualified,
+        isResolved);
+  }
+
+  ExpectedLocation _expectedLocationQ(Element element, String search,
+      {int length: -1}) {
+    return _expectedLocation(
+        element,
+        search,
+        length: length,
+        isQualified: true);
+  }
+
+  ExpectedLocation _expectedLocationQU(Element element, String search,
+      {int length: -1}) {
+    return _expectedLocation(
+        element,
+        search,
+        length: length,
+        isQualified: true,
+        isResolved: false);
   }
 
   void _indexTestUnit(String code) {
@@ -1781,12 +1694,16 @@
   Element element;
   int offset;
   int length;
+  bool isQualified;
+  bool isResolved;
 
-  ExpectedLocation(this.element, this.offset, this.length);
+  ExpectedLocation(this.element, this.offset, this.length, this.isQualified,
+      this.isResolved);
 
   @override
   String toString() {
-    return 'ExpectedLocation(element=$element; offset=$offset; length=$length)';
+    return 'ExpectedLocation(element=$element; offset=$offset; length=$length;'
+        ' isQualified=$isQualified isResolved=$isResolved)';
   }
 }
 
@@ -1808,6 +1725,7 @@
   @override
   String toString() {
     return 'RecordedRelation(element=$element; relationship=$relationship; '
-        'location=$location)';
+        'location=$location; flags=' '${location.isQualified ? "Q" : ""}'
+        '${location.isResolved ? "R" : ""})';
   }
 }
diff --git a/pkg/analysis_services/test/index/local_index_test.dart b/pkg/analysis_services/test/index/local_index_test.dart
index f4be0a6..d6e4b77 100644
--- a/pkg/analysis_services/test/index/local_index_test.dart
+++ b/pkg/analysis_services/test/index/local_index_test.dart
@@ -134,8 +134,9 @@
   }
 
   Future<List<Location>> _getDefinedFunctions() {
-    return index.getRelationships(UniverseElement.INSTANCE,
-        IndexConstants.DEFINES_FUNCTION);
+    return index.getRelationships(
+        UniverseElement.INSTANCE,
+        IndexConstants.DEFINES);
   }
 
   Source _indexLibraryUnit(String path, String content) {
diff --git a/pkg/analysis_services/test/index/store/codec_test.dart b/pkg/analysis_services/test/index/store/codec_test.dart
index c72cb60..6664b90 100644
--- a/pkg/analysis_services/test/index/store/codec_test.dart
+++ b/pkg/analysis_services/test/index/store/codec_test.dart
@@ -105,6 +105,30 @@
     }
   }
 
+  void test_encodeHash_notLocal() {
+    resolveTestUnit('''
+class A {
+  void mainA() {
+    int foo; // A
+  }
+  void mainB() {
+    int foo; // B
+    int bar;
+  }
+}
+''');
+    MethodElement mainA = findElement('mainA');
+    MethodElement mainB = findElement('mainB');
+    Element fooA = mainA.localVariables[0];
+    Element fooB = mainB.localVariables[0];
+    Element bar = mainB.localVariables[1];
+    int id_fooA = codec.encodeHash(fooA);
+    int id_fooB = codec.encodeHash(fooB);
+    int id_bar = codec.encodeHash(bar);
+    expect(id_fooA == id_fooB, isTrue);
+    expect(id_fooA == id_bar, isFalse);
+  }
+
   void test_localLocalVariable() {
     resolveTestUnit('''
 main() {
diff --git a/pkg/analysis_services/test/index/store/split_store_test.dart b/pkg/analysis_services/test/index/store/split_store_test.dart
index 51c4474..b0bdfd1 100644
--- a/pkg/analysis_services/test/index/store/split_store_test.dart
+++ b/pkg/analysis_services/test/index/store/split_store_test.dart
@@ -42,16 +42,27 @@
 }
 
 
-void _assertHasLocation(List<Location> locations, Element element, int offset,
+void _assertHasLocationQ(List<Location> locations, Element element, int offset,
     int length) {
+  _assertHasLocation(locations, element, offset, length, isQualified: true);
+}
+
+
+void _assertHasLocation(List<Location> locations, Element element, int offset,
+    int length, {bool isQualified: false,
+      bool isResolved: true}) {
   for (Location location in locations) {
-    if ((element == null || location.element == element) && location.offset ==
-        offset && location.length == length) {
+    if ((element == null || location.element == element) &&
+        location.offset == offset &&
+        location.length == length &&
+        location.isQualified == isQualified &&
+        location.isResolved == isResolved) {
       return;
     }
   }
-  fail('Expected to find Location'
-      '(element=$element, offset=$offset, length=$length)');
+  fail(
+      'Expected to find Location'
+          '(element=$element, offset=$offset, length=$length)');
 }
 
 
@@ -73,8 +84,13 @@
 
   void setUp() {
     relationshipCodec = new RelationshipCodec(stringCodec);
-    nodeManager = new FileNodeManager(fileManager, logger, stringCodec,
-        contextCodec, elementCodec, relationshipCodec);
+    nodeManager = new FileNodeManager(
+        fileManager,
+        logger,
+        stringCodec,
+        contextCodec,
+        elementCodec,
+        relationshipCodec);
     when(contextCodec.encode(context)).thenReturn(contextId);
     when(contextCodec.decode(contextId)).thenReturn(context);
   }
@@ -119,8 +135,8 @@
   test_getNode_invalidVersion() {
     String name = '42.index';
     // prepare a stream with an invalid version
-    when(fileManager.read(name)).thenReturn(new Future.value([0x01, 0x02, 0x03,
-        0x04]));
+    when(
+        fileManager.read(name)).thenReturn(new Future.value([0x01, 0x02, 0x03, 0x04]));
     // do in the Future
     return nodeManager.getNode(name).then((IndexNode node) {
       // no IndexNode
@@ -180,10 +196,11 @@
       int elementIdB = 1;
       int elementIdC = 2;
       int relationshipId = relationshipCodec.encode(relationship);
-      RelationKeyData key = new RelationKeyData.forData(elementIdA,
-          relationshipId);
-      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
-          10), new LocationData.forData(elementIdC, 2, 20)];
+      RelationKeyData key =
+          new RelationKeyData.forData(elementIdA, relationshipId);
+      List<LocationData> locations = [
+          new LocationData.forData(elementIdB, 1, 10, 2),
+          new LocationData.forData(elementIdC, 2, 20, 3)];
       Map<RelationKeyData, List<LocationData>> relations = {
         key: locations
       };
@@ -205,11 +222,11 @@
       return nodeManager.getNode(name).then((IndexNode node) {
         expect(2, node.locationCount);
         {
-          List<Location> locations = node.getRelationships(elementA,
-              relationship);
+          List<Location> locations =
+              node.getRelationships(elementA, relationship);
           expect(locations, hasLength(2));
           _assertHasLocation(locations, elementB, 1, 10);
-          _assertHasLocation(locations, elementC, 2, 20);
+          _assertHasLocationQ(locations, elementC, 2, 20);
         }
       });
     });
@@ -309,10 +326,11 @@
       int elementIdB = 1;
       int elementIdC = 2;
       int relationshipId = relationshipCodec.encode(relationship);
-      RelationKeyData key = new RelationKeyData.forData(elementIdA,
-          relationshipId);
-      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
-          10), new LocationData.forData(elementIdC, 2, 20)];
+      RelationKeyData key =
+          new RelationKeyData.forData(elementIdA, relationshipId);
+      List<LocationData> locations = [
+          new LocationData.forData(elementIdB, 1, 10, 2),
+          new LocationData.forData(elementIdC, 2, 20, 3)];
       node.relations = {
         key: locations
       };
@@ -321,7 +339,7 @@
     List<Location> locations = node.getRelationships(elementA, relationship);
     expect(locations, hasLength(2));
     _assertHasLocation(locations, elementB, 1, 10);
-    _assertHasLocation(locations, elementC, 2, 20);
+    _assertHasLocationQ(locations, elementC, 2, 20);
   }
 
   Element _mockElement() {
@@ -343,11 +361,13 @@
   void test_newForData() {
     Element element = new MockElement();
     when(elementCodec.decode(context, 0)).thenReturn(element);
-    LocationData locationData = new LocationData.forData(0, 1, 2);
+    LocationData locationData = new LocationData.forData(0, 1, 2, 0);
     Location location = locationData.getLocation(context, elementCodec);
     expect(location.element, element);
     expect(location.offset, 1);
     expect(location.length, 2);
+    expect(location.isQualified, isFalse);
+    expect(location.isResolved, isFalse);
   }
 
   void test_newForObject() {
@@ -357,12 +377,12 @@
     when(elementCodec.decode(context, 42)).thenReturn(element);
     // create
     Location location = new Location(element, 1, 2);
-    LocationData locationData = new LocationData.forObject(elementCodec,
-        location);
+    LocationData locationData =
+        new LocationData.forObject(elementCodec, location);
     // touch 'hashCode'
     locationData.hashCode;
     // ==
-    expect(locationData == new LocationData.forData(42, 1, 2), isTrue);
+    expect(locationData == new LocationData.forData(42, 1, 2, 2), isTrue);
     // getLocation()
     {
       Location newLocation = locationData.getLocation(context, elementCodec);
@@ -398,8 +418,9 @@
   @override
   bool operator ==(Object other) {
     if (other is _LocationEqualsWrapper) {
-      return other.location.offset == location.offset && other.location.length
-          == location.length && other.location.element == location.element;
+      return other.location.offset == location.offset &&
+          other.location.length == location.length &&
+          other.location.element == location.element;
     }
     return false;
   }
@@ -448,15 +469,20 @@
     int relationshipId = 1;
     when(relationshipCodec.encode(relationship)).thenReturn(relationshipId);
     // create RelationKeyData
-    RelationKeyData keyData = new RelationKeyData.forObject(elementCodec,
-        relationshipCodec, element, relationship);
+    RelationKeyData keyData =
+        new RelationKeyData.forObject(
+            elementCodec,
+            relationshipCodec,
+            element,
+            relationship);
     // touch
     keyData.hashCode;
     // equals
     expect(keyData == this, isFalse);
     expect(keyData == new RelationKeyData.forData(10, 20), isFalse);
     expect(keyData == keyData, isTrue);
-    expect(keyData == new RelationKeyData.forData(elementId, relationshipId),
+    expect(
+        keyData == new RelationKeyData.forData(elementId, relationshipId),
         isTrue);
   }
 }
@@ -477,14 +503,14 @@
 
   Element elementC = new MockElement('elementC');
   Element elementD = new MockElement('elementD');
-  ElementLocation elementLocationA = new ElementLocationImpl.con3(
-      ['/home/user/sourceA.dart', 'ClassA']);
-  ElementLocation elementLocationB = new ElementLocationImpl.con3(
-      ['/home/user/sourceB.dart', 'ClassB']);
-  ElementLocation elementLocationC = new ElementLocationImpl.con3(
-      ['/home/user/sourceC.dart', 'ClassC']);
-  ElementLocation elementLocationD = new ElementLocationImpl.con3(
-      ['/home/user/sourceD.dart', 'ClassD']);
+  ElementLocation elementLocationA =
+      new ElementLocationImpl.con3(['/home/user/sourceA.dart', 'ClassA']);
+  ElementLocation elementLocationB =
+      new ElementLocationImpl.con3(['/home/user/sourceB.dart', 'ClassB']);
+  ElementLocation elementLocationC =
+      new ElementLocationImpl.con3(['/home/user/sourceC.dart', 'ClassC']);
+  ElementLocation elementLocationD =
+      new ElementLocationImpl.con3(['/home/user/sourceD.dart', 'ClassD']);
   HtmlElement htmlElementA = new MockHtmlElement();
   HtmlElement htmlElementB = new MockHtmlElement();
   LibraryElement libraryElement = new MockLibraryElement();
@@ -565,14 +591,16 @@
   }
 
   Future test_aboutToIndexDart_library_first() {
-    when(libraryElement.parts).thenReturn(<CompilationUnitElement>[unitElementA,
-        unitElementB]);
+    when(
+        libraryElement.parts).thenReturn(
+            <CompilationUnitElement>[unitElementA, unitElementB]);
     {
       store.aboutToIndexDart(contextA, libraryUnitElement);
       store.doneIndex();
     }
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, []);
     });
   }
@@ -591,8 +619,9 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
       // apply "libraryUnitElement", only with "B"
       when(libraryElement.parts).thenReturn([unitElementB]);
@@ -601,8 +630,9 @@
         store.doneIndex();
       }
     }).then((_) {
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
     });
@@ -636,8 +666,9 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
   }
@@ -659,8 +690,9 @@
   }
 
   test_getRelationships_empty() {
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       expect(locations, isEmpty);
     });
   }
@@ -718,8 +750,9 @@
       store.recordRelationship(elementA, relationship, locationB);
       store.doneIndex();
     }
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
   }
@@ -729,8 +762,9 @@
     store.aboutToIndexDart(contextA, unitElementA);
     store.recordRelationship(elementA, relationship, locationA);
     store.doneIndex();
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA]);
     });
   }
@@ -742,8 +776,9 @@
     store.recordRelationship(elementA, relationship, locationA);
     store.recordRelationship(elementA, relationship, locationB);
     store.doneIndex();
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     });
   }
@@ -762,14 +797,16 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
       // remove "A" context
       store.removeContext(contextA);
     }).then((_) {
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, []);
       });
     });
@@ -799,14 +836,16 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "librarySource"
       store.removeSource(contextA, librarySource);
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, []);
       });
     });
@@ -836,14 +875,16 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "A" source
       store.removeSource(contextA, sourceA);
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB, locationC]);
       });
     });
@@ -863,14 +904,16 @@
       store.doneIndex();
     }
     // "A" and "B" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "librarySource"
       store.removeSources(contextA, new SingleSourceContainer(librarySource));
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, []);
       });
     });
@@ -900,15 +943,17 @@
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store.getRelationships(elementA, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        elementA,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB, locationC]);
     }).then((_) {
       // remove "A" source
       store.removeSources(contextA, new SingleSourceContainer(sourceA));
       store.removeSource(contextA, sourceA);
-      return store.getRelationships(elementA, relationship).then(
-          (List<Location> locations) {
+      return store.getRelationships(
+          elementA,
+          relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB, locationC]);
       });
     });
@@ -921,25 +966,31 @@
     Location locationB = mockLocation(elementB);
     {
       store.aboutToIndexDart(contextA, unitElementA);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationA);
       store.doneIndex();
     }
     {
       store.aboutToIndexDart(contextB, unitElementB);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationB);
       store.doneIndex();
     }
     // get relationships
-    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // re-index "unitElementA"
       store.aboutToIndexDart(contextA, unitElementA);
       store.doneIndex();
-      return store.getRelationships(UniverseElement.INSTANCE,
+      return store.getRelationships(
+          UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -953,23 +1004,29 @@
     Location locationB = mockLocation(elementB);
     {
       store.aboutToIndexDart(contextA, unitElementA);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationA);
       store.doneIndex();
     }
     {
       store.aboutToIndexDart(contextA, unitElementB);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationB);
       store.doneIndex();
     }
-    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // clear
       store.clear();
-      return store.getRelationships(UniverseElement.INSTANCE,
+      return store.getRelationships(
+          UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         expect(locations, isEmpty);
       });
@@ -983,23 +1040,29 @@
     Location locationB = mockLocation(elementB);
     {
       store.aboutToIndexDart(contextA, unitElementA);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationA);
       store.doneIndex();
     }
     {
       store.aboutToIndexDart(contextB, unitElementB);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationB);
       store.doneIndex();
     }
-    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "contextA"
       store.removeContext(contextA);
-      return store.getRelationships(UniverseElement.INSTANCE,
+      return store.getRelationships(
+          UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -1013,23 +1076,29 @@
     Location locationB = mockLocation(elementB);
     {
       store.aboutToIndexDart(contextA, unitElementA);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationA);
       store.doneIndex();
     }
     {
       store.aboutToIndexDart(contextA, unitElementB);
-      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+      store.recordRelationship(
+          UniverseElement.INSTANCE,
+          relationship,
           locationB);
       store.doneIndex();
     }
-    return store.getRelationships(UniverseElement.INSTANCE, relationship).then(
-        (List<Location> locations) {
+    return store.getRelationships(
+        UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
       assertLocations(locations, [locationA, locationB]);
     }).then((_) {
       // remove "sourceA"
       store.removeSource(contextA, sourceA);
-      return store.getRelationships(UniverseElement.INSTANCE,
+      return store.getRelationships(
+          UniverseElement.INSTANCE,
           relationship).then((List<Location> locations) {
         assertLocations(locations, [locationB]);
       });
@@ -1054,6 +1123,8 @@
     when(location.element).thenReturn(element);
     when(location.offset).thenReturn(0);
     when(location.length).thenReturn(0);
+    when(location.isQualified).thenReturn(true);
+    when(location.isResolved).thenReturn(true);
     return location;
   }
 
diff --git a/pkg/analysis_services/test/search/hierarchy_test.dart b/pkg/analysis_services/test/search/hierarchy_test.dart
new file mode 100644
index 0000000..a83312c
--- /dev/null
+++ b/pkg/analysis_services/test/search/hierarchy_test.dart
@@ -0,0 +1,300 @@
+// Copyright (c) 2014, 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.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library test.services.src.search.hierarchy;
+
+import 'dart:async';
+
+import 'package:analysis_services/index/index.dart';
+import 'package:analysis_services/index/local_memory_index.dart';
+import 'package:analysis_services/search/hierarchy.dart';
+import 'package:analysis_services/src/search/search_engine.dart';
+import 'package:analysis_testing/reflective_tests.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:unittest/unittest.dart';
+
+import '../index/abstract_single_unit.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('HierarchyTest', () {
+    runReflectiveTests(HierarchyTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class HierarchyTest extends AbstractSingleUnitTest {
+  Index index;
+  SearchEngineImpl searchEngine;
+
+  void setUp() {
+    super.setUp();
+    index = createLocalMemoryIndex();
+    searchEngine = new SearchEngineImpl(index);
+  }
+
+  void test_getDirectMembers() {
+    _indexTestUnit('''
+class A {
+  A() {}
+  var ma1;
+  ma2() {}
+}
+class B extends A {
+  B() {}
+  B.named() {}
+  var mb1;
+  mb2() {}
+}
+''');
+    {
+      ClassElement classA = findElement('A');
+      List<Element> members = getClassMembers(classA);
+      expect(members.map((e) => e.name), unorderedEquals(['ma1', 'ma2']));
+    }
+    {
+      ClassElement classB = findElement('B');
+      List<Element> members = getClassMembers(classB);
+      expect(members.map((e) => e.name), unorderedEquals(['mb1', 'mb2']));
+    }
+  }
+
+  Future test_getHierarchyMembers_constructors() {
+    _indexTestUnit('''
+class A {
+  A() {}
+}
+class B extends A {
+  B() {}
+}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassMemberElement memberA = classA.constructors[0];
+    ClassMemberElement memberB = classB.constructors[0];
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+      expect(members, unorderedEquals([memberA]));
+    });
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+      expect(members, unorderedEquals([memberB]));
+    });
+    return Future.wait([futureA, futureB]);
+  }
+
+  Future test_getHierarchyMembers_fields() {
+    _indexTestUnit('''
+class A {
+  int foo;
+}
+class B extends A {
+  get foo => null;
+}
+class C extends B {
+  set foo(x) {}
+}
+class D {
+  int foo;
+}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassElement classD = findElement("D");
+    ClassElement classE = findElement("E");
+    ClassMemberElement memberA = classA.fields[0];
+    ClassMemberElement memberB = classB.fields[0];
+    ClassMemberElement memberC = classC.fields[0];
+    ClassMemberElement memberD = classD.fields[0];
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+      expect(members, unorderedEquals([memberD]));
+    });
+    return Future.wait([futureA, futureB, futureC, futureD]);
+  }
+
+  Future test_getHierarchyMembers_methods() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+}
+class B extends A {
+  foo() {}
+}
+class C extends B {
+  foo() {}
+}
+class D {
+  foo() {}
+}
+class E extends D {
+  foo() {}
+}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassElement classD = findElement("D");
+    ClassElement classE = findElement("E");
+    ClassMemberElement memberA = classA.methods[0];
+    ClassMemberElement memberB = classB.methods[0];
+    ClassMemberElement memberC = classC.methods[0];
+    ClassMemberElement memberD = classD.methods[0];
+    ClassMemberElement memberE = classE.methods[0];
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureC = getHierarchyMembers(searchEngine, memberC).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberC]));
+    });
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+      expect(members, unorderedEquals([memberD, memberE]));
+    });
+    var futureE = getHierarchyMembers(searchEngine, memberE).then((members) {
+      expect(members, unorderedEquals([memberD, memberE]));
+    });
+    return Future.wait([futureA, futureB, futureC, futureD, futureE]);
+  }
+
+  Future test_getHierarchyMembers_withInterfaces() {
+    _indexTestUnit('''
+class A {
+  foo() {}
+}
+class B implements A {
+  foo() {}
+}
+abstract class C implements A {
+}
+class D extends C {
+  foo() {}
+}
+class E {
+  foo() {}
+}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassElement classD = findElement("D");
+    ClassElement classE = findElement("E");
+    ClassMemberElement memberA = classA.methods[0];
+    ClassMemberElement memberB = classB.methods[0];
+    ClassMemberElement memberD = classD.methods[0];
+    var futureA = getHierarchyMembers(searchEngine, memberA).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberD]));
+    });
+    var futureB = getHierarchyMembers(searchEngine, memberB).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberD]));
+    });
+    var futureD = getHierarchyMembers(searchEngine, memberD).then((members) {
+      expect(members, unorderedEquals([memberA, memberB, memberD]));
+    });
+    return Future.wait([futureA, futureB, futureD]);
+  }
+
+  Future test_getSubClasses() {
+    _indexTestUnit('''
+class A {}
+class B extends A {}
+class C extends B {}
+class D extends B implements A {}
+class M {}
+class E extends A with M {}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassElement classD = findElement("D");
+    ClassElement classM = findElement("M");
+    ClassElement classE = findElement("E");
+    var futureA = getSubClasses(searchEngine, classA).then((subs) {
+      expect(subs, unorderedEquals([classB, classC, classD, classE]));
+    });
+    var futureB = getSubClasses(searchEngine, classB).then((subs) {
+      expect(subs, unorderedEquals([classC, classD]));
+    });
+    var futureC = getSubClasses(searchEngine, classC).then((subs) {
+      expect(subs, isEmpty);
+    });
+    var futureM = getSubClasses(searchEngine, classM).then((subs) {
+      expect(subs, unorderedEquals([classE]));
+    });
+    return Future.wait([futureA, futureB, futureC, futureM]);
+  }
+
+  void test_getSuperClasses() {
+    _indexTestUnit('''
+class A {}
+class B extends A {}
+class C extends B {}
+class D extends B implements A {}
+class M {}
+class E extends A with M {}
+class F implements A {}
+''');
+    ClassElement classA = findElement("A");
+    ClassElement classB = findElement("B");
+    ClassElement classC = findElement("C");
+    ClassElement classD = findElement("D");
+    ClassElement classE = findElement("E");
+    ClassElement classF = findElement("F");
+    ClassElement objectElement = classA.supertype.element;
+    // Object
+    {
+      Set<ClassElement> supers = getSuperClasses(objectElement);
+      expect(supers, isEmpty);
+    }
+    // A
+    {
+      Set<ClassElement> supers = getSuperClasses(classA);
+      expect(supers, unorderedEquals([objectElement]));
+    }
+    // B
+    {
+      Set<ClassElement> supers = getSuperClasses(classB);
+      expect(supers, unorderedEquals([objectElement, classA]));
+    }
+    // C
+    {
+      Set<ClassElement> supers = getSuperClasses(classC);
+      expect(supers, unorderedEquals([objectElement, classA, classB]));
+    }
+    // D
+    {
+      Set<ClassElement> supers = getSuperClasses(classD);
+      expect(supers, unorderedEquals([objectElement, classA, classB]));
+    }
+    // E
+    {
+      Set<ClassElement> supers = getSuperClasses(classE);
+      expect(supers, unorderedEquals([objectElement, classA]));
+    }
+    // F
+    {
+      Set<ClassElement> supers = getSuperClasses(classF);
+      expect(supers, unorderedEquals([objectElement, classA]));
+    }
+  }
+
+  void _indexTestUnit(String code) {
+    resolveTestUnit(code);
+    index.indexUnit(context, testUnit);
+  }
+}
diff --git a/pkg/analysis_services/test/search/search_engine_test.dart b/pkg/analysis_services/test/search/search_engine_test.dart
index f6d02de9..df96e48 100644
--- a/pkg/analysis_services/test/search/search_engine_test.dart
+++ b/pkg/analysis_services/test/search/search_engine_test.dart
@@ -5,7 +5,7 @@
 // This code was auto-generated, is not intended to be edited, and is subject to
 // significant change. Please see the README file for more information.
 
-library services.src.search.search_engine_test;
+library test.services.src.search.search_engine;
 
 import 'dart:async';
 
@@ -130,13 +130,57 @@
     ClassElement elementA = findElement('A');
     ClassElement elementB = findElement('B');
     var expected = [
-        _expectId(elementA.methods[0], MatchKind.NAME_DECLARATION, 'test() {}'),
-        _expectId(elementB.fields[0], MatchKind.NAME_DECLARATION, 'test = 42;')];
+        _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
+        _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 42;')];
     return searchEngine.searchMemberDeclarations('test').then((matches) {
       _assertMatches(matches, expected);
     });
   }
 
+  Future test_searchMemberReferences() {
+    _indexTestUnit('''
+class A {
+  var test; // A
+  mainA() {
+    test(); // a-inv-r-nq
+    test = 1; // a-write-r-nq
+    test += 2; // a-read-write-r-nq
+    print(test); // a-read-r-nq
+  }
+}
+main(A a, p) {
+  a.test(); // a-inv-r-q
+  a.test = 1; // a-write-r-q
+  a.test += 2; // a-read-write-r-q
+  print(a.test); // a-read-r-q
+  p.test(); // p-inv-ur-q
+  p.test = 1; // p-write-ur-q
+  p.test += 2; // p-read-write-ur-q
+  print(p.test); // p-read-ur-q
+}
+''');
+    ClassElement elementA = findElement('A');
+    ClassElement elementB = findElement('B');
+    Element mainA = findElement('mainA');
+    Element main = findElement('main');
+    var expected = [
+        _expectId(mainA, MatchKind.INVOCATION, 'test(); // a-inv-r-nq'),
+        _expectId(mainA, MatchKind.WRITE, 'test = 1; // a-write-r-nq'),
+        _expectId(mainA, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-nq'),
+        _expectId(mainA, MatchKind.READ, 'test); // a-read-r-nq'),
+        _expectIdQ(main, MatchKind.INVOCATION, 'test(); // a-inv-r-q'),
+        _expectIdQ(main, MatchKind.WRITE, 'test = 1; // a-write-r-q'),
+        _expectIdQ(main, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-q'),
+        _expectIdQ(main, MatchKind.READ, 'test); // a-read-r-q'),
+        _expectIdU(main, MatchKind.INVOCATION, 'test(); // p-inv-ur-q'),
+        _expectIdU(main, MatchKind.WRITE, 'test = 1; // p-write-ur-q'),
+        _expectIdU(main, MatchKind.READ_WRITE, 'test += 2; // p-read-write-ur-q'),
+        _expectIdU(main, MatchKind.READ, 'test); // p-read-ur-q'),];
+    return searchEngine.searchMemberReferences('test').then((matches) {
+      _assertMatches(matches, expected);
+    });
+  }
+
   Future test_searchReferences_AngularComponentElement() {
     // use mocks
     index = new MockIndex();
@@ -175,8 +219,8 @@
     Element pElement = findElement('p');
     Element vElement = findElement('v');
     var expected = [
-        _expectId(pElement, MatchKind.TYPE_REFERENCE, 'A p'),
-        _expectId(vElement, MatchKind.TYPE_REFERENCE, 'A v')];
+        _expectId(pElement, MatchKind.REFERENCE, 'A p'),
+        _expectId(vElement, MatchKind.REFERENCE, 'A v')];
     return _verifyReferences(element, expected);
   }
 
@@ -192,7 +236,7 @@
     var expected = [
         _expectId(
             testUnitElement,
-            MatchKind.UNIT_REFERENCE,
+            MatchKind.REFERENCE,
             "'my_part.dart'",
             length: "'my_part.dart'".length)];
     return _verifyReferences(element, expected);
@@ -211,16 +255,8 @@
     ClassElement elementA = findElement('A');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(
-            elementA,
-            MatchKind.CONSTRUCTOR_DECLARATION,
-            '.named() {}',
-            length: 6),
-        _expectId(
-            mainElement,
-            MatchKind.CONSTRUCTOR_REFERENCE,
-            '.named();',
-            length: 6)];
+        _expectId(elementA, MatchKind.DECLARATION, '.named() {}', length: 6),
+        _expectId(mainElement, MatchKind.REFERENCE, '.named();', length: 6)];
     return _verifyReferences(element, expected);
   }
 
@@ -250,14 +286,15 @@
     Element main = findElement('main');
     Element fieldParameter = findElement('field', ElementKind.PARAMETER);
     var expected = [
-        _expectIdQ(fieldParameter, MatchKind.FIELD_REFERENCE, 'field}'),
-        _expectIdQ(main, MatchKind.FIELD_REFERENCE, 'field: 1'),
-        _expectId(main, MatchKind.FIELD_READ, 'field); // ref-nq'),
-        _expectIdQ(main, MatchKind.FIELD_READ, 'field); // ref-q'),
-        _expectId(main, MatchKind.FIELD_INVOCATION, 'field(); // inv-nq'),
-        _expectIdQ(main, MatchKind.FIELD_INVOCATION, 'field(); // inv-q'),
-        _expectId(main, MatchKind.FIELD_WRITE, 'field = 2; // ref-nq'),
-        _expectIdQ(main, MatchKind.FIELD_WRITE, 'field = 3; // ref-q')];
+        _expectId(fieldParameter, MatchKind.REFERENCE, 'field}'),
+        _expectId(main, MatchKind.REFERENCE, 'field: 1'),
+        _expectId(main, MatchKind.READ, 'field); // ref-nq'),
+        _expectIdQ(main, MatchKind.READ, 'field); // ref-q'),
+        _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
+        _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
+        _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
+        _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
+        ];
     return _verifyReferences(element, expected);
   }
 
@@ -272,8 +309,8 @@
     FunctionElement element = findElement('test');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(mainElement, MatchKind.FUNCTION_EXECUTION, 'test();'),
-        _expectId(mainElement, MatchKind.FUNCTION_REFERENCE, 'test);')];
+        _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
+        _expectId(mainElement, MatchKind.REFERENCE, 'test);')];
     return _verifyReferences(element, expected);
   }
 
@@ -289,8 +326,8 @@
     Element aElement = findElement('a');
     Element bElement = findElement('b');
     var expected = [
-        _expectId(aElement, MatchKind.FUNCTION_TYPE_REFERENCE, 'Test a;'),
-        _expectId(bElement, MatchKind.FUNCTION_TYPE_REFERENCE, 'Test b;')];
+        _expectId(aElement, MatchKind.REFERENCE, 'Test a;'),
+        _expectId(bElement, MatchKind.REFERENCE, 'Test b;')];
     return _verifyReferences(element, expected);
   }
 
@@ -303,7 +340,7 @@
 ''');
     ImportElement element = testLibraryElement.imports[0];
     Element mainElement = findElement('main');
-    var kind = MatchKind.IMPORT_REFERENCE;
+    var kind = MatchKind.REFERENCE;
     var expected = [_expectId(mainElement, kind, 'E);', length: 0)];
     return _verifyReferences(element, expected);
   }
@@ -317,7 +354,7 @@
 ''');
     ImportElement element = testLibraryElement.imports[0];
     Element mainElement = findElement('main');
-    var kind = MatchKind.IMPORT_REFERENCE;
+    var kind = MatchKind.REFERENCE;
     var expected = [
         _expectId(mainElement, kind, 'math.PI);', length: 'math.'.length)];
     return _verifyReferences(element, expected);
@@ -342,12 +379,12 @@
     var expected = [
         new ExpectedMatch(
             elementA,
-            MatchKind.LIBRARY_REFERENCE,
+            MatchKind.REFERENCE,
             codeA.indexOf('lib; // A'),
             'lib'.length),
         new ExpectedMatch(
             elementB,
-            MatchKind.LIBRARY_REFERENCE,
+            MatchKind.REFERENCE,
             codeB.indexOf('lib; // B'),
             'lib'.length),];
     return _verifyReferences(element, expected);
@@ -366,10 +403,10 @@
     LocalVariableElement element = findElement('v');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(mainElement, MatchKind.VARIABLE_WRITE, 'v = 1;'),
-        _expectId(mainElement, MatchKind.VARIABLE_READ_WRITE, 'v += 2;'),
-        _expectId(mainElement, MatchKind.VARIABLE_READ, 'v);'),
-        _expectId(mainElement, MatchKind.FUNCTION_EXECUTION, 'v();')];
+        _expectId(mainElement, MatchKind.WRITE, 'v = 1;'),
+        _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'),
+        _expectId(mainElement, MatchKind.READ, 'v);'),
+        _expectId(mainElement, MatchKind.INVOCATION, 'v();')];
     return _verifyReferences(element, expected);
   }
 
@@ -388,10 +425,10 @@
     MethodElement method = findElement('m');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(mainElement, MatchKind.METHOD_INVOCATION, 'm(); // 1'),
-        _expectIdQ(mainElement, MatchKind.METHOD_INVOCATION, 'm(); // 2'),
-        _expectId(mainElement, MatchKind.METHOD_REFERENCE, 'm); // 3'),
-        _expectIdQ(mainElement, MatchKind.METHOD_REFERENCE, 'm); // 4')];
+        _expectId(mainElement, MatchKind.INVOCATION, 'm(); // 1'),
+        _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // 2'),
+        _expectId(mainElement, MatchKind.REFERENCE, 'm); // 3'),
+        _expectIdQ(mainElement, MatchKind.REFERENCE, 'm); // 4')];
     return _verifyReferences(method, expected);
   }
 
@@ -407,7 +444,7 @@
     MethodMember method = findNodeElementAtString('m(); // ref');
     Element mainElement = findElement('main');
     var expected = [
-        _expectIdQ(mainElement, MatchKind.METHOD_INVOCATION, 'm(); // ref')];
+        _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // ref')];
     return _verifyReferences(method, expected);
   }
 
@@ -427,11 +464,11 @@
     Element fooElement = findElement('foo');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(fooElement, MatchKind.VARIABLE_WRITE, 'p = 1;'),
-        _expectId(fooElement, MatchKind.VARIABLE_READ_WRITE, 'p += 2;'),
-        _expectId(fooElement, MatchKind.VARIABLE_READ, 'p);'),
-        _expectId(fooElement, MatchKind.FUNCTION_EXECUTION, 'p();'),
-        _expectId(mainElement, MatchKind.NAMED_PARAMETER_REFERENCE, 'p: 42')];
+        _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
+        _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
+        _expectId(fooElement, MatchKind.READ, 'p);'),
+        _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
+        _expectId(mainElement, MatchKind.REFERENCE, 'p: 42')];
     return _verifyReferences(element, expected);
   }
 
@@ -448,8 +485,8 @@
     PropertyAccessorElement element = findElement('g', ElementKind.GETTER);
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(mainElement, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 'g; // 1'),
-        _expectIdQ(mainElement, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 'g; // 2')];
+        _expectId(mainElement, MatchKind.REFERENCE, 'g; // 1'),
+        _expectIdQ(mainElement, MatchKind.REFERENCE, 'g; // 2')];
     return _verifyReferences(element, expected);
   }
 
@@ -466,8 +503,8 @@
     PropertyAccessorElement element = findElement('s=');
     Element mainElement = findElement('main');
     var expected = [
-        _expectId(mainElement, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 's = 1'),
-        _expectIdQ(mainElement, MatchKind.PROPERTY_ACCESSOR_REFERENCE, 's = 2')];
+        _expectId(mainElement, MatchKind.REFERENCE, 's = 1'),
+        _expectIdQ(mainElement, MatchKind.REFERENCE, 's = 2')];
     return _verifyReferences(element, expected);
   }
 
@@ -480,14 +517,12 @@
 import 'lib.dart' show V; // imp
 import 'lib.dart' as pref;
 main() {
-  V = 1;
-  print(V);
-  V();
-}
-mainQ() {
-  pref.V = 1; // Q
-  print(pref.V); // Q
-  pref.V(); // Q
+  pref.V = 1; // q
+  print(pref.V); // q
+  pref.V(); // q
+  V = 1; // nq
+  print(V); // nq
+  V(); // nq
 }
 ''');
     ImportElement importElement = testLibraryElement.imports[0];
@@ -495,15 +530,15 @@
         importElement.importedLibrary.definingCompilationUnit;
     TopLevelVariableElement variable = impUnit.topLevelVariables[0];
     Element main = findElement('main');
-    Element mainQ = findElement('mainQ');
     var expected = [
-        _expectIdQ(testUnitElement, MatchKind.FIELD_REFERENCE, 'V; // imp'),
-        _expectId(main, MatchKind.FIELD_WRITE, 'V = 1;'),
-        _expectId(main, MatchKind.FIELD_READ, 'V);'),
-        _expectId(main, MatchKind.FIELD_INVOCATION, 'V();'),
-        _expectIdQ(mainQ, MatchKind.FIELD_WRITE, 'V = 1; // Q'),
-        _expectIdQ(mainQ, MatchKind.FIELD_READ, 'V); // Q'),
-        _expectIdQ(mainQ, MatchKind.FIELD_INVOCATION, 'V(); // Q')];
+        _expectId(testUnitElement, MatchKind.REFERENCE, 'V; // imp'),
+        _expectId(main, MatchKind.WRITE, 'V = 1; // q'),
+        _expectId(main, MatchKind.READ, 'V); // q'),
+        _expectId(main, MatchKind.INVOCATION, 'V(); // q'),
+        _expectId(main, MatchKind.WRITE, 'V = 1; // nq'),
+        _expectId(main, MatchKind.READ, 'V); // nq'),
+        _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),
+        ];
     return _verifyReferences(variable, expected);
   }
 
@@ -517,8 +552,8 @@
     Element aElement = findElement('a');
     Element bElement = findElement('b');
     var expected = [
-        _expectId(aElement, MatchKind.TYPE_PARAMETER_REFERENCE, 'T a'),
-        _expectId(bElement, MatchKind.TYPE_PARAMETER_REFERENCE, 'T b')];
+        _expectId(aElement, MatchKind.REFERENCE, 'T a'),
+        _expectId(bElement, MatchKind.REFERENCE, 'T b')];
     return _verifyReferences(element, expected);
   }
 
@@ -534,59 +569,14 @@
     ClassElement elementB = findElement('B');
     ClassElement elementC = findElement('C');
     var expected = [
-        _expectId(elementA, MatchKind.EXTENDS_REFERENCE, 'T {} // A'),
-        _expectId(elementB, MatchKind.WITH_REFERENCE, 'T; // B'),
-        _expectId(elementC, MatchKind.IMPLEMENTS_REFERENCE, 'T {} // C')];
+        _expectId(elementA, MatchKind.REFERENCE, 'T {} // A'),
+        _expectId(elementB, MatchKind.REFERENCE, 'T; // B'),
+        _expectId(elementC, MatchKind.REFERENCE, 'T {} // C')];
     return searchEngine.searchSubtypes(element).then((matches) {
       _assertMatches(matches, expected);
     });
   }
 
-  Future test_searchMemberReferences() {
-    _indexTestUnit('''
-class A {
-  var test; // A
-  mainA() {
-    test(); // a-inv-r-nq
-    test = 1; // a-write-r-nq
-    test += 2; // a-read-write-r-nq
-    print(test); // a-read-r-nq
-  }
-}
-main(A a, p) {
-  a.test(); // a-inv-r-q
-  a.test = 1; // a-write-r-q
-  a.test += 2; // a-read-write-r-q
-  print(a.test); // a-read-r-q
-  p.test(); // p-inv-ur-q
-  p.test = 1; // p-write-ur-q
-  p.test += 2; // p-read-write-ur-q
-  print(p.test); // p-read-ur-q
-}
-''');
-    ClassElement elementA = findElement('A');
-    ClassElement elementB = findElement('B');
-    Element mainA = findElement('mainA');
-    Element main = findElement('main');
-    var expected = [
-        _expectId(mainA, MatchKind.NAME_INVOCATION_RESOLVED, 'test(); // a-inv-r-nq'),
-        _expectId(mainA, MatchKind.NAME_WRITE_RESOLVED, 'test = 1; // a-write-r-nq'),
-        _expectId(mainA, MatchKind.NAME_READ_WRITE_RESOLVED, 'test += 2; // a-read-write-r-nq'),
-        _expectId(mainA, MatchKind.NAME_READ_RESOLVED, 'test); // a-read-r-nq'),
-        _expectId(main, MatchKind.NAME_INVOCATION_RESOLVED, 'test(); // a-inv-r-q'),
-        _expectId(main, MatchKind.NAME_WRITE_RESOLVED, 'test = 1; // a-write-r-q'),
-        _expectId(main, MatchKind.NAME_READ_WRITE_RESOLVED, 'test += 2; // a-read-write-r-q'),
-        _expectId(main, MatchKind.NAME_READ_RESOLVED, 'test); // a-read-r-q'),
-        _expectIdU(main, MatchKind.NAME_INVOCATION_UNRESOLVED, 'test(); // p-inv-ur-q'),
-        _expectIdU(main, MatchKind.NAME_WRITE_UNRESOLVED, 'test = 1; // p-write-ur-q'),
-        _expectIdU(main, MatchKind.NAME_READ_WRITE_UNRESOLVED, 'test += 2; // p-read-write-ur-q'),
-        _expectIdU(main, MatchKind.NAME_READ_UNRESOLVED, 'test); // p-read-ur-q'),
-        ];
-    return searchEngine.searchMemberReferences('test').then((matches) {
-      _assertMatches(matches, expected);
-    });
-  }
-
   Future test_searchTopLevelDeclarations() {
     _indexTestUnit('''
 class A {} // A
@@ -604,11 +594,11 @@
     Element topE = findElement('E');
     Element topNoMatch = new MockElement('NoMatchABCDE');
     var expected = [
-        _expectId(topA, MatchKind.CLASS_DECLARATION, 'A {} // A'),
-        _expectId(topB, MatchKind.CLASS_ALIAS_DECLARATION, 'B ='),
-        _expectId(topC, MatchKind.FUNCTION_TYPE_DECLARATION, 'C()'),
-        _expectId(topD, MatchKind.FUNCTION_DECLARATION, 'D() {}'),
-        _expectId(topE, MatchKind.VARIABLE_DECLARATION, 'E = null')];
+        _expectId(topA, MatchKind.DECLARATION, 'A {} // A'),
+        _expectId(topB, MatchKind.DECLARATION, 'B ='),
+        _expectId(topC, MatchKind.DECLARATION, 'C()'),
+        _expectId(topD, MatchKind.DECLARATION, 'D() {}'),
+        _expectId(topE, MatchKind.DECLARATION, 'E = null')];
     return _verifyTopLevelDeclarations('^[A-E]\$', expected);
   }
 
@@ -632,7 +622,12 @@
   }
 
   ExpectedMatch _expectIdU(Element element, MatchKind kind, String search) {
-    return _expectId(element, kind, search, isResolved: false);
+    return _expectId(
+        element,
+        kind,
+        search,
+        isQualified: true,
+        isResolved: false);
   }
 
   void _indexTestUnit(String code) {
diff --git a/pkg/analysis_services/test/search/test_all.dart b/pkg/analysis_services/test/search/test_all.dart
index fad272d..8636449 100644
--- a/pkg/analysis_services/test/search/test_all.dart
+++ b/pkg/analysis_services/test/search/test_all.dart
@@ -2,10 +2,11 @@
 // 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.services.src.scheglov.all;
+library test.services.src.search.all;
 
 import 'package:unittest/unittest.dart';
 
+import 'hierarchy_test.dart' as hierarchy_test;
 import 'search_engine_test.dart' as search_engine_test;
 
 
@@ -15,6 +16,7 @@
 main() {
   groupSep = ' | ';
   group('search', () {
+    hierarchy_test.main();
     search_engine_test.main();
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_services/test/test_all.dart b/pkg/analysis_services/test/test_all.dart
index 6f0df28..23de4a6 100644
--- a/pkg/analysis_services/test/test_all.dart
+++ b/pkg/analysis_services/test/test_all.dart
@@ -4,12 +4,14 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'correction/test_all.dart' as correction_all;
 import 'index/test_all.dart' as index_all;
 import 'search/test_all.dart' as search_all;
 
 /// Utility for manually running all tests.
 main() {
   groupSep = ' | ';
+  correction_all.main();
   index_all.main();
   search_all.main();
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_testing/lib/reflective_tests.dart b/pkg/analysis_testing/lib/reflective_tests.dart
index cdb617c..2c737f7 100644
--- a/pkg/analysis_testing/lib/reflective_tests.dart
+++ b/pkg/analysis_testing/lib/reflective_tests.dart
@@ -66,34 +66,21 @@
 
 _runTest(ClassMirror classMirror, Symbol symbol) {
   InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
-  bool shouldRunTearDown = true;
-  _invokeSymbolIfExists(instanceMirror, #setUp);
-  try {
-    var testReturn = instanceMirror.invoke(symbol, []).reflectee;
-    if (testReturn is Future) {
-      shouldRunTearDown = false;
-      return testReturn.whenComplete(() {
-        _invokeTearDown(instanceMirror);
-      });
-    } else {
-      return testReturn;
-    }
-  } finally {
-    if (shouldRunTearDown) {
-      _invokeTearDown(instanceMirror);
-    }
-  }
+  return _invokeSymbolIfExists(instanceMirror, #setUp).then(
+      (_) => instanceMirror.invoke(symbol, []).reflectee).whenComplete(
+      () => _invokeSymbolIfExists(instanceMirror, #tearDown));
 }
 
 
-void _invokeTearDown(InstanceMirror instanceMirror) {
-  _invokeSymbolIfExists(instanceMirror, #tearDown);
-}
-
-
-void _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
+Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
+  var invocationResult = null;
   try {
-    instanceMirror.invoke(symbol, []);
+    invocationResult = instanceMirror.invoke(symbol, []).reflectee;
   } on NoSuchMethodError catch (e) {
   }
+  if (invocationResult is Future) {
+    return invocationResult;
+  } else {
+    return new Future.value(invocationResult);
+  }
 }
diff --git a/pkg/analysis_testing/pubspec.yaml b/pkg/analysis_testing/pubspec.yaml
index 84c6630..dfd0e1d 100644
--- a/pkg/analysis_testing/pubspec.yaml
+++ b/pkg/analysis_testing/pubspec.yaml
@@ -1,11 +1,11 @@
 name: analysis_testing
-version: 0.3.0
+version: 0.4.0
 author: Dart Team <misc@dartlang.org>
 description: A set of libraries for testing Analysis services and server
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: '>=0.21.1 <1.0.0'
+  analyzer: '>=0.22.0-dev <0.23.0'
   typed_mock: '>=0.0.4 <1.0.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 495f618..ba77c11 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -1079,6 +1079,12 @@
   EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(node.semicolon);
 
   @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) => new EnumConstantDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name));
+
+  @override
+  EnumDeclaration visitEnumDeclaration(EnumDeclaration node) => new EnumDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.name), node.leftBracket, cloneNodeList(node.constants), node.rightBracket);
+
+  @override
   ExportDirective visitExportDirective(ExportDirective node) {
     ExportDirective directive = new ExportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), cloneNodeList(node.combinators), node.semicolon);
     directive.source = node.source;
@@ -1540,6 +1546,18 @@
   }
 
   @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    EnumConstantDeclaration other = this._other as EnumConstantDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name);
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    EnumDeclaration other = this._other as EnumDeclaration;
+    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.constants, other.constants) && _isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective other = this._other as ExportDirective;
     return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
@@ -2370,6 +2388,10 @@
 
   R visitEmptyStatement(EmptyStatement node);
 
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node);
+
+  R visitEnumDeclaration(EnumDeclaration node);
+
   R visitExportDirective(ExportDirective node);
 
   R visitExpressionFunctionBody(ExpressionFunctionBody node);
@@ -6132,6 +6154,143 @@
 }
 
 /**
+ * Instances of the class `EnumConstantDeclaration` represent the declaration of an enum
+ * constant.
+ */
+class EnumConstantDeclaration extends Declaration {
+  /**
+   * The name of the constant.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * Initialize a newly created enum constant declaration.
+   *
+   * @param comment the documentation comment associated with this declaration
+   * @param metadata the annotations associated with this declaration
+   * @param name the name of the constant
+   */
+  EnumConstantDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name) : super(comment, metadata) {
+    this._name = becomeParentOf(name);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEnumConstantDeclaration(this);
+
+  @override
+  FieldElement get element => _name == null ? null : (_name.staticElement as FieldElement);
+
+  @override
+  Token get endToken => _name.endToken;
+
+  /**
+   * Return the name of the constant.
+   *
+   * @return the name of the constant
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * Set the name of the constant to the given name.
+   *
+   * @param name the name of the constant
+   */
+  void set name(SimpleIdentifier name) {
+    this._name = becomeParentOf(name);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+}
+
+/**
+ * Instances of the class `EnumDeclaration` represent the declaration of an enumeration.
+ *
+ * <pre>
+ * enumType ::=
+ *     metadata 'enum' [SimpleIdentifier] '{' [SimpleIdentifier] (',' [SimpleIdentifier])* (',')? '}'
+ * </pre>
+ */
+class EnumDeclaration extends CompilationUnitMember {
+  /**
+   * The 'enum' keyword.
+   */
+  Token keyword;
+
+  /**
+   * The name of the enumeration.
+   */
+  SimpleIdentifier _name;
+
+  /**
+   * The left curly bracket.
+   */
+  Token leftBracket;
+
+  /**
+   * The enumeration constants being declared.
+   */
+  NodeList<EnumConstantDeclaration> _constants;
+
+  /**
+   * The right curly bracket.
+   */
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created enumeration declaration.
+   *
+   * @param comment the documentation comment associated with this member
+   * @param metadata the annotations associated with this member
+   * @param keyword the 'enum' keyword
+   * @param name the name of the enumeration
+   * @param leftBracket the left curly bracket
+   * @param constants the enumeration constants being declared
+   * @param rightBracket the right curly bracket
+   */
+  EnumDeclaration(Comment comment, List<Annotation> metadata, this.keyword, SimpleIdentifier name, this.leftBracket, List<EnumConstantDeclaration> constants, this.rightBracket) : super(comment, metadata) {
+    this._constants = new NodeList<EnumConstantDeclaration>(this);
+    this._name = becomeParentOf(name);
+    this._constants.addAll(constants);
+  }
+
+  @override
+  accept(AstVisitor visitor) => visitor.visitEnumDeclaration(this);
+
+  /**
+   * Return the enumeration constants being declared.
+   *
+   * @return the enumeration constants being declared
+   */
+  NodeList<EnumConstantDeclaration> get constants => _constants;
+
+  @override
+  ClassElement get element => _name != null ? (_name.staticElement as ClassElement) : null;
+
+  @override
+  Token get endToken => rightBracket;
+
+  /**
+   * Return the name of the enumeration.
+   *
+   * @return the name of the enumeration
+   */
+  SimpleIdentifier get name => _name;
+
+  /**
+   * set the name of the enumeration to the given identifier.
+   *
+   * @param name the name of the enumeration
+   */
+  void set name(SimpleIdentifier name) {
+    this._name = becomeParentOf(name);
+  }
+
+  @override
+  Token get firstTokenAfterCommentAndMetadata => keyword;
+}
+
+/**
  * Ephemeral identifiers are created as needed to mimic the presence of an empty identifier.
  */
 class EphemeralIdentifier extends SimpleIdentifier {
@@ -8186,6 +8345,12 @@
   R visitEmptyStatement(EmptyStatement node) => visitStatement(node);
 
   @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => visitDeclaration(node);
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) => visitCompilationUnitMember(node);
+
+  @override
   R visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
 
   R visitExpression(Expression node) => visitNode(node);
@@ -9112,6 +9277,12 @@
   EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(_mapToken(node.semicolon));
 
   @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) => new EnumConstantDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _cloneNode(node.name));
+
+  @override
+  AstNode visitEnumDeclaration(EnumDeclaration node) => new EnumDeclaration(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.name), _mapToken(node.leftBracket), _cloneNodeList(node.constants), _mapToken(node.rightBracket));
+
+  @override
   ExportDirective visitExportDirective(ExportDirective node) {
     ExportDirective copy = new ExportDirective(_cloneNode(node.documentationComment), _cloneNodeList(node.metadata), _mapToken(node.keyword), _cloneNode(node.uri), _cloneNodeList(node.combinators), _mapToken(node.semicolon));
     copy.element = node.element;
@@ -12084,6 +12255,26 @@
   bool visitEmptyStatement(EmptyStatement node) => visitNode(node);
 
   @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (_replaceInList(node.constants)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
   bool visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
 
   @override
@@ -14058,6 +14249,18 @@
   }
 
   @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R visitExportDirective(ExportDirective node) {
     node.visitChildren(this);
     return null;
@@ -15069,6 +15272,12 @@
   R visitEmptyStatement(EmptyStatement node) => null;
 
   @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => null;
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) => null;
+
+  @override
   R visitExportDirective(ExportDirective node) => null;
 
   @override
@@ -16767,6 +16976,24 @@
   }
 
   @override
+  Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _visitNode(node.name);
+    return null;
+  }
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
+    _writer.print("enum ");
+    _visitNode(node.name);
+    _writer.print(" {");
+    _visitNodeListWithSeparator(node.constants, ", ");
+    _writer.print("}");
+    return null;
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("export ");
@@ -18296,6 +18523,12 @@
   R visitEmptyStatement(EmptyStatement node) => visitNode(node);
 
   @override
+  R visitEnumConstantDeclaration(EnumConstantDeclaration node) => visitNode(node);
+
+  @override
+  R visitEnumDeclaration(EnumDeclaration node) => visitNode(node);
+
+  @override
   R visitExportDirective(ExportDirective node) => visitNode(node);
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 9258a57..f5f6b72 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -292,6 +292,32 @@
   static String _DEFAULT_VALUE_PARAM = "defaultValue";
 
   /**
+   * Source of RegExp matching declarable operator names. From sdk/lib/internal/symbol.dart.
+   */
+  static String _OPERATOR_RE = "(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)";
+
+  /**
+   * Source of RegExp matching any public identifier. From sdk/lib/internal/symbol.dart.
+   */
+  static String _PUBLIC_IDENTIFIER_RE = "(?!${ConstantValueComputer._RESERVED_WORD_RE}\\b(?!\\\$))[a-zA-Z\$][\\w\$]*";
+
+  /**
+   * Source of RegExp matching Dart reserved words. From sdk/lib/internal/symbol.dart.
+   */
+  static String _RESERVED_WORD_RE = "(?: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))";
+
+  /**
+   * RegExp that validates a non-empty non-private symbol. From sdk/lib/internal/symbol.dart.
+   */
+  static RegExp _PUBLIC_SYMBOL_PATTERN = new RegExp("^(?:${ConstantValueComputer._OPERATOR_RE}\$|${_PUBLIC_IDENTIFIER_RE}(?:=?\$|[.](?!\$)))+?\$");
+
+  /**
+   * Determine whether the given string is a valid name for a public symbol (i.e. whether it is
+   * allowed for a call to the Symbol constructor).
+   */
+  static bool isValidPublicSymbol(String name) => name.isEmpty || new JavaPatternMatcher(_PUBLIC_SYMBOL_PATTERN, name).matches();
+
+  /**
    * The type provider used to access the known types.
    */
   TypeProvider typeProvider;
@@ -492,6 +518,28 @@
   }
 
   /**
+   * Check that the arguments to a call to Symbol() are correct.
+   *
+   * @param arguments the AST nodes of the arguments.
+   * @param argumentValues the values of the unnamed arguments.
+   * @param namedArgumentValues the values of the named arguments.
+   * @return true if the arguments are correct, false if there is an error.
+   */
+  bool _checkSymbolArguments(NodeList<Expression> arguments, List<DartObjectImpl> argumentValues, HashMap<String, DartObjectImpl> namedArgumentValues) {
+    if (arguments.length != 1) {
+      return false;
+    }
+    if (arguments[0] is NamedExpression) {
+      return false;
+    }
+    if (!identical(argumentValues[0].type, typeProvider.stringType)) {
+      return false;
+    }
+    String name = argumentValues[0].stringValue;
+    return isValidPublicSymbol(name);
+  }
+
+  /**
    * Compute a value for the given constant.
    *
    * @param constNode the constant for which a value is to be computed
@@ -602,10 +650,11 @@
           return _computeValueFromEnvironment(valueFromEnvironment, new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE), namedArgumentValues);
         }
       } else if (constructor.name == "" && identical(definingClass, typeProvider.symbolType) && argumentCount == 1) {
-        String argumentValue = argumentValues[0].stringValue;
-        if (argumentValue != null) {
-          return constantVisitor._valid(definingClass, new SymbolState(argumentValue));
+        if (!_checkSymbolArguments(arguments, argumentValues, namedArgumentValues)) {
+          return new ErrorResult.con1(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
         }
+        String argumentValue = argumentValues[0].stringValue;
+        return constantVisitor._valid(definingClass, new SymbolState(argumentValue));
       }
       // Either it's an external const factory constructor that we can't emulate, or an error
       // occurred (a cycle, or a const constructor trying to delegate to a non-const constructor).
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index fc098f7..5c83632 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1885,6 +1885,22 @@
   LibraryElement get enclosingElement;
 
   /**
+   * Return the enum defined in this compilation unit that has the given name, or `null` if
+   * this compilation unit does not define an enum with the given name.
+   *
+   * @param enumName the name of the enum to be returned
+   * @return the enum with the given name that is defined in this compilation unit
+   */
+  ClassElement getEnum(String enumName);
+
+  /**
+   * Return an array containing all of the enums contained in this compilation unit.
+   *
+   * @return an array containing all of the enums contained in this compilation unit
+   */
+  List<ClassElement> get enums;
+
+  /**
    * Return an array containing all of the top-level functions contained in this compilation unit.
    *
    * @return the top-level functions contained in this compilation unit
@@ -1964,6 +1980,11 @@
   List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_ARRAY;
 
   /**
+   * An array containing all of the enums contained in this compilation unit.
+   */
+  List<ClassElement> _enums = ClassElementImpl.EMPTY_ARRAY;
+
+  /**
    * An array containing all of the top-level functions contained in this compilation unit.
    */
   List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
@@ -2050,6 +2071,19 @@
   LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
 
   @override
+  ClassElement getEnum(String enumName) {
+    for (ClassElement enumDeclaration in _enums) {
+      if (enumDeclaration.name == enumName) {
+        return enumDeclaration;
+      }
+    }
+    return null;
+  }
+
+  @override
+  List<ClassElement> get enums => _enums;
+
+  @override
   List<FunctionElement> get functions => _functions;
 
   @override
@@ -2116,6 +2150,18 @@
   }
 
   /**
+   * Set the enums contained in this compilation unit to the given enums.
+   *
+   * @param enums enums contained in this compilation unit
+   */
+  void set enums(List<ClassElement> enums) {
+    for (ClassElement enumDeclaration in enums) {
+      (enumDeclaration as ClassElementImpl).enclosingElement = this;
+    }
+    this._enums = enums;
+  }
+
+  /**
    * Set the top-level functions contained in this compilation unit to the given functions.
    *
    * @param functions the top-level functions contained in this compilation unit
@@ -2226,7 +2272,16 @@
    *
    * @param name the name of this element
    */
-  ConstFieldElementImpl(Identifier name) : super.forNode(name);
+  ConstFieldElementImpl.con1(Identifier name) : super.forNode(name);
+
+  /**
+   * Initialize a newly created synthetic field element to have the given name.
+   *
+   * @param name the name of this element
+   * @param nameOffset the offset of the name of this element in the file that contains the
+   *          declaration of this element
+   */
+  ConstFieldElementImpl.con2(String name, int offset) : super(name, offset);
 
   @override
   EvaluationResultImpl get evaluationResult => _result;
@@ -9040,6 +9095,16 @@
   accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
 
   @override
+  ElementImpl getChild(String identifier) {
+    for (ParameterElement parameter in _parameters) {
+      if ((parameter as ParameterElementImpl).identifier == identifier) {
+        return parameter as ParameterElementImpl;
+      }
+    }
+    return null;
+  }
+
+  @override
   SourceRange get defaultValueRange {
     if (_defaultValueRangeLength < 0) {
       return null;
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 9fcadc7..94bee4a 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1780,7 +1780,7 @@
 
   @override
   void set analysisOptions(AnalysisOptions options) {
-    bool needsRecompute = this._options.analyzeAngular != options.analyzeAngular || this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
+    bool needsRecompute = this._options.analyzeAngular != options.analyzeAngular || this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableAsync != options.enableAsync || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.enableEnum != options.enableEnum || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
     int cacheSize = options.cacheSize;
     if (this._options.cacheSize != cacheSize) {
       this._options.cacheSize = cacheSize;
@@ -1801,7 +1801,9 @@
     this._options.analyzeAngular = options.analyzeAngular;
     this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
     this._options.generateSdkErrors = options.generateSdkErrors;
+    this._options.enableAsync = options.enableAsync;
     this._options.enableDeferredLoading = options.enableDeferredLoading;
+    this._options.enableEnum = options.enableEnum;
     this._options.dart2jsHint = options.dart2jsHint;
     this._options.hint = options.hint;
     this._options.incremental = options.incremental;
@@ -6318,13 +6320,27 @@
   bool get dart2jsHint;
 
   /**
-   * Return `true` if analysis is to include the new "deferred loading" support.
+   * Return `true` if analysis is to include the new async support.
    *
-   * @return `true` if analysis is to include the new "deferred loading" support
+   * @return `true` if analysis is to include the new async support
+   */
+  bool get enableAsync;
+
+  /**
+   * Return `true` if analysis is to include the new deferred loading support.
+   *
+   * @return `true` if analysis is to include the new deferred loading support
    */
   bool get enableDeferredLoading;
 
   /**
+   * Return `true` if analysis is to include the new enum support.
+   *
+   * @return `true` if analysis is to include the new enum support
+   */
+  bool get enableEnum;
+
+  /**
    * Return `true` if errors, warnings and hints should be generated for sources in the SDK.
    * The default value is `false`.
    *
@@ -6366,14 +6382,19 @@
   static int DEFAULT_CACHE_SIZE = 64;
 
   /**
+   * The default value for enabling async support.
+   */
+  static bool DEFAULT_ENABLE_ASYNC = false;
+
+  /**
    * The default value for enabling deferred loading.
    */
   static bool DEFAULT_ENABLE_DEFERRED_LOADING = true;
 
   /**
-   * The default value for enabling async support.
+   * The default value for enabling enum support.
    */
-  static bool DEFAULT_ENABLE_ASYNC = false;
+  static bool DEFAULT_ENABLE_ENUM = false;
 
   /**
    * A flag indicating whether analysis is to analyze Angular.
@@ -6401,11 +6422,21 @@
   bool dart2jsHint = true;
 
   /**
+   * A flag indicating whether analysis is to enable async support.
+   */
+  bool enableAsync = DEFAULT_ENABLE_ASYNC;
+
+  /**
    * A flag indicating whether analysis is to enable deferred loading.
    */
   bool enableDeferredLoading = DEFAULT_ENABLE_DEFERRED_LOADING;
 
   /**
+   * A flag indicating whether analysis is to enable enum support.
+   */
+  bool enableEnum = DEFAULT_ENABLE_ENUM;
+
+  /**
    * A flag indicating whether errors, warnings and hints should be generated for sources in the
    * SDK.
    */
@@ -6444,7 +6475,9 @@
     analyzePolymer = options.analyzePolymer;
     cacheSize = options.cacheSize;
     dart2jsHint = options.dart2jsHint;
+    enableAsync = options.enableAsync;
     enableDeferredLoading = options.enableDeferredLoading;
+    enableEnum = options.enableEnum;
     _generateSdkErrors = options.generateSdkErrors;
     hint = options.hint;
     incremental = options.incremental;
@@ -13114,7 +13147,9 @@
       Parser parser = new Parser(source, errorListener);
       AnalysisOptions options = context.analysisOptions;
       parser.parseFunctionBodies = options.analyzeFunctionBodies;
+      parser.parseAsync = options.enableAsync;
       parser.parseDeferredLibraries = options.enableDeferredLoading;
+      parser.parseEnum = options.enableEnum;
       _unit = parser.parseCompilationUnit(_tokenStream);
       _unit.lineInfo = lineInfo;
       AnalysisContext analysisContext = context;
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index a16e03c..acf9405 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -390,6 +390,12 @@
  */
 class CompileTimeErrorCode extends Enum<CompileTimeErrorCode> implements ErrorCode {
   /**
+   * Enum proposal: It is also a compile-time error to explicitly instantiate an enum via 'new' or
+   * 'const' or to access its private fields.
+   */
+  static const CompileTimeErrorCode ACCESS_PRIVATE_ENUM_FIELD = const CompileTimeErrorCode.con1('ACCESS_PRIVATE_ENUM_FIELD', 0, "The private fields of an enum cannot be accessed, even within the same library");
+
+  /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported by a library
    * <i>L</i> and <i>N</i> is introduced into the export namespace of <i>L</i> by more than one
    * export, unless each all exports refer to same declaration for the name N.
@@ -398,7 +404,7 @@
    * @param firstLibraryName the name of the first library that the type is found
    * @param secondLibraryName the name of the second library that the type is found
    */
-  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The name '%s' is defined in the libraries '%s' and '%s'");
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 1, "The name '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
@@ -406,57 +412,57 @@
    *
    * @param the name of the identifier in the argument definition test that is not a parameter
    */
-  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 1, "'%s' is not a parameter");
+  static const CompileTimeErrorCode ARGUMENT_DEFINITION_TEST_NON_PARAMETER = const CompileTimeErrorCode.con1('ARGUMENT_DEFINITION_TEST_NON_PARAMETER', 2, "'%s' is not a parameter");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error to use a built-in identifier other than
    * dynamic as a type annotation.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 2, "The built-in identifier '%s' cannot be as a type");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE', 3, "The built-in identifier '%s' cannot be as a type");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 3, "The built-in identifier '%s' cannot be used as a type name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_NAME', 4, "The built-in identifier '%s' cannot be used as a type name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 4, "The built-in identifier '%s' cannot be used as a type alias name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME', 5, "The built-in identifier '%s' cannot be used as a type alias name");
 
   /**
    * 12.30 Identifier Reference: It is a compile-time error if a built-in identifier is used as the
    * declared name of a class, type parameter or type alias.
    */
-  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 5, "The built-in identifier '%s' cannot be used as a type parameter name");
+  static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME = const CompileTimeErrorCode.con1('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME', 6, "The built-in identifier '%s' cannot be used as a type parameter name");
 
   /**
    * 13.9 Switch: It is a compile-time error if the class <i>C</i> implements the operator
    * <i>==</i>.
    */
-  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 6, "The switch case expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 7, "The switch case expression type '%s' cannot override the == operator");
 
   /**
    * 12.1 Constants: It is a compile-time error if evaluation of a compile-time constant would raise
    * an exception.
    */
-  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = const CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 7, "");
+  static const CompileTimeErrorCode COMPILE_TIME_CONSTANT_RAISES_EXCEPTION = const CompileTimeErrorCode.con1('COMPILE_TIME_CONSTANT_RAISES_EXCEPTION', 8, "");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 8, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
+  static const CompileTimeErrorCode CONFLICTING_GETTER_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_GETTER_AND_METHOD', 9, "Class '%s' cannot have both getter '%s.%s' and method with the same name");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
    * name. This restriction holds regardless of whether the getter is defined explicitly or
    * implicitly, or whether the getter or the method are inherited or not.
    */
-  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 9, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
+  static const CompileTimeErrorCode CONFLICTING_METHOD_AND_GETTER = const CompileTimeErrorCode.con1('CONFLICTING_METHOD_AND_GETTER', 10, "Class '%s' cannot have both method '%s.%s' and getter with the same name");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -464,7 +470,7 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 10, "'%s' cannot be used to name a constructor and a field in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD', 11, "'%s' cannot be used to name a constructor and a field in this class");
 
   /**
    * 7.6 Constructors: A constructor name always begins with the name of its immediately enclosing
@@ -472,25 +478,25 @@
    * compile-time error if <i>id</i> is the name of a member declared in the immediately enclosing
    * class.
    */
-  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 11, "'%s' cannot be used to name a constructor and a method in this class");
+  static const CompileTimeErrorCode CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD = const CompileTimeErrorCode.con1('CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD', 12, "'%s' cannot be used to name a constructor and a method in this class");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 12, "'%s' cannot be used to name a type varaible in a class with the same name");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_CLASS = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_CLASS', 13, "'%s' cannot be used to name a type varaible in a class with the same name");
 
   /**
    * 7. Classes: It is a compile time error if a generic class declares a type variable with the
    * same name as the class or any of its members or constructors.
    */
-  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 13, "'%s' cannot be used to name a type varaible and member in this class");
+  static const CompileTimeErrorCode CONFLICTING_TYPE_VARIABLE_AND_MEMBER = const CompileTimeErrorCode.con1('CONFLICTING_TYPE_VARIABLE_AND_MEMBER', 14, "'%s' cannot be used to name a type varaible and member in this class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 14, "'const' constructors cannot throw exceptions");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_THROWS_EXCEPTION', 15, "'const' constructors cannot throw exceptions");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
@@ -500,14 +506,14 @@
    * 9 Mixins: For each generative constructor named ... an implicitly declared constructor named
    * ... is declared.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_MIXIN', 15, "Constant constructor cannot be declared for a class with a mixin");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_MIXIN = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_MIXIN', 16, "Constant constructor cannot be declared for a class with a mixin");
 
   /**
    * 7.6.3 Constant Constructors: The superinitializer that appears, explicitly or implicitly, in
    * the initializer list of a constant constructor must specify a constant constructor of the
    * superclass of the immediately enclosing class or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 16, "Constant constructor cannot call non-constant super constructor of '%s'");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER', 17, "Constant constructor cannot call non-constant super constructor of '%s'");
 
   /**
    * 7.6.3 Constant Constructors: It is a compile-time error if a constant constructor is declared
@@ -515,12 +521,12 @@
    *
    * The above refers to both locally declared and inherited instance variables.
    */
-  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 17, "Cannot define the 'const' constructor for a class with non-final fields");
+  static const CompileTimeErrorCode CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD = const CompileTimeErrorCode.con1('CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD', 18, "Cannot define the 'const' constructor for a class with non-final fields");
 
   /**
    * 12.12.2 Const: It is a compile-time error if <i>T</i> is a deferred type.
    */
-  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 18, "Deferred classes cannot be created with 'const'");
+  static const CompileTimeErrorCode CONST_DEFERRED_CLASS = const CompileTimeErrorCode.con1('CONST_DEFERRED_CLASS', 19, "Deferred classes cannot be created with 'const'");
 
   /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error if o is not
@@ -533,19 +539,19 @@
    * @param initializerType the name of the type of the initializer expression
    * @param fieldType the name of the type of the field
    */
-  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 19, "The initializer type '%s' cannot be assigned to the field type '%s'");
+  static const CompileTimeErrorCode CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE', 20, "The initializer type '%s' cannot be assigned to the field type '%s'");
 
   /**
    * 6.2 Formal Parameters: It is a compile-time error if a formal parameter is declared as a
    * constant variable.
    */
-  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 20, "Parameters cannot be 'const'");
+  static const CompileTimeErrorCode CONST_FORMAL_PARAMETER = const CompileTimeErrorCode.con1('CONST_FORMAL_PARAMETER', 21, "Parameters cannot be 'const'");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
    * compile-time error occurs.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 21, "'const' variables must be constant value");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE', 22, "'const' variables must be constant value");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant or a
@@ -554,20 +560,20 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 22, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
+  static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY', 23, "Constant values from a deferred library cannot be used to initialized a 'const' variable");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable is declared to be
    * constant.
    */
-  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 23, "Only static fields can be declared as 'const'");
+  static const CompileTimeErrorCode CONST_INSTANCE_FIELD = const CompileTimeErrorCode.con1('CONST_INSTANCE_FIELD', 24, "Only static fields can be declared as 'const'");
 
   /**
    * 12.8 Maps: It is a compile-time error if the key of an entry in a constant map literal is an
    * instance of a class that implements the operator <i>==</i> unless the key is a string or
    * integer.
    */
-  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 24, "The constant map entry key expression type '%s' cannot override the == operator");
+  static const CompileTimeErrorCode CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS = const CompileTimeErrorCode.con1('CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS', 25, "The constant map entry key expression type '%s' cannot override the == operator");
 
   /**
    * 5 Variables: A constant variable must be initialized to a compile-time constant (12.1) or a
@@ -575,45 +581,45 @@
    *
    * @param name the name of the uninitialized final variable
    */
-  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 25, "The const variable '%s' must be initialized");
+  static const CompileTimeErrorCode CONST_NOT_INITIALIZED = const CompileTimeErrorCode.con1('CONST_NOT_INITIALIZED', 26, "The const variable '%s' must be initialized");
 
   /**
    * 12.11.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2, where e, e1 and e2
    * are constant expressions that evaluate to a boolean value.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 26, "An expression of type 'bool' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL', 27, "An expression of type 'bool' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
    * constant expressions that evaluate to a numeric, string or boolean value or to null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 27, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_NUM_STRING = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_BOOL_NUM_STRING', 28, "An expression of type 'bool', 'num', 'String' or 'null' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms ~e, e1 ^ e2, e1 & e2, e1 | e2, e1 >> e2 or e1
    * << e2, where e, e1 and e2 are constant expressions that evaluate to an integer value or to
    * null.
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 28, "An expression of type 'int' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_INT = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_INT', 29, "An expression of type 'int' was expected");
 
   /**
    * 12.11.2 Const: An expression of one of the forms e, e1 + e2, e1 - e2, e1 * e2, e1 / e2, e1 ~/
    * e2, e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are constant
    * expressions that evaluate to a numeric value or to null..
    */
-  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 29, "An expression of type 'num' was expected");
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_NUM = const CompileTimeErrorCode.con1('CONST_EVAL_TYPE_NUM', 30, "An expression of type 'num' was expected");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 30, "Evaluation of this constant expression causes exception");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_EXCEPTION', 31, "Evaluation of this constant expression causes exception");
 
   /**
    * 12.11.2 Const: It is a compile-time error if evaluation of a constant object results in an
    * uncaught exception being thrown.
    */
-  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 31, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
+  static const CompileTimeErrorCode CONST_EVAL_THROWS_IDBZE = const CompileTimeErrorCode.con1('CONST_EVAL_THROWS_IDBZE', 32, "Evaluation of this constant expression throws IntegerDivisionByZeroException");
 
   /**
    * 12.11.2 Const: If <i>T</i> is a parameterized type <i>S&lt;U<sub>1</sub>, &hellip;,
@@ -626,7 +632,7 @@
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    * @see StaticTypeWarningCode#WRONG_NUMBER_OF_TYPE_ARGUMENTS
    */
-  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 32, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const CompileTimeErrorCode CONST_WITH_INVALID_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_INVALID_TYPE_PARAMETERS', 33, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   /**
    * 12.11.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>,
@@ -634,13 +640,13 @@
    * compile-time error if the type <i>T</i> does not declare a constant constructor with the same
    * name as the declaration of <i>T</i>.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 33, "The constructor being called is not a 'const' constructor");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONST = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONST', 34, "The constructor being called is not a 'const' constructor");
 
   /**
    * 12.11.2 Const: In all of the above cases, it is a compile-time error if <i>a<sub>i</sub>, 1
    * &lt;= i &lt;= n + k</i>, is not a compile-time constant expression.
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 34, "Arguments of a constant creation must be constant expressions");
+  static const CompileTimeErrorCode CONST_WITH_NON_CONSTANT_ARGUMENT = const CompileTimeErrorCode.con1('CONST_WITH_NON_CONSTANT_ARGUMENT', 35, "Arguments of a constant creation must be constant expressions");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
@@ -653,12 +659,12 @@
    *
    * @param name the name of the non-type element
    */
-  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 35, "The name '%s' is not a class");
+  static const CompileTimeErrorCode CONST_WITH_NON_TYPE = const CompileTimeErrorCode.con1('CONST_WITH_NON_TYPE', 36, "The name '%s' is not a class");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> includes any type parameters.
    */
-  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 36, "The constant creation cannot use a type parameter");
+  static const CompileTimeErrorCode CONST_WITH_TYPE_PARAMETERS = const CompileTimeErrorCode.con1('CONST_WITH_TYPE_PARAMETERS', 37, "The constant creation cannot use a type parameter");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -667,7 +673,7 @@
    * @param typeName the name of the type
    * @param constructorName the name of the requested constant constructor
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 37, "The class '%s' does not have a constant constructor '%s'");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR', 38, "The class '%s' does not have a constant constructor '%s'");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T.id</i> is not the name of a constant
@@ -675,32 +681,32 @@
    *
    * @param typeName the name of the type
    */
-  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 38, "The class '%s' does not have a default constant constructor");
+  static const CompileTimeErrorCode CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT', 39, "The class '%s' does not have a default constant constructor");
 
   /**
    * 15.3.1 Typedef: It is a compile-time error if any default values are specified in the signature
    * of a function type alias.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 39, "Default values aren't allowed in typedefs");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS', 40, "Default values aren't allowed in typedefs");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the parameter and describes
    * its type as a function type. It is a compile-time error if any default values are specified in
    * the signature of such a function type.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 40, "Default values aren't allowed in function type parameters");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER', 41, "Default values aren't allowed in function type parameters");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> explicitly specifies a default value
    * for an optional parameter.
    */
-  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 41, "Default values aren't allowed in factory constructors that redirect to another constructor");
+  static const CompileTimeErrorCode DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR', 42, "Default values aren't allowed in factory constructors that redirect to another constructor");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
    * declared in the same scope.
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 42, "The default constructor is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_DEFAULT = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_DEFAULT', 43, "The default constructor is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -708,7 +714,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 43, "The constructor with name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('DUPLICATE_CONSTRUCTOR_NAME', 44, "The constructor with name '%s' is already defined");
 
   /**
    * 3.1 Scoping: It is a compile-time error if there is more than one entity with the same name
@@ -721,7 +727,7 @@
    *
    * @param duplicateName the name of the duplicate entity
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 44, "The name '%s' is already defined");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION', 45, "The name '%s' is already defined");
 
   /**
    * 7. Classes: It is a compile-time error if a class has an instance member and a static member
@@ -733,21 +739,21 @@
    * @param name the name of the conflicting members
    * @see #DUPLICATE_DEFINITION
    */
-  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 45, "The name '%s' is already defined in '%s'");
+  static const CompileTimeErrorCode DUPLICATE_DEFINITION_INHERITANCE = const CompileTimeErrorCode.con1('DUPLICATE_DEFINITION_INHERITANCE', 46, "The name '%s' is already defined in '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a compile-time error if <i>q<sub>i</sub> =
    * q<sub>j</sub></i> for any <i>i != j</i> [where <i>q<sub>i</sub></i> is the label for a named
    * argument].
    */
-  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 46, "The argument for the named parameter '%s' was already specified");
+  static const CompileTimeErrorCode DUPLICATE_NAMED_ARGUMENT = const CompileTimeErrorCode.con1('DUPLICATE_NAMED_ARGUMENT', 47, "The argument for the named parameter '%s' was already specified");
 
   /**
    * SDK implementation libraries can be exported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 47, "The library '%s' is internal and cannot be exported");
+  static const CompileTimeErrorCode EXPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_INTERNAL_LIBRARY', 48, "The library '%s' is internal and cannot be exported");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -755,7 +761,12 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 48, "The exported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode EXPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('EXPORT_OF_NON_LIBRARY', 49, "The exported library '%s' must not have a part-of directive");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
+   */
+  static const CompileTimeErrorCode EXTENDS_ENUM = const CompileTimeErrorCode.con1('EXTENDS_ENUM', 50, "Classes cannot extend an enum");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -763,7 +774,7 @@
    *
    * @param typeName the name of the superclass that was not found
    */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 49, "Classes can only extend other classes");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode.con1('EXTENDS_NON_CLASS', 51, "Classes can only extend other classes");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -782,7 +793,7 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 50, "Classes cannot extend '%s'");
+  static const CompileTimeErrorCode EXTENDS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DISALLOWED_CLASS', 52, "Classes cannot extend '%s'");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a class <i>C</i> includes
@@ -792,7 +803,7 @@
    * @see #IMPLEMENTS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 51, "This class cannot extend the deferred class '%s'");
+  static const CompileTimeErrorCode EXTENDS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('EXTENDS_DEFERRED_CLASS', 53, "This class cannot extend the deferred class '%s'");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt; h</i> or if <i>m &gt;
@@ -804,21 +815,21 @@
    * @param requiredCount the maximum number of positional arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 52, "%d positional arguments expected, but %d found");
+  static const CompileTimeErrorCode EXTRA_POSITIONAL_ARGUMENTS = const CompileTimeErrorCode.con1('EXTRA_POSITIONAL_ARGUMENTS', 54, "%d positional arguments expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if more than one initializer corresponding to a given instance variable appears in
    * <i>k</i>'s list.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 53, "The field '%s' cannot be initialized twice in the same constructor");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS', 55, "The field '%s' cannot be initialized twice in the same constructor");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile time
    * error if <i>k</i>'s initializer list contains an initializer for a variable that is initialized
    * by means of an initializing formal of <i>k</i>.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 54, "Fields cannot be initialized in both the parameter list and the initializers");
+  static const CompileTimeErrorCode FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER = const CompileTimeErrorCode.con1('FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER', 56, "Fields cannot be initialized in both the parameter list and the initializers");
 
   /**
    * 5 Variables: It is a compile-time error if a final instance variable that has is initialized by
@@ -827,19 +838,19 @@
    *
    * @param name the name of the field in question
    */
-  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 55, "'%s' is a final field and so can only be set once");
+  static const CompileTimeErrorCode FINAL_INITIALIZED_MULTIPLE_TIMES = const CompileTimeErrorCode.con1('FINAL_INITIALIZED_MULTIPLE_TIMES', 57, "'%s' is a final field and so can only be set once");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 56, "Initializing formal fields cannot be used in factory constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR', 58, "Initializing formal fields cannot be used in factory constructors");
 
   /**
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 57, "Initializing formal fields can only be used in constructors");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 59, "Initializing formal fields can only be used in constructors");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -848,7 +859,7 @@
    * 7.6.1 Generative Constructors: It is a compile-time error if an initializing formal is used by
    * a function other than a non-redirecting generative constructor.
    */
-  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 58, "The redirecting constructor cannot have a field initializer");
+  static const CompileTimeErrorCode FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR', 60, "The redirecting constructor cannot have a field initializer");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -856,7 +867,7 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 59, "'%s' cannot be used to name a getter, there is already a method with the same name");
+  static const CompileTimeErrorCode GETTER_AND_METHOD_WITH_SAME_NAME = const CompileTimeErrorCode.con1('GETTER_AND_METHOD_WITH_SAME_NAME', 61, "'%s' cannot be used to name a getter, there is already a method with the same name");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -866,7 +877,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #MIXIN_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 60, "This class cannot implement the deferred class '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DEFERRED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DEFERRED_CLASS', 62, "This class cannot implement the deferred class '%s'");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -885,13 +896,18 @@
    * @param typeName the name of the type that cannot be implemented
    * @see #EXTENDS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 61, "Classes cannot implement '%s'");
+  static const CompileTimeErrorCode IMPLEMENTS_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_DISALLOWED_CLASS', 63, "Classes cannot implement '%s'");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class includes
    * type dynamic.
    */
-  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 62, "Classes cannot implement 'dynamic'");
+  static const CompileTimeErrorCode IMPLEMENTS_DYNAMIC = const CompileTimeErrorCode.con1('IMPLEMENTS_DYNAMIC', 64, "Classes cannot implement 'dynamic'");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
+   */
+  static const CompileTimeErrorCode IMPLEMENTS_ENUM = const CompileTimeErrorCode.con1('IMPLEMENTS_ENUM', 65, "Classes cannot implement an enum");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the implements clause of a class <i>C</i>
@@ -900,7 +916,7 @@
    *
    * @param typeName the name of the interface that was not found
    */
-  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 63, "Classes can only implement other classes");
+  static const CompileTimeErrorCode IMPLEMENTS_NON_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_NON_CLASS', 66, "Classes can only implement other classes");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if a type <i>T</i> appears more than once in
@@ -908,7 +924,7 @@
    *
    * @param className the name of the class that is implemented more than once
    */
-  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 64, "'%s' can only be implemented once");
+  static const CompileTimeErrorCode IMPLEMENTS_REPEATED = const CompileTimeErrorCode.con1('IMPLEMENTS_REPEATED', 67, "'%s' can only be implemented once");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the superclass of a class <i>C</i> appears
@@ -916,7 +932,7 @@
    *
    * @param className the name of the class that appears in both "extends" and "implements" clauses
    */
-  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 65, "'%s' cannot be used in both 'extends' and 'implements' clauses");
+  static const CompileTimeErrorCode IMPLEMENTS_SUPER_CLASS = const CompileTimeErrorCode.con1('IMPLEMENTS_SUPER_CLASS', 68, "'%s' cannot be used in both 'extends' and 'implements' clauses");
 
   /**
    * 7.6.1 Generative Constructors: Note that <b>this</b> is not in scope on the right hand side of
@@ -928,14 +944,14 @@
    *
    * @param name the name of the type in question
    */
-  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 66, "Only static members can be accessed in initializers");
+  static const CompileTimeErrorCode IMPLICIT_THIS_REFERENCE_IN_INITIALIZER = const CompileTimeErrorCode.con1('IMPLICIT_THIS_REFERENCE_IN_INITIALIZER', 69, "Only static members can be accessed in initializers");
 
   /**
    * SDK implementation libraries can be imported only by other SDK libraries.
    *
    * @param uri the uri pointing to a library
    */
-  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 67, "The library '%s' is internal and cannot be imported");
+  static const CompileTimeErrorCode IMPORT_INTERNAL_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_INTERNAL_LIBRARY', 70, "The library '%s' is internal and cannot be imported");
 
   /**
    * 14.1 Imports: It is a compile-time error if the specified URI of an immediate import does not
@@ -944,7 +960,7 @@
    * @param uri the uri pointing to a non-library declaration
    * @see StaticWarningCode#IMPORT_OF_NON_LIBRARY
    */
-  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 68, "The imported library '%s' must not have a part-of directive");
+  static const CompileTimeErrorCode IMPORT_OF_NON_LIBRARY = const CompileTimeErrorCode.con1('IMPORT_OF_NON_LIBRARY', 71, "The imported library '%s' must not have a part-of directive");
 
   /**
    * 13.9 Switch: It is a compile-time error if values of the expressions <i>e<sub>k</sub></i> are
@@ -953,7 +969,7 @@
    * @param expressionSource the expression source code that is the unexpected type
    * @param expectedType the name of the expected type
    */
-  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 69, "Case expressions must have the same types, '%s' is not a '%s'");
+  static const CompileTimeErrorCode INCONSISTENT_CASE_EXPRESSION_TYPES = const CompileTimeErrorCode.con1('INCONSISTENT_CASE_EXPRESSION_TYPES', 72, "Case expressions must have the same types, '%s' is not a '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -964,7 +980,7 @@
    *          immediately enclosing class
    * @see #INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 70, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZER_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_NON_EXISTANT_FIELD', 73, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
@@ -975,7 +991,7 @@
    *          enclosing class
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 71, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZER_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZER_FOR_STATIC_FIELD', 74, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -987,7 +1003,7 @@
    * @see #INITIALIZING_FORMAL_FOR_STATIC_FIELD
    * @see #INITIALIZER_FOR_NON_EXISTANT_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 72, "'%s' is not a variable in the enclosing class");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD', 75, "'%s' is not a variable in the enclosing class");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form <i>this.id</i>. It is a
@@ -998,26 +1014,32 @@
    *          enclosing class
    * @see #INITIALIZER_FOR_STATIC_FIELD
    */
-  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 73, "'%s' is a static variable in the enclosing class, variables initialized in a constructor cannot be static");
+  static const CompileTimeErrorCode INITIALIZING_FORMAL_FOR_STATIC_FIELD = const CompileTimeErrorCode.con1('INITIALIZING_FORMAL_FOR_STATIC_FIELD', 76, "'%s' is a static field in the enclosing class, fields initialized in a constructor cannot be static");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 74, "Instance members cannot be accessed from a factory constructor");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 77, "Instance members cannot be accessed from a factory constructor");
 
   /**
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 75, "Instance members cannot be accessed from a static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 78, "Instance members cannot be accessed from a static method");
+
+  /**
+   * Enum proposal: It is also a compile-time error to explicitly instantiate an enum via 'new' or
+   * 'const' or to access its private fields.
+   */
+  static const CompileTimeErrorCode INSTANTIATE_ENUM = const CompileTimeErrorCode.con1('INSTANTIATE_ENUM', 79, "Enums cannot be instantiated");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 76, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 80, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1027,7 +1049,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 77, "Constant values from a deferred library cannot be used as annotations");
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 81, "Constant values from a deferred library cannot be used as annotations");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1035,26 +1057,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 78, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 82, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 79, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 83, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 80, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 84, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 81, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 85, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1062,7 +1084,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 82, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 86, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1070,7 +1092,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 83, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 87, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1085,7 +1107,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 84, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 88, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1096,7 +1118,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 85, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 89, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1107,7 +1129,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 86, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 90, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1121,7 +1143,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 91, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1135,7 +1157,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 92, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1149,13 +1171,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 89, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 93, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 90, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 94, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1163,17 +1185,29 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 91, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 95, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 92, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 96, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 93, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 97, "Map literals must be prefixed with 'const' when used as a constant expression");
+
+  /**
+   * Enum proposal: It is a static warning if all of the following conditions hold:
+   * * The switch statement does not have a 'default' clause.
+   * * The static type of <i>e</i> is an enumerated typed with elements <i>id<sub>1</sub></i>,
+   * &hellip;, <i>id<sub>n</sub></i>.
+   * * The sets {<i>e<sub>1</sub></i>, &hellip;, <i>e<sub>k</sub></i>} and {<i>id<sub>1</sub></i>,
+   * &hellip;, <i>id<sub>n</sub></i>} are not the same.
+   *
+   * @param constantName the name of the constant that is missing
+   */
+  static const CompileTimeErrorCode MISSING_ENUM_CONSTANT_IN_SWITCH = const CompileTimeErrorCode.con2('MISSING_ENUM_CONSTANT_IN_SWITCH', 98, "Missing case clause for '%s'", "Add a case clause for the missing constant or add a default clause.");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1181,7 +1215,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 94, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 99, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1191,7 +1225,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 95, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 100, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1199,7 +1233,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 96, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 101, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1218,43 +1252,48 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 97, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 102, "Classes cannot mixin '%s'");
+
+  /**
+   * Enum proposal: It is a compile-time error to subclass, mix-in or implement an enum.
+   */
+  static const CompileTimeErrorCode MIXIN_OF_ENUM = const CompileTimeErrorCode.con1('MIXIN_OF_ENUM', 103, "Classes cannot mixin an enum");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 98, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 104, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 99, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 105, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 100, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 106, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 101, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 107, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 102, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 108, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 103, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 109, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1264,7 +1303,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 104, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 110, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1273,13 +1312,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 105, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 111, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 106, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 112, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1290,7 +1329,7 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 107, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 113, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1304,13 +1343,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 108, "Constant values from a deferred library cannot be used as a case expression");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 114, "Constant values from a deferred library cannot be used as a case expression");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 109, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 115, "Default values of an optional parameter must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1319,13 +1358,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 110, "Constant values from a deferred library cannot be used as a default parameter value");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 116, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 111, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 117, "'const' lists must have all constant values");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
@@ -1334,13 +1373,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 112, "Constant values from a deferred library cannot be used as values in a 'const' list");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 118, "Constant values from a deferred library cannot be used as values in a 'const' list");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 113, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 119, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1349,13 +1388,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 114, "Constant values from a deferred library cannot be used as keys in a map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 120, "Constant values from a deferred library cannot be used as keys in a map");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 115, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 121, "The values in a 'const' map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1364,7 +1403,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 116, "Constant values from a deferred library cannot be used as values in a 'const' map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 122, "Constant values from a deferred library cannot be used as values in a 'const' map");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1374,13 +1413,13 @@
    * "From deferred library" case is covered by
    * [CompileTimeErrorCode#INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 117, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 123, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 118, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 124, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
@@ -1389,7 +1428,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 119, "Constant values from a deferred library cannot be used as constant initializers");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 125, "Constant values from a deferred library cannot be used as constant initializers");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1400,7 +1439,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 120, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 126, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1408,17 +1447,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 121, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 127, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 122, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 128, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 123, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 129, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1426,25 +1465,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 124, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 130, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 125, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 131, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 126, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 132, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 127, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 133, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1455,13 +1494,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 128, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 134, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 129, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 135, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1474,7 +1513,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 130, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 136, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1486,7 +1525,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 131, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 137, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1498,7 +1537,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 132, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 138, "'%s' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1510,61 +1549,61 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 133, "'%s' cannot use itself as a mixin");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 139, "'%s' cannot use itself as a mixin");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 134, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 140, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 135, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 141, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 136, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 142, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 137, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 143, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 138, "Generative constructor cannot redirect to a factory constructor");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 144, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 139, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 145, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 140, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 146, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 141, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 147, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 142, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 148, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1574,19 +1613,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 143, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 149, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 144, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 150, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 145, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 151, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1605,19 +1644,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 146, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 152, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 147, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 153, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 148, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 154, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1625,7 +1664,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 149, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 155, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1633,7 +1672,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 150, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 156, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1645,7 +1684,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 151, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 157, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1660,7 +1699,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 152, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 158, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1672,7 +1711,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 153, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 159, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1685,7 +1724,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 154, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 160, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1693,15 +1732,16 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 155, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 161, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 156, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 162, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
+      ACCESS_PRIVATE_ENUM_FIELD,
       AMBIGUOUS_EXPORT,
       ARGUMENT_DEFINITION_TEST_NON_PARAMETER,
       BUILT_IN_IDENTIFIER_AS_TYPE,
@@ -1751,6 +1791,7 @@
       DUPLICATE_NAMED_ARGUMENT,
       EXPORT_INTERNAL_LIBRARY,
       EXPORT_OF_NON_LIBRARY,
+      EXTENDS_ENUM,
       EXTENDS_NON_CLASS,
       EXTENDS_DISALLOWED_CLASS,
       EXTENDS_DEFERRED_CLASS,
@@ -1765,6 +1806,7 @@
       IMPLEMENTS_DEFERRED_CLASS,
       IMPLEMENTS_DISALLOWED_CLASS,
       IMPLEMENTS_DYNAMIC,
+      IMPLEMENTS_ENUM,
       IMPLEMENTS_NON_CLASS,
       IMPLEMENTS_REPEATED,
       IMPLEMENTS_SUPER_CLASS,
@@ -1778,6 +1820,7 @@
       INITIALIZING_FORMAL_FOR_STATIC_FIELD,
       INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
       INSTANCE_MEMBER_ACCESS_FROM_STATIC,
+      INSTANTIATE_ENUM,
       INVALID_ANNOTATION,
       INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
       INVALID_CONSTANT,
@@ -1796,10 +1839,12 @@
       METHOD_AND_GETTER_WITH_SAME_NAME,
       MISSING_CONST_IN_LIST_LITERAL,
       MISSING_CONST_IN_MAP_LITERAL,
+      MISSING_ENUM_CONSTANT_IN_SWITCH,
       MIXIN_DECLARES_CONSTRUCTOR,
       MIXIN_DEFERRED_CLASS,
       MIXIN_INHERITS_FROM_NOT_OBJECT,
       MIXIN_OF_DISALLOWED_CLASS,
+      MIXIN_OF_ENUM,
       MIXIN_OF_NON_CLASS,
       MIXIN_REFERENCES_SUPER,
       MIXIN_WITH_NON_CLASS_SUPERCLASS,
@@ -2932,6 +2977,16 @@
   static const StaticTypeWarningCode TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND = const StaticTypeWarningCode.con1('TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND', 15, "'%s' cannot be a supertype of its upper bound");
 
   /**
+   * 12.17 Getter Invocation: It is a static warning if there is no class <i>C</i> in the enclosing
+   * lexical scope of <i>i</i>, or if <i>C</i> does not declare, implicitly or explicitly, a getter
+   * named <i>m</i>.
+   *
+   * @param constantName the name of the enumeration constant that is not defined
+   * @param enumName the name of the enumeration used to access the constant
+   */
+  static const StaticTypeWarningCode UNDEFINED_ENUM_CONSTANT = const StaticTypeWarningCode.con1('UNDEFINED_ENUM_CONSTANT', 16, "There is no constant named '%s' in '%s'");
+
+  /**
    * 12.15.3 Unqualified Invocation: If there exists a lexically visible declaration named
    * <i>id</i>, let <i>f<sub>id</sub></i> be the innermost such declaration. Then: [skip].
    * Otherwise, <i>f<sub>id</sub></i> is considered equivalent to the ordinary method invocation
@@ -2940,7 +2995,7 @@
    *
    * @param methodName the name of the method that is undefined
    */
-  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 16, "The function '%s' is not defined");
+  static const StaticTypeWarningCode UNDEFINED_FUNCTION = const StaticTypeWarningCode.con1('UNDEFINED_FUNCTION', 17, "The function '%s' is not defined");
 
   /**
    * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is a static type
@@ -2949,7 +3004,7 @@
    * @param getterName the name of the getter
    * @param enclosingType the name of the enclosing type where the getter is being looked for
    */
-  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 17, "There is no such getter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_GETTER = const StaticTypeWarningCode.con1('UNDEFINED_GETTER', 18, "There is no such getter '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>. It is a static type
@@ -2958,7 +3013,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 18, "The method '%s' is not defined for the class '%s'");
+  static const StaticTypeWarningCode UNDEFINED_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_METHOD', 19, "The method '%s' is not defined for the class '%s'");
 
   /**
    * 12.18 Assignment: Evaluation of an assignment of the form
@@ -2976,7 +3031,7 @@
    * @param operator the name of the operator
    * @param enclosingType the name of the enclosing type where the operator is being looked for
    */
-  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 19, "There is no such operator '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_OPERATOR = const StaticTypeWarningCode.con1('UNDEFINED_OPERATOR', 20, "There is no such operator '%s' in '%s'");
 
   /**
    * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>. It is a static type
@@ -2986,7 +3041,7 @@
    * @param enclosingType the name of the enclosing type where the setter is being looked for
    * @see #INACCESSIBLE_SETTER
    */
-  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 20, "There is no such setter '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SETTER = const StaticTypeWarningCode.con1('UNDEFINED_SETTER', 21, "There is no such setter '%s' in '%s'");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -2997,7 +3052,7 @@
    * @param methodName the name of the method that is undefined
    * @param typeName the resolved type name that the method lookup is happening on
    */
-  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 21, "There is no such method '%s' in '%s'");
+  static const StaticTypeWarningCode UNDEFINED_SUPER_METHOD = const StaticTypeWarningCode.con1('UNDEFINED_SUPER_METHOD', 22, "There is no such method '%s' in '%s'");
 
   /**
    * 12.15.1 Ordinary Invocation: It is a static type warning if <i>T</i> does not have an
@@ -3007,7 +3062,7 @@
    * able to find the name defined in a supertype. It exists to provide a more informative error
    * message.
    */
-  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = const StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 22, "Static members from supertypes must be qualified by the name of the defining type");
+  static const StaticTypeWarningCode UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER = const StaticTypeWarningCode.con1('UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER', 23, "Static members from supertypes must be qualified by the name of the defining type");
 
   /**
    * 15.8 Parameterized Types: It is a static type warning if <i>G</i> is not a generic type with
@@ -3019,7 +3074,7 @@
    * @see CompileTimeErrorCode#CONST_WITH_INVALID_TYPE_PARAMETERS
    * @see CompileTimeErrorCode#NEW_WITH_INVALID_TYPE_PARAMETERS
    */
-  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 23, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
+  static const StaticTypeWarningCode WRONG_NUMBER_OF_TYPE_ARGUMENTS = const StaticTypeWarningCode.con1('WRONG_NUMBER_OF_TYPE_ARGUMENTS', 24, "The type '%s' is declared with %d type parameters, but %d type arguments were given");
 
   static const List<StaticTypeWarningCode> values = const [
       EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
@@ -3038,6 +3093,7 @@
       RETURN_OF_INVALID_TYPE,
       TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
       TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
+      UNDEFINED_ENUM_CONSTANT,
       UNDEFINED_FUNCTION,
       UNDEFINED_GETTER,
       UNDEFINED_METHOD,
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 2c99216..64ae986 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -511,6 +511,7 @@
   JavaPatternMatcher(RegExp re, String input) {
     _matches = re.allMatches(input).iterator;
   }
+  bool matches() => find();
   bool find() {
     if (!_matches.moveNext()) {
       return false;
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index ffdfe0e..e7da1e0 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -396,6 +396,32 @@
   AstNode visitEmptyStatement(EmptyStatement node) => _notAChild(node);
 
   @override
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    }
+    return _notAChild(node);
+  }
+
+  @override
+  AstNode visitEnumDeclaration(EnumDeclaration node) {
+    if (identical(_oldNode, node.documentationComment)) {
+      throw new InsufficientContextException();
+    } else if (node.metadata.contains(_oldNode)) {
+      return _parser.parseAnnotation();
+    } else if (identical(_oldNode, node.name)) {
+      return _parser.parseSimpleIdentifier();
+    } else if (node.constants.contains(_oldNode)) {
+      throw new InsufficientContextException();
+    }
+    return _notAChild(node);
+  }
+
+  @override
   AstNode visitExportDirective(ExportDirective node) {
     if (identical(_oldNode, node.documentationComment)) {
       throw new InsufficientContextException();
@@ -1454,14 +1480,19 @@
   bool _parseFunctionBodies = true;
 
   /**
+   * A flag indicating whether the parser is to parse the async support.
+   */
+  bool _parseAsync = AnalysisOptionsImpl.DEFAULT_ENABLE_ASYNC;
+
+  /**
    * A flag indicating whether the parser is to parse deferred libraries.
    */
   bool _parseDeferredLibraries = AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING;
 
   /**
-   * A flag indicating whether the parser is to parse the async support.
+   * A flag indicating whether the parser is to parse enum declarations.
    */
-  bool _parseAsync = AnalysisOptionsImpl.DEFAULT_ENABLE_ASYNC;
+  bool _parseEnum = AnalysisOptionsImpl.DEFAULT_ENABLE_ENUM;
 
   /**
    * The next token to be parsed.
@@ -1606,15 +1637,24 @@
   }
 
   /**
-   * Set whether parser is to parse deferred libraries.
+   * Set whether the parser is to parse deferred libraries.
    *
-   * @param parseDeferredLibraries `true` if parser is to parse deferred libraries
+   * @param parseDeferredLibraries `true` if the parser is to parse deferred libraries
    */
   void set parseDeferredLibraries(bool parseDeferredLibraries) {
     this._parseDeferredLibraries = parseDeferredLibraries;
   }
 
   /**
+   * Set whether the parser is to parse enum declarations.
+   *
+   * @param parseEnum `true` if the parser is to parse enum declarations
+   */
+  void set parseEnum(bool parseEnum) {
+    this._parseEnum = parseEnum;
+  }
+
+  /**
    * Set whether parser is to parse function bodies.
    *
    * @param parseFunctionBodies `true` if parser is to parse function bodies
@@ -4162,6 +4202,9 @@
     } else if (_matchesKeyword(Keyword.TYPEDEF) && !_tokenMatches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT) && !_tokenMatches(_peek(), TokenType.OPEN_PAREN)) {
       _validateModifiersForTypedef(modifiers);
       return _parseTypeAlias(commentAndMetadata);
+    } else if (_parseEnum && _matchesKeyword(Keyword.ENUM)) {
+      _validateModifiersForEnum(modifiers);
+      return _parseEnumDeclaration(commentAndMetadata);
     }
     if (_matchesKeyword(Keyword.VOID)) {
       TypeName returnType = parseReturnType();
@@ -4529,6 +4572,60 @@
    */
   Statement _parseEmptyStatement() => new EmptyStatement(andAdvance);
 
+  EnumConstantDeclaration _parseEnumConstantDeclaration() {
+    CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata();
+    SimpleIdentifier name;
+    if (_matchesIdentifier()) {
+      name = parseSimpleIdentifier();
+    } else {
+      name = _createSyntheticIdentifier();
+    }
+    return new EnumConstantDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, name);
+  }
+
+  /**
+   * Parse an enum declaration.
+   *
+   * <pre>
+   * enumType ::=
+   *     metadata 'enum' id '{' id (',' id)* (',')? '}'
+   * </pre>
+   *
+   * @param commentAndMetadata the metadata to be associated with the member
+   * @return the enum declaration that was parsed
+   */
+  EnumDeclaration _parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
+    Token keyword = _expectKeyword(Keyword.ENUM);
+    SimpleIdentifier name = parseSimpleIdentifier();
+    Token leftBracket = null;
+    List<EnumConstantDeclaration> constants = new List<EnumConstantDeclaration>();
+    Token rightBracket = null;
+    if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
+      leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
+      if (_matchesIdentifier()) {
+        constants.add(_parseEnumConstantDeclaration());
+      } else if (_matches(TokenType.COMMA) && _tokenMatchesIdentifier(_peek())) {
+        constants.add(_parseEnumConstantDeclaration());
+        _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
+      } else {
+        constants.add(_parseEnumConstantDeclaration());
+        _reportErrorForCurrentToken(ParserErrorCode.EMPTY_ENUM_BODY, []);
+      }
+      while (_optional(TokenType.COMMA)) {
+        if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
+          break;
+        }
+        constants.add(_parseEnumConstantDeclaration());
+      }
+      rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
+    } else {
+      leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET);
+      rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET);
+      _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY, []);
+    }
+    return new EnumDeclaration(commentAndMetadata.comment, commentAndMetadata.metadata, keyword, name, leftBracket, constants, rightBracket);
+  }
+
   /**
    * Parse an equality expression.
    *
@@ -7372,6 +7469,31 @@
   }
 
   /**
+   * Validate that the given set of modifiers is appropriate for a class and return the 'abstract'
+   * keyword if there is one.
+   *
+   * @param modifiers the modifiers being validated
+   */
+  void _validateModifiersForEnum(Modifiers modifiers) {
+    _validateModifiersForTopLevelDeclaration(modifiers);
+    if (modifiers.abstractKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.ABSTRACT_ENUM, modifiers.abstractKeyword, []);
+    }
+    if (modifiers.constKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword, []);
+    }
+    if (modifiers.externalKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.EXTERNAL_ENUM, modifiers.externalKeyword, []);
+    }
+    if (modifiers.finalKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword, []);
+    }
+    if (modifiers.varKeyword != null) {
+      _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword, []);
+    }
+  }
+
+  /**
    * Validate that the given set of modifiers is appropriate for a field and return the 'final',
    * 'const' or 'var' keyword if there is one.
    *
@@ -7583,282 +7705,297 @@
 class ParserErrorCode extends Enum<ParserErrorCode> implements ErrorCode {
   static const ParserErrorCode ABSTRACT_CLASS_MEMBER = const ParserErrorCode.con3('ABSTRACT_CLASS_MEMBER', 0, "Members of classes cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 1, "Static methods cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_ENUM = const ParserErrorCode.con3('ABSTRACT_ENUM', 1, "Enums cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 2, "Top-level functions cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_STATIC_METHOD = const ParserErrorCode.con3('ABSTRACT_STATIC_METHOD', 2, "Static methods cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 3, "Top-level variables cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_FUNCTION = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_FUNCTION', 3, "Top-level functions cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode.con3('ABSTRACT_TYPEDEF', 4, "Type aliases cannot be declared to be 'abstract'");
+  static const ParserErrorCode ABSTRACT_TOP_LEVEL_VARIABLE = const ParserErrorCode.con3('ABSTRACT_TOP_LEVEL_VARIABLE', 4, "Top-level variables cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', 5, "Assert cannot be called on an assignment");
+  static const ParserErrorCode ABSTRACT_TYPEDEF = const ParserErrorCode.con3('ABSTRACT_TYPEDEF', 5, "Type aliases cannot be declared to be 'abstract'");
 
-  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_CASCADE', 6, "Assert cannot be called on cascade");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_ASSIGNMENT = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_ASSIGNMENT', 6, "Assert cannot be called on an assignment");
 
-  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_THROW', 7, "Assert cannot be called on throws");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_CASCADE = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_CASCADE', 7, "Assert cannot be called on cascade");
 
-  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_RETHROW', 8, "Assert cannot be called on rethrows");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_THROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_THROW', 8, "Assert cannot be called on throws");
 
-  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 9, "A break statement cannot be used outside of a loop or switch statement");
+  static const ParserErrorCode ASSERT_DOES_NOT_TAKE_RETHROW = const ParserErrorCode.con3('ASSERT_DOES_NOT_TAKE_RETHROW', 9, "Assert cannot be called on rethrows");
 
-  static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode.con3('CONST_AND_FINAL', 10, "Members cannot be declared to be both 'const' and 'final'");
+  static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('BREAK_OUTSIDE_OF_LOOP', 10, "A break statement cannot be used outside of a loop or switch statement");
 
-  static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode.con3('CONST_AND_VAR', 11, "Members cannot be declared to be both 'const' and 'var'");
+  static const ParserErrorCode CONST_AND_FINAL = const ParserErrorCode.con3('CONST_AND_FINAL', 11, "Members cannot be declared to be both 'const' and 'final'");
 
-  static const ParserErrorCode CONST_CLASS = const ParserErrorCode.con3('CONST_CLASS', 12, "Classes cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_AND_VAR = const ParserErrorCode.con3('CONST_AND_VAR', 12, "Members cannot be declared to be both 'const' and 'var'");
 
-  static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 13, "'const' constructors cannot have a body");
+  static const ParserErrorCode CONST_CLASS = const ParserErrorCode.con3('CONST_CLASS', 13, "Classes cannot be declared to be 'const'");
 
-  static const ParserErrorCode CONST_FACTORY = const ParserErrorCode.con3('CONST_FACTORY', 14, "Only redirecting factory constructors can be declared to be 'const'");
+  static const ParserErrorCode CONST_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('CONST_CONSTRUCTOR_WITH_BODY', 14, "'const' constructors cannot have a body");
 
-  static const ParserErrorCode CONST_METHOD = const ParserErrorCode.con3('CONST_METHOD', 15, "Getters, setters and methods cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_ENUM = const ParserErrorCode.con3('CONST_ENUM', 15, "Enums cannot be declared to be 'const'");
 
-  static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode.con3('CONST_TYPEDEF', 16, "Type aliases cannot be declared to be 'const'");
+  static const ParserErrorCode CONST_FACTORY = const ParserErrorCode.con3('CONST_FACTORY', 16, "Only redirecting factory constructors can be declared to be 'const'");
 
-  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 17, "Constructors cannot have a return type");
+  static const ParserErrorCode CONST_METHOD = const ParserErrorCode.con3('CONST_METHOD', 17, "Getters, setters and methods cannot be declared to be 'const'");
 
-  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 18, "A continue statement cannot be used outside of a loop or switch statement");
+  static const ParserErrorCode CONST_TYPEDEF = const ParserErrorCode.con3('CONST_TYPEDEF', 18, "Type aliases cannot be declared to be 'const'");
 
-  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 19, "A continue statement in a switch statement must have a label as a target");
+  static const ParserErrorCode CONSTRUCTOR_WITH_RETURN_TYPE = const ParserErrorCode.con3('CONSTRUCTOR_WITH_RETURN_TYPE', 19, "Constructors cannot have a return type");
 
-  static const ParserErrorCode DEFERRED_IMPORTS_NOT_SUPPORTED = const ParserErrorCode.con3('DEFERRED_IMPORTS_NOT_SUPPORTED', 20, "Deferred imports are not supported by default");
+  static const ParserErrorCode CONTINUE_OUTSIDE_OF_LOOP = const ParserErrorCode.con3('CONTINUE_OUTSIDE_OF_LOOP', 20, "A continue statement cannot be used outside of a loop or switch statement");
 
-  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 21, "The 'typedef' mixin application was replaced with 'class'");
+  static const ParserErrorCode CONTINUE_WITHOUT_LABEL_IN_CASE = const ParserErrorCode.con3('CONTINUE_WITHOUT_LABEL_IN_CASE', 21, "A continue statement in a switch statement must have a label as a target");
 
-  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 22, "Directives must appear before any declarations");
+  static const ParserErrorCode DEFERRED_IMPORTS_NOT_SUPPORTED = const ParserErrorCode.con3('DEFERRED_IMPORTS_NOT_SUPPORTED', 22, "Deferred imports are not supported by default");
 
-  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 23, "The label %s was already used in this switch statement");
+  static const ParserErrorCode DEPRECATED_CLASS_TYPE_ALIAS = const ParserErrorCode.con3('DEPRECATED_CLASS_TYPE_ALIAS', 23, "The 'typedef' mixin application was replaced with 'class'");
 
-  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 24, "The modifier '%s' was already specified.");
+  static const ParserErrorCode DIRECTIVE_AFTER_DECLARATION = const ParserErrorCode.con3('DIRECTIVE_AFTER_DECLARATION', 24, "Directives must appear before any declarations");
 
-  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 25, "Equality expression cannot be operand of another equality expression.");
+  static const ParserErrorCode DUPLICATE_LABEL_IN_SWITCH_STATEMENT = const ParserErrorCode.con3('DUPLICATE_LABEL_IN_SWITCH_STATEMENT', 25, "The label %s was already used in this switch statement");
 
-  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 26, "Expected 'case' or 'default'");
+  static const ParserErrorCode DUPLICATED_MODIFIER = const ParserErrorCode.con3('DUPLICATED_MODIFIER', 26, "The modifier '%s' was already specified.");
 
-  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 27, "Expected a class member");
+  static const ParserErrorCode EMPTY_ENUM_BODY = const ParserErrorCode.con3('EMPTY_ENUM_BODY', 27, "An enum must declare at least one constant name");
 
-  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 28, "Expected a method, getter, setter or operator declaration");
+  static const ParserErrorCode EQUALITY_CANNOT_BE_EQUALITY_OPERAND = const ParserErrorCode.con3('EQUALITY_CANNOT_BE_EQUALITY_OPERAND', 28, "Equality expression cannot be operand of another equality expression.");
 
-  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 29, "Expected a list or map literal");
+  static const ParserErrorCode EXPECTED_CASE_OR_DEFAULT = const ParserErrorCode.con3('EXPECTED_CASE_OR_DEFAULT', 29, "Expected 'case' or 'default'");
 
-  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 30, "Expected a string literal");
+  static const ParserErrorCode EXPECTED_CLASS_MEMBER = const ParserErrorCode.con3('EXPECTED_CLASS_MEMBER', 30, "Expected a class member");
 
-  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 31, "Expected to find '%s'");
+  static const ParserErrorCode EXPECTED_EXECUTABLE = const ParserErrorCode.con3('EXPECTED_EXECUTABLE', 31, "Expected a method, getter, setter or operator declaration");
 
-  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 32, "Expected a type name");
+  static const ParserErrorCode EXPECTED_LIST_OR_MAP_LITERAL = const ParserErrorCode.con3('EXPECTED_LIST_OR_MAP_LITERAL', 32, "Expected a list or map literal");
 
-  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 33, "Export directives must preceed part directives");
+  static const ParserErrorCode EXPECTED_STRING_LITERAL = const ParserErrorCode.con3('EXPECTED_STRING_LITERAL', 33, "Expected a string literal");
 
-  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 34, "The modifier 'external' should be before the modifier 'const'");
+  static const ParserErrorCode EXPECTED_TOKEN = const ParserErrorCode.con3('EXPECTED_TOKEN', 34, "Expected to find '%s'");
 
-  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 35, "The modifier 'external' should be before the modifier 'factory'");
+  static const ParserErrorCode EXPECTED_TYPE_NAME = const ParserErrorCode.con3('EXPECTED_TYPE_NAME', 35, "Expected a type name");
 
-  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 36, "The modifier 'external' should be before the modifier 'static'");
+  static const ParserErrorCode EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('EXPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 36, "Export directives must preceed part directives");
 
-  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 37, "Classes cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_AFTER_CONST = const ParserErrorCode.con3('EXTERNAL_AFTER_CONST', 37, "The modifier 'external' should be before the modifier 'const'");
 
-  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 38, "External constructors cannot have a body");
+  static const ParserErrorCode EXTERNAL_AFTER_FACTORY = const ParserErrorCode.con3('EXTERNAL_AFTER_FACTORY', 38, "The modifier 'external' should be before the modifier 'factory'");
 
-  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 39, "Fields cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_AFTER_STATIC = const ParserErrorCode.con3('EXTERNAL_AFTER_STATIC', 39, "The modifier 'external' should be before the modifier 'static'");
 
-  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 40, "External getters cannot have a body");
+  static const ParserErrorCode EXTERNAL_CLASS = const ParserErrorCode.con3('EXTERNAL_CLASS', 40, "Classes cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 41, "External methods cannot have a body");
+  static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_CONSTRUCTOR_WITH_BODY', 41, "External constructors cannot have a body");
 
-  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 42, "External operators cannot have a body");
+  static const ParserErrorCode EXTERNAL_ENUM = const ParserErrorCode.con3('EXTERNAL_ENUM', 42, "Enums cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 43, "External setters cannot have a body");
+  static const ParserErrorCode EXTERNAL_FIELD = const ParserErrorCode.con3('EXTERNAL_FIELD', 43, "Fields cannot be declared to be 'external'");
 
-  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 44, "Type aliases cannot be declared to be 'external'");
+  static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_GETTER_WITH_BODY', 44, "External getters cannot have a body");
 
-  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 45, "Top-level declarations cannot be declared to be 'factory'");
+  static const ParserErrorCode EXTERNAL_METHOD_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_METHOD_WITH_BODY', 45, "External methods cannot have a body");
 
-  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 46, "A non-redirecting 'factory' constructor must have a body");
+  static const ParserErrorCode EXTERNAL_OPERATOR_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_OPERATOR_WITH_BODY', 46, "External operators cannot have a body");
 
-  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 47, "Field initializers can only be used in a constructor");
+  static const ParserErrorCode EXTERNAL_SETTER_WITH_BODY = const ParserErrorCode.con3('EXTERNAL_SETTER_WITH_BODY', 47, "External setters cannot have a body");
 
-  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 48, "Members cannot be declared to be both 'final' and 'var'");
+  static const ParserErrorCode EXTERNAL_TYPEDEF = const ParserErrorCode.con3('EXTERNAL_TYPEDEF', 48, "Type aliases cannot be declared to be 'external'");
 
-  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 49, "Classes cannot be declared to be 'final'");
+  static const ParserErrorCode FACTORY_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('FACTORY_TOP_LEVEL_DECLARATION', 49, "Top-level declarations cannot be declared to be 'factory'");
 
-  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 50, "A constructor cannot be declared to be 'final'");
+  static const ParserErrorCode FACTORY_WITHOUT_BODY = const ParserErrorCode.con3('FACTORY_WITHOUT_BODY', 50, "A non-redirecting 'factory' constructor must have a body");
 
-  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 51, "Getters, setters and methods cannot be declared to be 'final'");
+  static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR = const ParserErrorCode.con3('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR', 51, "Field initializers can only be used in a constructor");
 
-  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 52, "Type aliases cannot be declared to be 'final'");
+  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode.con3('FINAL_AND_VAR', 52, "Members cannot be declared to be both 'final' and 'var'");
 
-  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 53, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
+  static const ParserErrorCode FINAL_CLASS = const ParserErrorCode.con3('FINAL_CLASS', 53, "Classes cannot be declared to be 'final'");
 
-  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 54, "Getters cannot be defined within methods or functions");
+  static const ParserErrorCode FINAL_CONSTRUCTOR = const ParserErrorCode.con3('FINAL_CONSTRUCTOR', 54, "A constructor cannot be declared to be 'final'");
 
-  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 55, "Getter should be declared without a parameter list");
+  static const ParserErrorCode FINAL_ENUM = const ParserErrorCode.con3('FINAL_ENUM', 55, "Enums cannot be declared to be 'final'");
 
-  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 56, "Illegal assignment to non-assignable expression");
+  static const ParserErrorCode FINAL_METHOD = const ParserErrorCode.con3('FINAL_METHOD', 56, "Getters, setters and methods cannot be declared to be 'final'");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 57, "The extends clause must be before the implements clause");
+  static const ParserErrorCode FINAL_TYPEDEF = const ParserErrorCode.con3('FINAL_TYPEDEF', 57, "Type aliases cannot be declared to be 'final'");
 
-  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 58, "The with clause must be before the implements clause");
+  static const ParserErrorCode FUNCTION_TYPED_PARAMETER_VAR = const ParserErrorCode.con3('FUNCTION_TYPED_PARAMETER_VAR', 58, "Function typed parameters cannot specify 'const', 'final' or 'var' instead of return type");
 
-  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 59, "Import directives must preceed part directives");
+  static const ParserErrorCode GETTER_IN_FUNCTION = const ParserErrorCode.con3('GETTER_IN_FUNCTION', 59, "Getters cannot be defined within methods or functions");
 
-  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 60, "The loop variable in a for-each loop cannot be initialized");
+  static const ParserErrorCode GETTER_WITH_PARAMETERS = const ParserErrorCode.con3('GETTER_WITH_PARAMETERS', 60, "Getter should be declared without a parameter list");
 
-  static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode.con4('INVALID_AWAIT_IN_FOR', 61, "The modifier 'await' is not allowed for a normal 'for' statement", "Remove the keyword or use a for-each statement.");
+  static const ParserErrorCode ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE = const ParserErrorCode.con3('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE', 61, "Illegal assignment to non-assignable expression");
 
-  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 62, "The escape sequence '%s' is not a valid code point");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_EXTENDS = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_EXTENDS', 62, "The extends clause must be before the implements clause");
 
-  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 63, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+  static const ParserErrorCode IMPLEMENTS_BEFORE_WITH = const ParserErrorCode.con3('IMPLEMENTS_BEFORE_WITH', 63, "The with clause must be before the implements clause");
 
-  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 64, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+  static const ParserErrorCode IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE = const ParserErrorCode.con3('IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE', 64, "Import directives must preceed part directives");
 
-  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 65, "The string '%s' is not a valid operator");
+  static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('INITIALIZED_VARIABLE_IN_FOR_EACH', 65, "The loop variable in a for-each loop cannot be initialized");
 
-  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 66, "The operator '%s' cannot be used with 'super'");
+  static const ParserErrorCode INVALID_AWAIT_IN_FOR = const ParserErrorCode.con4('INVALID_AWAIT_IN_FOR', 66, "The modifier 'await' is not allowed for a normal 'for' statement", "Remove the keyword or use a for-each statement.");
+
+  static const ParserErrorCode INVALID_CODE_POINT = const ParserErrorCode.con3('INVALID_CODE_POINT', 67, "The escape sequence '%s' is not a valid code point");
+
+  static const ParserErrorCode INVALID_COMMENT_REFERENCE = const ParserErrorCode.con3('INVALID_COMMENT_REFERENCE', 68, "Comment references should contain a possibly prefixed identifier and can start with 'new', but should not contain anything else");
+
+  static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode.con3('INVALID_HEX_ESCAPE', 69, "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits");
+
+  static const ParserErrorCode INVALID_OPERATOR = const ParserErrorCode.con3('INVALID_OPERATOR', 70, "The string '%s' is not a valid operator");
+
+  static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER = const ParserErrorCode.con3('INVALID_OPERATOR_FOR_SUPER', 71, "The operator '%s' cannot be used with 'super'");
+
+  static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode.con4('INVALID_STAR_AFTER_ASYNC', 72, "The modifier 'async*' is not allowed for an expression function body", "Convert the body to a block.");
+
+  static const ParserErrorCode INVALID_SYNC = const ParserErrorCode.con4('INVALID_SYNC', 73, "The modifier 'sync' is not allowed for an exrpression function body", "Convert the body to a block.");
 
-  static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode.con4('INVALID_STAR_AFTER_ASYNC', 67, "The modifier 'async*' is not allowed for an expression function body", "Convert the body to a block.");
+  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 74, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
 
-  static const ParserErrorCode INVALID_SYNC = const ParserErrorCode.con4('INVALID_SYNC', 68, "The modifier 'sync' is not allowed for an exrpression function body", "Convert the body to a block.");
+  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 75, "The library directive must appear before all other directives");
 
-  static const ParserErrorCode INVALID_UNICODE_ESCAPE = const ParserErrorCode.con3('INVALID_UNICODE_ESCAPE', 69, "An escape sequence starting with '\\u' must be followed by 4 hexidecimal digits or from 1 to 6 digits between '{' and '}'");
+  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 76, "Local function declarations cannot specify any modifier");
 
-  static const ParserErrorCode LIBRARY_DIRECTIVE_NOT_FIRST = const ParserErrorCode.con3('LIBRARY_DIRECTIVE_NOT_FIRST', 70, "The library directive must appear before all other directives");
+  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 77, "Missing selector such as \".<identifier>\" or \"[0]\"");
 
-  static const ParserErrorCode LOCAL_FUNCTION_DECLARATION_MODIFIER = const ParserErrorCode.con3('LOCAL_FUNCTION_DECLARATION_MODIFIER', 71, "Local function declarations cannot specify any modifier");
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 78, "A try statement must have either a catch or finally clause");
 
-  static const ParserErrorCode MISSING_ASSIGNABLE_SELECTOR = const ParserErrorCode.con3('MISSING_ASSIGNABLE_SELECTOR', 72, "Missing selector such as \".<identifier>\" or \"[0]\"");
+  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 79, "A class definition must have a body, even if it is empty");
 
-  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode.con3('MISSING_CATCH_OR_FINALLY', 73, "A try statement must have either a catch or finally clause");
+  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 80, "The closing parenthesis is missing");
 
-  static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode.con3('MISSING_CLASS_BODY', 74, "A class definition must have a body, even if it is empty");
+  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 81, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
 
-  static const ParserErrorCode MISSING_CLOSING_PARENTHESIS = const ParserErrorCode.con3('MISSING_CLOSING_PARENTHESIS', 75, "The closing parenthesis is missing");
+  static const ParserErrorCode MISSING_ENUM_BODY = const ParserErrorCode.con3('MISSING_ENUM_BODY', 82, "An enum definition must have a body with at least one constant name");
 
-  static const ParserErrorCode MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode.con3('MISSING_CONST_FINAL_VAR_OR_TYPE', 76, "Variables must be declared using the keywords 'const', 'final', 'var' or a type name");
+  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 83, "Throw expressions must compute the object to be thrown");
 
-  static const ParserErrorCode MISSING_EXPRESSION_IN_THROW = const ParserErrorCode.con3('MISSING_EXPRESSION_IN_THROW', 77, "Throw expressions must compute the object to be thrown");
+  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 84, "A function body must be provided");
 
-  static const ParserErrorCode MISSING_FUNCTION_BODY = const ParserErrorCode.con3('MISSING_FUNCTION_BODY', 78, "A function body must be provided");
+  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 85, "Functions must have an explicit list of parameters");
 
-  static const ParserErrorCode MISSING_FUNCTION_PARAMETERS = const ParserErrorCode.con3('MISSING_FUNCTION_PARAMETERS', 79, "Functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 86, "Getters must have the keyword 'get' before the getter name");
 
-  static const ParserErrorCode MISSING_GET = const ParserErrorCode.con3('MISSING_GET', 80, "Getters must have the keyword 'get' before the getter name");
+  static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 87, "Expected an identifier");
 
-  static const ParserErrorCode MISSING_IDENTIFIER = const ParserErrorCode.con3('MISSING_IDENTIFIER', 81, "Expected an identifier");
+  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 88, "Operator declarations must be preceeded by the keyword 'operator'");
 
-  static const ParserErrorCode MISSING_KEYWORD_OPERATOR = const ParserErrorCode.con3('MISSING_KEYWORD_OPERATOR', 82, "Operator declarations must be preceeded by the keyword 'operator'");
+  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 89, "Library directives must include a library name");
 
-  static const ParserErrorCode MISSING_NAME_IN_LIBRARY_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_LIBRARY_DIRECTIVE', 83, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 90, "Library directives must include a library name");
 
-  static const ParserErrorCode MISSING_NAME_IN_PART_OF_DIRECTIVE = const ParserErrorCode.con3('MISSING_NAME_IN_PART_OF_DIRECTIVE', 84, "Library directives must include a library name");
+  static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = const ParserErrorCode.con3('MISSING_PREFIX_IN_DEFERRED_IMPORT', 91, "Deferred imports must have a prefix");
 
-  static const ParserErrorCode MISSING_PREFIX_IN_DEFERRED_IMPORT = const ParserErrorCode.con3('MISSING_PREFIX_IN_DEFERRED_IMPORT', 85, "Deferred imports must have a prefix");
+  static const ParserErrorCode MISSING_STAR_AFTER_SYNC = const ParserErrorCode.con4('MISSING_STAR_AFTER_SYNC', 92, "The modifier 'sync' must be followed by a star ('*')", "Remove the modifier or add a star.");
 
-  static const ParserErrorCode MISSING_STAR_AFTER_SYNC = const ParserErrorCode.con4('MISSING_STAR_AFTER_SYNC', 86, "The modifier 'sync' must be followed by a star ('*')", "Remove the modifier or add a star.");
+  static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 93, "Expected a statement");
 
-  static const ParserErrorCode MISSING_STATEMENT = const ParserErrorCode.con3('MISSING_STATEMENT', 87, "Expected a statement");
+  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 94, "There is no '%s' to close the parameter group");
 
-  static const ParserErrorCode MISSING_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('MISSING_TERMINATOR_FOR_PARAMETER_GROUP', 88, "There is no '%s' to close the parameter group");
+  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 95, "Type aliases for functions must have an explicit list of parameters");
 
-  static const ParserErrorCode MISSING_TYPEDEF_PARAMETERS = const ParserErrorCode.con3('MISSING_TYPEDEF_PARAMETERS', 89, "Type aliases for functions must have an explicit list of parameters");
+  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 96, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
 
-  static const ParserErrorCode MISSING_VARIABLE_IN_FOR_EACH = const ParserErrorCode.con3('MISSING_VARIABLE_IN_FOR_EACH', 90, "A loop variable must be declared in a for-each loop before the 'in', but none were found");
+  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 97, "Cannot have both positional and named parameters in a single parameter list");
 
-  static const ParserErrorCode MIXED_PARAMETER_GROUPS = const ParserErrorCode.con3('MIXED_PARAMETER_GROUPS', 91, "Cannot have both positional and named parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 98, "Each class definition can have at most one extends clause");
 
-  static const ParserErrorCode MULTIPLE_EXTENDS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_EXTENDS_CLAUSES', 92, "Each class definition can have at most one extends clause");
+  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 99, "Each class definition can have at most one implements clause");
 
-  static const ParserErrorCode MULTIPLE_IMPLEMENTS_CLAUSES = const ParserErrorCode.con3('MULTIPLE_IMPLEMENTS_CLAUSES', 93, "Each class definition can have at most one implements clause");
+  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 100, "Only one library directive may be declared in a file");
 
-  static const ParserErrorCode MULTIPLE_LIBRARY_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_LIBRARY_DIRECTIVES', 94, "Only one library directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 101, "Cannot have multiple groups of named parameters in a single parameter list");
 
-  static const ParserErrorCode MULTIPLE_NAMED_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_NAMED_PARAMETER_GROUPS', 95, "Cannot have multiple groups of named parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 102, "Only one part-of directive may be declared in a file");
 
-  static const ParserErrorCode MULTIPLE_PART_OF_DIRECTIVES = const ParserErrorCode.con3('MULTIPLE_PART_OF_DIRECTIVES', 96, "Only one part-of directive may be declared in a file");
+  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 103, "Cannot have multiple groups of positional parameters in a single parameter list");
 
-  static const ParserErrorCode MULTIPLE_POSITIONAL_PARAMETER_GROUPS = const ParserErrorCode.con3('MULTIPLE_POSITIONAL_PARAMETER_GROUPS', 97, "Cannot have multiple groups of positional parameters in a single parameter list");
+  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = const ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 104, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
 
-  static const ParserErrorCode MULTIPLE_VARIABLES_IN_FOR_EACH = const ParserErrorCode.con3('MULTIPLE_VARIABLES_IN_FOR_EACH', 98, "A single loop variable must be declared in a for-each loop before the 'in', but %s were found");
+  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 105, "Each class definition can have at most one with clause");
 
-  static const ParserErrorCode MULTIPLE_WITH_CLAUSES = const ParserErrorCode.con3('MULTIPLE_WITH_CLAUSES', 99, "Each class definition can have at most one with clause");
+  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = const ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 106, "Function expressions cannot be named");
 
-  static const ParserErrorCode NAMED_FUNCTION_EXPRESSION = const ParserErrorCode.con3('NAMED_FUNCTION_EXPRESSION', 100, "Function expressions cannot be named");
+  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 107, "Named parameters must be enclosed in curly braces ('{' and '}')");
 
-  static const ParserErrorCode NAMED_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('NAMED_PARAMETER_OUTSIDE_GROUP', 101, "Named parameters must be enclosed in curly braces ('{' and '}')");
+  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 108, "Native clause can only be used in the SDK and code that is loaded through native extensions");
 
-  static const ParserErrorCode NATIVE_CLAUSE_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_CLAUSE_IN_NON_SDK_CODE', 102, "Native clause can only be used in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 109, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
 
-  static const ParserErrorCode NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE = const ParserErrorCode.con3('NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE', 103, "Native functions can only be declared in the SDK and code that is loaded through native extensions");
+  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 110, "Only constructors can be declared to be a 'factory'");
 
-  static const ParserErrorCode NON_CONSTRUCTOR_FACTORY = const ParserErrorCode.con3('NON_CONSTRUCTOR_FACTORY', 104, "Only constructors can be declared to be a 'factory'");
+  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = const ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 111, "The name of a library must be an identifier");
 
-  static const ParserErrorCode NON_IDENTIFIER_LIBRARY_NAME = const ParserErrorCode.con3('NON_IDENTIFIER_LIBRARY_NAME', 105, "The name of a library must be an identifier");
+  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 112, "The part-of directive must be the only directive in a part");
 
-  static const ParserErrorCode NON_PART_OF_DIRECTIVE_IN_PART = const ParserErrorCode.con3('NON_PART_OF_DIRECTIVE_IN_PART', 106, "The part-of directive must be the only directive in a part");
+  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 113, "The operator '%s' is not user definable");
 
-  static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = const ParserErrorCode.con3('NON_USER_DEFINABLE_OPERATOR', 107, "The operator '%s' is not user definable");
+  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 114, "Normal parameters must occur before optional parameters");
 
-  static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = const ParserErrorCode.con3('NORMAL_BEFORE_OPTIONAL_PARAMETERS', 108, "Normal parameters must occur before optional parameters");
+  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = const ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 115, "Positional arguments must occur before named arguments");
 
-  static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = const ParserErrorCode.con3('POSITIONAL_AFTER_NAMED_ARGUMENT', 109, "Positional arguments must occur before named arguments");
+  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 116, "Positional parameters must be enclosed in square brackets ('[' and ']')");
 
-  static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = const ParserErrorCode.con3('POSITIONAL_PARAMETER_OUTSIDE_GROUP', 110, "Positional parameters must be enclosed in square brackets ('[' and ']')");
+  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = const ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 117, "Only factory constructor can specify '=' redirection.");
 
-  static const ParserErrorCode REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR = const ParserErrorCode.con3('REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR', 111, "Only factory constructor can specify '=' redirection.");
+  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode.con3('SETTER_IN_FUNCTION', 118, "Setters cannot be defined within methods or functions");
 
-  static const ParserErrorCode SETTER_IN_FUNCTION = const ParserErrorCode.con3('SETTER_IN_FUNCTION', 112, "Setters cannot be defined within methods or functions");
+  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode.con3('STATIC_AFTER_CONST', 119, "The modifier 'static' should be before the modifier 'const'");
 
-  static const ParserErrorCode STATIC_AFTER_CONST = const ParserErrorCode.con3('STATIC_AFTER_CONST', 113, "The modifier 'static' should be before the modifier 'const'");
+  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode.con3('STATIC_AFTER_FINAL', 120, "The modifier 'static' should be before the modifier 'final'");
 
-  static const ParserErrorCode STATIC_AFTER_FINAL = const ParserErrorCode.con3('STATIC_AFTER_FINAL', 114, "The modifier 'static' should be before the modifier 'final'");
+  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode.con3('STATIC_AFTER_VAR', 121, "The modifier 'static' should be before the modifier 'var'");
 
-  static const ParserErrorCode STATIC_AFTER_VAR = const ParserErrorCode.con3('STATIC_AFTER_VAR', 115, "The modifier 'static' should be before the modifier 'var'");
+  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode.con3('STATIC_CONSTRUCTOR', 122, "Constructors cannot be static");
 
-  static const ParserErrorCode STATIC_CONSTRUCTOR = const ParserErrorCode.con3('STATIC_CONSTRUCTOR', 116, "Constructors cannot be static");
+  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 123, "A 'static' getter must have a body");
 
-  static const ParserErrorCode STATIC_GETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_GETTER_WITHOUT_BODY', 117, "A 'static' getter must have a body");
+  static const ParserErrorCode STATIC_OPERATOR = const ParserErrorCode.con3('STATIC_OPERATOR', 124, "Operators cannot be static");
 
-  static const ParserErrorCode STATIC_OPERATOR = const ParserErrorCode.con3('STATIC_OPERATOR', 118, "Operators cannot be static");
+  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 125, "A 'static' setter must have a body");
 
-  static const ParserErrorCode STATIC_SETTER_WITHOUT_BODY = const ParserErrorCode.con3('STATIC_SETTER_WITHOUT_BODY', 119, "A 'static' setter must have a body");
+  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 126, "Top-level declarations cannot be declared to be 'static'");
 
-  static const ParserErrorCode STATIC_TOP_LEVEL_DECLARATION = const ParserErrorCode.con3('STATIC_TOP_LEVEL_DECLARATION', 120, "Top-level declarations cannot be declared to be 'static'");
+  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = const ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 127, "The 'default' case should be the last case in a switch statement");
 
-  static const ParserErrorCode SWITCH_HAS_CASE_AFTER_DEFAULT_CASE = const ParserErrorCode.con3('SWITCH_HAS_CASE_AFTER_DEFAULT_CASE', 121, "The 'default' case should be the last case in a switch statement");
+  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = const ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 128, "The 'default' case can only be declared once");
 
-  static const ParserErrorCode SWITCH_HAS_MULTIPLE_DEFAULT_CASES = const ParserErrorCode.con3('SWITCH_HAS_MULTIPLE_DEFAULT_CASES', 122, "The 'default' case can only be declared once");
+  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 129, "Operators must be declared within a class");
 
-  static const ParserErrorCode TOP_LEVEL_OPERATOR = const ParserErrorCode.con3('TOP_LEVEL_OPERATOR', 123, "Operators must be declared within a class");
+  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 130, "There is no '%s' to open a parameter group");
 
-  static const ParserErrorCode UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('UNEXPECTED_TERMINATOR_FOR_PARAMETER_GROUP', 124, "There is no '%s' to open a parameter group");
+  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 131, "Unexpected token '%s'");
 
-  static const ParserErrorCode UNEXPECTED_TOKEN = const ParserErrorCode.con3('UNEXPECTED_TOKEN', 125, "Unexpected token '%s'");
+  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 132, "The extends clause must be before the with clause");
 
-  static const ParserErrorCode WITH_BEFORE_EXTENDS = const ParserErrorCode.con3('WITH_BEFORE_EXTENDS', 126, "The extends clause must be before the with clause");
+  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 133, "The with clause cannot be used without an extends clause");
 
-  static const ParserErrorCode WITH_WITHOUT_EXTENDS = const ParserErrorCode.con3('WITH_WITHOUT_EXTENDS', 127, "The with clause cannot be used without an extends clause");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 134, "The default value of a named parameter should be preceeded by ':'");
 
-  static const ParserErrorCode WRONG_SEPARATOR_FOR_NAMED_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_NAMED_PARAMETER', 128, "The default value of a named parameter should be preceeded by ':'");
+  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 135, "The default value of a positional parameter should be preceeded by '='");
 
-  static const ParserErrorCode WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER = const ParserErrorCode.con3('WRONG_SEPARATOR_FOR_POSITIONAL_PARAMETER', 129, "The default value of a positional parameter should be preceeded by '='");
+  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 136, "Expected '%s' to close parameter group");
 
-  static const ParserErrorCode WRONG_TERMINATOR_FOR_PARAMETER_GROUP = const ParserErrorCode.con3('WRONG_TERMINATOR_FOR_PARAMETER_GROUP', 130, "Expected '%s' to close parameter group");
+  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 137, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
 
-  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode.con3('VAR_AND_TYPE', 131, "Variables cannot be declared using both 'var' and a type name; remove the 'var'");
+  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode.con3('VAR_AS_TYPE_NAME', 138, "The keyword 'var' cannot be used as a type name");
 
-  static const ParserErrorCode VAR_AS_TYPE_NAME = const ParserErrorCode.con3('VAR_AS_TYPE_NAME', 132, "The keyword 'var' cannot be used as a type name");
+  static const ParserErrorCode VAR_CLASS = const ParserErrorCode.con3('VAR_CLASS', 139, "Classes cannot be declared to be 'var'");
 
-  static const ParserErrorCode VAR_CLASS = const ParserErrorCode.con3('VAR_CLASS', 133, "Classes cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_ENUM = const ParserErrorCode.con3('VAR_ENUM', 140, "Enums cannot be declared to be 'var'");
 
-  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode.con3('VAR_RETURN_TYPE', 134, "The return type cannot be 'var'");
+  static const ParserErrorCode VAR_RETURN_TYPE = const ParserErrorCode.con3('VAR_RETURN_TYPE', 141, "The return type cannot be 'var'");
 
-  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode.con3('VAR_TYPEDEF', 135, "Type aliases cannot be declared to be 'var'");
+  static const ParserErrorCode VAR_TYPEDEF = const ParserErrorCode.con3('VAR_TYPEDEF', 142, "Type aliases cannot be declared to be 'var'");
 
-  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode.con3('VOID_PARAMETER', 136, "Parameters cannot have a type of 'void'");
+  static const ParserErrorCode VOID_PARAMETER = const ParserErrorCode.con3('VOID_PARAMETER', 143, "Parameters cannot have a type of 'void'");
 
-  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode.con3('VOID_VARIABLE', 137, "Variables cannot have a type of 'void'");
+  static const ParserErrorCode VOID_VARIABLE = const ParserErrorCode.con3('VOID_VARIABLE', 144, "Variables cannot have a type of 'void'");
 
   static const List<ParserErrorCode> values = const [
       ABSTRACT_CLASS_MEMBER,
+      ABSTRACT_ENUM,
       ABSTRACT_STATIC_METHOD,
       ABSTRACT_TOP_LEVEL_FUNCTION,
       ABSTRACT_TOP_LEVEL_VARIABLE,
@@ -7872,6 +8009,7 @@
       CONST_AND_VAR,
       CONST_CLASS,
       CONST_CONSTRUCTOR_WITH_BODY,
+      CONST_ENUM,
       CONST_FACTORY,
       CONST_METHOD,
       CONST_TYPEDEF,
@@ -7883,6 +8021,7 @@
       DIRECTIVE_AFTER_DECLARATION,
       DUPLICATE_LABEL_IN_SWITCH_STATEMENT,
       DUPLICATED_MODIFIER,
+      EMPTY_ENUM_BODY,
       EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
       EXPECTED_CASE_OR_DEFAULT,
       EXPECTED_CLASS_MEMBER,
@@ -7897,6 +8036,7 @@
       EXTERNAL_AFTER_STATIC,
       EXTERNAL_CLASS,
       EXTERNAL_CONSTRUCTOR_WITH_BODY,
+      EXTERNAL_ENUM,
       EXTERNAL_FIELD,
       EXTERNAL_GETTER_WITH_BODY,
       EXTERNAL_METHOD_WITH_BODY,
@@ -7909,6 +8049,7 @@
       FINAL_AND_VAR,
       FINAL_CLASS,
       FINAL_CONSTRUCTOR,
+      FINAL_ENUM,
       FINAL_METHOD,
       FINAL_TYPEDEF,
       FUNCTION_TYPED_PARAMETER_VAR,
@@ -7935,6 +8076,7 @@
       MISSING_CLASS_BODY,
       MISSING_CLOSING_PARENTHESIS,
       MISSING_CONST_FINAL_VAR_OR_TYPE,
+      MISSING_ENUM_BODY,
       MISSING_EXPRESSION_IN_THROW,
       MISSING_FUNCTION_BODY,
       MISSING_FUNCTION_PARAMETERS,
@@ -7992,6 +8134,7 @@
       VAR_AND_TYPE,
       VAR_AS_TYPE_NAME,
       VAR_CLASS,
+      VAR_ENUM,
       VAR_RETURN_TYPE,
       VAR_TYPEDEF,
       VOID_PARAMETER,
@@ -8330,6 +8473,18 @@
   }
 
   @override
+  bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    EnumConstantDeclaration toNode = this._toNode as EnumConstantDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name));
+  }
+
+  @override
+  bool visitEnumDeclaration(EnumDeclaration node) {
+    EnumDeclaration toNode = this._toNode as EnumDeclaration;
+    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.constants, toNode.constants)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+  }
+
+  @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective toNode = this._toNode as ExportDirective;
     if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.uri, toNode.uri)), _isEqualNodeLists(node.combinators, toNode.combinators)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
@@ -9139,6 +9294,8 @@
   'parseDocumentationComment_0': new MethodTrampoline(0, (Parser target) => target._parseDocumentationComment()),
   'parseDoStatement_0': new MethodTrampoline(0, (Parser target) => target._parseDoStatement()),
   'parseEmptyStatement_0': new MethodTrampoline(0, (Parser target) => target._parseEmptyStatement()),
+  'parseEnumConstantDeclaration_0': new MethodTrampoline(0, (Parser target) => target._parseEnumConstantDeclaration()),
+  'parseEnumDeclaration_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseEnumDeclaration(arg0)),
   'parseEqualityExpression_0': new MethodTrampoline(0, (Parser target) => target._parseEqualityExpression()),
   'parseExportDirective_1': new MethodTrampoline(1, (Parser target, arg0) => target._parseExportDirective(arg0)),
   'parseExpressionList_0': new MethodTrampoline(0, (Parser target) => target._parseExpressionList()),
@@ -9224,6 +9381,7 @@
   'validateFormalParameterList_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateFormalParameterList(arg0)),
   'validateModifiersForClass_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForClass(arg0)),
   'validateModifiersForConstructor_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForConstructor(arg0)),
+  'validateModifiersForEnum_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForEnum(arg0)),
   'validateModifiersForField_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForField(arg0)),
   'validateModifiersForFunctionDeclarationStatement_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForFunctionDeclarationStatement(arg0)),
   'validateModifiersForGetterOrSetterOrMethod_1': new MethodTrampoline(1, (Parser target, arg0) => target._validateModifiersForGetterOrSetterOrMethod(arg0)),
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index fa12291..6d39b3b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1292,6 +1292,7 @@
       unit.accept(builder);
       CompilationUnitElementImpl element = new CompilationUnitElementImpl(source.shortName);
       element.accessors = holder.accessors;
+      element.enums = holder.enums;
       element.functions = holder.functions;
       element.source = source;
       element.typeAliases = holder.typeAliases;
@@ -2325,6 +2326,18 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement enclosingEnum = _findIdentifier(_enclosingUnit.enums, node.name);
+    processElement(enclosingEnum);
+    List<FieldElement> constants = enclosingEnum.fields;
+    for (EnumConstantDeclaration constant in node.constants) {
+      FieldElement constantElement = _findIdentifier(constants, constant.name);
+      processElement(constantElement);
+    }
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     String uri = _getStringValue(node.uri);
     if (uri != null) {
@@ -2911,6 +2924,16 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement enclosingEnum = _findIdentifier(_enclosingUnit.enums, node.name);
+    List<FieldElement> constants = enclosingEnum.fields;
+    for (EnumConstantDeclaration constant in node.constants) {
+      _findIdentifier(constants, constant.name);
+    }
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     String uri = _getStringValue(node.uri);
     if (uri != null) {
@@ -3558,6 +3581,17 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    SimpleIdentifier enumName = node.name;
+    ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
+    InterfaceTypeImpl enumType = new InterfaceTypeImpl.con1(enumElement);
+    enumElement.type = enumType;
+    _currentHolder.addEnum(enumElement);
+    enumName.staticElement = enumElement;
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     bool wasInField = _inFieldContext;
     _inFieldContext = true;
@@ -3759,71 +3793,98 @@
 
   @override
   Object visitMethodDeclaration(MethodDeclaration node) {
-    ElementHolder holder = new ElementHolder();
-    bool wasInFunction = _inFunction;
-    _inFunction = true;
     try {
-      _visitChildren(holder, node);
-    } finally {
-      _inFunction = wasInFunction;
-    }
-    bool isStatic = node.isStatic;
-    sc.Token property = node.propertyKeyword;
-    if (property == null) {
-      SimpleIdentifier methodName = node.name;
-      String nameOfMethod = methodName.name;
-      if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
-        nameOfMethod = "unary-";
+      ElementHolder holder = new ElementHolder();
+      bool wasInFunction = _inFunction;
+      _inFunction = true;
+      try {
+        _visitChildren(holder, node);
+      } finally {
+        _inFunction = wasInFunction;
       }
-      MethodElementImpl element = new MethodElementImpl(nameOfMethod, methodName.offset);
-      element.abstract = node.isAbstract;
-      element.functions = holder.functions;
-      element.labels = holder.labels;
-      element.localVariables = holder.localVariables;
-      element.parameters = holder.parameters;
-      element.static = isStatic;
-      _currentHolder.addMethod(element);
-      methodName.staticElement = element;
-    } else {
-      SimpleIdentifier propertyNameNode = node.name;
-      String propertyName = propertyNameNode.name;
-      FieldElementImpl field = _currentHolder.getField(propertyName) as FieldElementImpl;
-      if (field == null) {
-        field = new FieldElementImpl(node.name.name, -1);
-        field.final2 = true;
-        field.static = isStatic;
-        field.synthetic = true;
-        _currentHolder.addField(field);
-      }
-      if (_matches(property, sc.Keyword.GET)) {
-        PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
-        getter.functions = holder.functions;
-        getter.labels = holder.labels;
-        getter.localVariables = holder.localVariables;
-        getter.variable = field;
-        getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
-        getter.getter = true;
-        getter.static = isStatic;
-        field.getter = getter;
-        _currentHolder.addAccessor(getter);
-        propertyNameNode.staticElement = getter;
+      bool isStatic = node.isStatic;
+      sc.Token property = node.propertyKeyword;
+      if (property == null) {
+        SimpleIdentifier methodName = node.name;
+        String nameOfMethod = methodName.name;
+        if (nameOfMethod == sc.TokenType.MINUS.lexeme && node.parameters.parameters.length == 0) {
+          nameOfMethod = "unary-";
+        }
+        MethodElementImpl element = new MethodElementImpl(nameOfMethod, methodName.offset);
+        element.abstract = node.isAbstract;
+        element.functions = holder.functions;
+        element.labels = holder.labels;
+        element.localVariables = holder.localVariables;
+        element.parameters = holder.parameters;
+        element.static = isStatic;
+        _currentHolder.addMethod(element);
+        methodName.staticElement = element;
       } else {
-        PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
-        setter.functions = holder.functions;
-        setter.labels = holder.labels;
-        setter.localVariables = holder.localVariables;
-        setter.parameters = holder.parameters;
-        setter.variable = field;
-        setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
-        setter.setter = true;
-        setter.static = isStatic;
-        field.setter = setter;
-        field.final2 = false;
-        _currentHolder.addAccessor(setter);
-        propertyNameNode.staticElement = setter;
+        SimpleIdentifier propertyNameNode = node.name;
+        String propertyName = propertyNameNode.name;
+        FieldElementImpl field = _currentHolder.getField(propertyName) as FieldElementImpl;
+        if (field == null) {
+          field = new FieldElementImpl(node.name.name, -1);
+          field.final2 = true;
+          field.static = isStatic;
+          field.synthetic = true;
+          _currentHolder.addField(field);
+        }
+        if (_matches(property, sc.Keyword.GET)) {
+          PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          getter.functions = holder.functions;
+          getter.labels = holder.labels;
+          getter.localVariables = holder.localVariables;
+          getter.variable = field;
+          getter.abstract = node.body is EmptyFunctionBody && node.externalKeyword == null;
+          getter.getter = true;
+          getter.static = isStatic;
+          field.getter = getter;
+          _currentHolder.addAccessor(getter);
+          propertyNameNode.staticElement = getter;
+        } else {
+          PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.forNode(propertyNameNode);
+          setter.functions = holder.functions;
+          setter.labels = holder.labels;
+          setter.localVariables = holder.localVariables;
+          setter.parameters = holder.parameters;
+          setter.variable = field;
+          setter.abstract = node.body is EmptyFunctionBody && !_matches(node.externalKeyword, sc.Keyword.EXTERNAL);
+          setter.setter = true;
+          setter.static = isStatic;
+          field.setter = setter;
+          field.final2 = false;
+          _currentHolder.addAccessor(setter);
+          propertyNameNode.staticElement = setter;
+        }
+      }
+      holder.validate();
+    } on JavaException catch (ex) {
+      if (node.name.staticElement == null) {
+        ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
+        JavaStringBuilder builder = new JavaStringBuilder();
+        builder.append("The element for the method ");
+        builder.append(node.name);
+        builder.append(" in ");
+        builder.append(classNode.name);
+        builder.append(" was not set while trying to build the element model.");
+        AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException(builder.toString(), new CaughtException(ex, null)));
+      } else {
+        String message = "Exception caught in ElementBuilder.visitMethodDeclaration()";
+        AnalysisEngine.instance.logger.logError2(message, new AnalysisException(message, new CaughtException(ex, null)));
+      }
+    } finally {
+      if (node.name.staticElement == null) {
+        ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
+        JavaStringBuilder builder = new JavaStringBuilder();
+        builder.append("The element for the method ");
+        builder.append(node.name);
+        builder.append(" in ");
+        builder.append(classNode.name);
+        builder.append(" was not set while trying to resolve types.");
+        AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(builder.toString()), null));
       }
     }
-    holder.validate();
     return null;
   }
 
@@ -3892,7 +3953,7 @@
       SimpleIdentifier fieldName = node.name;
       FieldElementImpl field;
       if (isConst && hasInitializer) {
-        field = new ConstFieldElementImpl(fieldName);
+        field = new ConstFieldElementImpl.con1(fieldName);
       } else {
         field = new FieldElementImpl.forNode(fieldName);
       }
@@ -4108,6 +4169,8 @@
 
   List<ConstructorElement> _constructors;
 
+  List<ClassElement> _enums;
+
   List<FieldElement> _fields;
 
   List<FunctionElement> _functions;
@@ -4142,6 +4205,13 @@
     _constructors.add(element);
   }
 
+  void addEnum(ClassElement element) {
+    if (_enums == null) {
+      _enums = new List<ClassElement>();
+    }
+    _enums.add(element);
+  }
+
   void addField(FieldElement element) {
     if (_fields == null) {
       _fields = new List<FieldElement>();
@@ -4230,6 +4300,15 @@
     return result;
   }
 
+  List<ClassElement> get enums {
+    if (_enums == null) {
+      return ClassElementImpl.EMPTY_ARRAY;
+    }
+    List<ClassElement> result = new List.from(_enums);
+    _enums = null;
+    return result;
+  }
+
   FieldElement getField(String fieldName) {
     if (_fields == null) {
       return null;
@@ -4493,12 +4572,11 @@
  */
 class ElementResolver extends SimpleAstVisitor<Object> {
   /**
-   * Checks if the given expression is the reference to the type, if it is then the
+   * Checks whether the given expression is a reference to a class. If it is then the
    * [ClassElement] is returned, otherwise `null` is returned.
    *
    * @param expression the expression to evaluate
-   * @return the [ClassElement] if the given expression is the reference to the type, and
-   *         `null` otherwise
+   * @return the element representing the class
    */
   static ClassElementImpl getTypeReference(Expression expression) {
     if (expression is Identifier) {
@@ -6507,8 +6585,17 @@
         names = (combinator as ShowCombinator).shownNames;
       }
       for (SimpleIdentifier name in names) {
-        Element element = namespace.get(name.name);
+        String nameStr = name.name;
+        Element element = namespace.get(nameStr);
+        if (element == null) {
+          element = namespace.get("${nameStr}=");
+        }
         if (element != null) {
+          // Ensure that the name always resolves to a top-level variable
+          // rather than a getter or setter
+          if (element is PropertyAccessorElement) {
+            element = (element as PropertyAccessorElement).variable;
+          }
           name.staticElement = element;
         }
       }
@@ -6524,8 +6611,7 @@
    */
   Element _resolveElement(ClassElementImpl classElement, SimpleIdentifier nameNode) {
     String name = nameNode.name;
-    Element element = null;
-    element = classElement.getMethod(name);
+    Element element = classElement.getMethod(name);
     if (element == null && nameNode.inSetterContext()) {
       element = classElement.getSetter(name);
     }
@@ -6651,6 +6737,7 @@
     //
     ClassElementImpl typeReference = getTypeReference(target);
     if (typeReference != null) {
+      // TODO(brianwilkerson) Why are we setting the propagated element here? It looks wrong.
       staticElement = propagatedElement = _resolveElement(typeReference, propertyName);
     } else {
       staticElement = _resolveProperty(target, staticType, propertyName);
@@ -6983,6 +7070,81 @@
 }
 
 /**
+ * Instances of the class `EnumMemberBuilder` build the members in enum declarations.
+ */
+class EnumMemberBuilder extends RecursiveAstVisitor<Object> {
+  /**
+   * The type provider used to access the types needed to build an element model for enum
+   * declarations.
+   */
+  final TypeProvider _typeProvider;
+
+  /**
+   * Initialize a newly created enum member builder.
+   *
+   * @param typeProvider the type provider used to access the types needed to build an element model
+   *          for enum declarations
+   */
+  EnumMemberBuilder(this._typeProvider);
+
+  @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    //
+    // Finish building the enum.
+    //
+    ClassElementImpl enumElement = node.name.staticElement as ClassElementImpl;
+    InterfaceType enumType = enumElement.type;
+    enumElement.supertype = _typeProvider.objectType;
+    //
+    // Populate the fields.
+    //
+    List<FieldElement> fields = new List<FieldElement>();
+    InterfaceType intType = _typeProvider.intType;
+    InterfaceType stringType = _typeProvider.stringType;
+    String indexFieldName = "index";
+    FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
+    indexField.final2 = true;
+    indexField.type = intType;
+    fields.add(indexField);
+    String nameFieldName = "_name";
+    FieldElementImpl nameField = new FieldElementImpl(nameFieldName, -1);
+    nameField.final2 = true;
+    nameField.type = stringType;
+    fields.add(nameField);
+    FieldElementImpl valuesField = new FieldElementImpl("values", -1);
+    valuesField.static = true;
+    valuesField.const3 = true;
+    valuesField.type = _typeProvider.listType.substitute4(<DartType> [enumType]);
+    fields.add(valuesField);
+    //
+    // Build the enum constants.
+    //
+    NodeList<EnumConstantDeclaration> constants = node.constants;
+    int constantCount = constants.length;
+    for (int i = 0; i < constantCount; i++) {
+      SimpleIdentifier constantName = constants[i].name;
+      FieldElementImpl constantElement = new ConstFieldElementImpl.con1(constantName);
+      constantElement.static = true;
+      constantElement.const3 = true;
+      constantElement.type = enumType;
+      HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
+      fieldMap[indexFieldName] = new DartObjectImpl(intType, new IntState(i));
+      fieldMap[nameFieldName] = new DartObjectImpl(stringType, new StringState(constantName.name));
+      DartObjectImpl value = new DartObjectImpl(enumType, new GenericState(fieldMap));
+      constantElement.evaluationResult = new ValidResult(value);
+      fields.add(constantElement);
+      constantName.staticElement = constantElement;
+    }
+    //
+    // Finish building the enum.
+    //
+    enumElement.fields = new List.from(fields);
+    // Client code isn't allowed to invoke the constructor, so we do not model it.
+    return super.visitEnumDeclaration(node);
+  }
+}
+
+/**
  * Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
  * errors and warnings not covered by the parser and resolver.
  */
@@ -15442,13 +15604,14 @@
       // Build the element models representing the libraries being resolved. This is done in three
       // steps:
       //
-      // 1. Build the basic element models without making any connections between elements other than
-      //    the basic parent/child relationships. This includes building the elements representing the
-      //    libraries.
+      // 1. Build the basic element models without making any connections between elements other
+      //    than the basic parent/child relationships. This includes building the elements
+      //    representing the libraries, but excludes members defined in enums.
       // 2. Build the elements for the import and export directives. This requires that we have the
       //    elements built for the referenced libraries, but because of the possibility of circular
       //    references needs to happen after all of the library elements have been created.
-      // 3. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
+      // 3. Build the members in enum declarations.
+      // 4. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
       //    requires that we be able to compute the names visible in the libraries being resolved,
       //    which in turn requires that we have resolved the import directives.
       //
@@ -15461,6 +15624,7 @@
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
       _typeProvider = new TypeProviderImpl(coreElement);
+      _buildEnumMembers();
       _buildTypeHierarchies();
       instrumentation.metric3("buildTypeHierarchies", "complete");
       //
@@ -15701,6 +15865,27 @@
   }
 
   /**
+   * Build the members in enum declarations. This cannot be done while building the rest of the
+   * element model because it depends on being able to access core types, which cannot happen until
+   * the rest of the element model has been built (when resolving the core library).
+   *
+   * @throws AnalysisException if any of the enum members could not be built
+   */
+  void _buildEnumMembers() {
+    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
+    try {
+      for (Library library in _librariesInCycles) {
+        for (Source source in library.compilationUnitSources) {
+          EnumMemberBuilder builder = new EnumMemberBuilder(_typeProvider);
+          library.getAST(source).accept(builder);
+        }
+      }
+    } finally {
+      timeCounter.stop();
+    }
+  }
+
+  /**
    * Resolve the type hierarchy across all of the types declared in the libraries in the current
    * cycle.
    *
@@ -16102,13 +16287,14 @@
       // Build the element models representing the libraries being resolved. This is done in three
       // steps:
       //
-      // 1. Build the basic element models without making any connections between elements other than
-      //    the basic parent/child relationships. This includes building the elements representing the
-      //    libraries.
+      // 1. Build the basic element models without making any connections between elements other
+      //    than the basic parent/child relationships. This includes building the elements
+      //    representing the libraries, but excludes members defined in enums.
       // 2. Build the elements for the import and export directives. This requires that we have the
       //    elements built for the referenced libraries, but because of the possibility of circular
       //    references needs to happen after all of the library elements have been created.
-      // 3. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
+      // 3. Build the members in enum declarations.
+      // 4. Build the rest of the type model by connecting superclasses, mixins, and interfaces. This
       //    requires that we be able to compute the names visible in the libraries being resolved,
       //    which in turn requires that we have resolved the import directives.
       //
@@ -16121,6 +16307,7 @@
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
       _typeProvider = new TypeProviderImpl(coreElement);
+      _buildEnumMembers();
       _buildTypeHierarchies();
       instrumentation.metric3("buildTypeHierarchies", "complete");
       //
@@ -16292,6 +16479,27 @@
     }
   }
 
+  /**
+   * Build the members in enum declarations. This cannot be done while building the rest of the
+   * element model because it depends on being able to access core types, which cannot happen until
+   * the rest of the element model has been built (when resolving the core library).
+   *
+   * @throws AnalysisException if any of the enum members could not be built
+   */
+  void _buildEnumMembers() {
+    TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.resolve.start();
+    try {
+      for (ResolvableLibrary library in _librariesInCycle) {
+        for (Source source in library.compilationUnitSources) {
+          EnumMemberBuilder builder = new EnumMemberBuilder(_typeProvider);
+          library.getAST(source).accept(builder);
+        }
+      }
+    } finally {
+      timeCounter.stop();
+    }
+  }
+
   HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
     HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
     int libraryCount = _librariesInCycle.length;
@@ -16466,6 +16674,9 @@
     for (PropertyAccessorElement element in compilationUnit.accessors) {
       define(element);
     }
+    for (ClassElement element in compilationUnit.enums) {
+      define(element);
+    }
     for (FunctionElement element in compilationUnit.functions) {
       define(element);
     }
@@ -18006,12 +18217,16 @@
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
-    // Resolve the class metadata in the library scope.
+    //
+    // Resolve the metadata in the library scope.
+    //
     if (node.metadata != null) {
       node.metadata.accept(this);
     }
     _enclosingClassDeclaration = node;
+    //
     // Continue the class resolution.
+    //
     ClassElement outerType = _enclosingClass;
     try {
       _enclosingClass = node.element;
@@ -18202,6 +18417,20 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    //
+    // Resolve the metadata in the library scope.
+    //
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    //
+    // There is nothing else to do because everything else was resolved by the element builder.
+    //
+    return null;
+  }
+
+  @override
   Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
     safelyVisit(_commentBeforeFunction);
     _overrideManager.enterScope();
@@ -22840,6 +23069,23 @@
   Object visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
+    if (element == null) {
+      ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
+      ClassElement classElement = classNode.element;
+      JavaStringBuilder builder = new JavaStringBuilder();
+      builder.append("The element for the method ");
+      builder.append(node.name);
+      builder.append(" in ");
+      builder.append(classNode.name);
+      builder.append(" in ");
+      if (classElement != null) {
+        builder.append(classElement.source.fullName);
+      } else {
+        builder.append("<element from class also not resolved>");
+      }
+      builder.append(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException());
+    }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
     ClassElement definingClass = element.getAncestor((element) => element is ClassElement);
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
index 9751221..f0223de 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
@@ -131,6 +131,17 @@
 
   static EmptyStatement emptyStatement() => new EmptyStatement(TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
+  static EnumDeclaration enumDeclaration(SimpleIdentifier name, List<EnumConstantDeclaration> constants) => new EnumDeclaration(null, null, TokenFactory.tokenFromKeyword(Keyword.ENUM), name, TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(constants), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
+  static EnumDeclaration enumDeclaration2(String name, List<String> constantNames) {
+    int count = constantNames.length;
+    List<EnumConstantDeclaration> constants = new List<EnumConstantDeclaration>(count);
+    for (int i = 0; i < count; i++) {
+      constants[i] = new EnumConstantDeclaration(null, null, identifier3(constantNames[i]));
+    }
+    return enumDeclaration(identifier3(name), constants);
+  }
+
   static ExportDirective exportDirective(List<Annotation> metadata, String uri, List<Combinator> combinators) => new ExportDirective(null, metadata, TokenFactory.tokenFromKeyword(Keyword.EXPORT), string2(uri), list(combinators), TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static ExportDirective exportDirective2(String uri, List<Combinator> combinators) => exportDirective(new List<Annotation>(), uri, combinators);
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 3f26fba..083ca30 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -7,12 +7,15 @@
 
 library engine.testing.element_factory;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
 
 /**
  * The class `ElementFactory` defines utility methods used to create elements for testing
@@ -76,6 +79,60 @@
 
   static ConstructorElementImpl constructorElement2(ClassElement definingClass, String name, List<DartType> argumentTypes) => constructorElement(definingClass, name, false, argumentTypes);
 
+  static ClassElementImpl enumElement(TypeProvider typeProvider, String enumName, List<String> constantNames) {
+    //
+    // Build the enum.
+    //
+    ClassElementImpl enumElement = new ClassElementImpl(enumName, -1);
+    InterfaceTypeImpl enumType = new InterfaceTypeImpl.con1(enumElement);
+    enumElement.type = enumType;
+    enumElement.supertype = objectType;
+    //
+    // Populate the fields.
+    //
+    List<FieldElement> fields = new List<FieldElement>();
+    InterfaceType intType = typeProvider.intType;
+    InterfaceType stringType = typeProvider.stringType;
+    String indexFieldName = "index";
+    FieldElementImpl indexField = new FieldElementImpl(indexFieldName, -1);
+    indexField.final2 = true;
+    indexField.type = intType;
+    fields.add(indexField);
+    String nameFieldName = "_name";
+    FieldElementImpl nameField = new FieldElementImpl(nameFieldName, -1);
+    nameField.final2 = true;
+    nameField.type = stringType;
+    fields.add(nameField);
+    FieldElementImpl valuesField = new FieldElementImpl("values", -1);
+    valuesField.static = true;
+    valuesField.const3 = true;
+    valuesField.type = typeProvider.listType.substitute4(<DartType> [enumType]);
+    fields.add(valuesField);
+    //
+    // Build the enum constants.
+    //
+    int constantCount = constantNames.length;
+    for (int i = 0; i < constantCount; i++) {
+      String constantName = constantNames[i];
+      FieldElementImpl constantElement = new ConstFieldElementImpl.con2(constantName, -1);
+      constantElement.static = true;
+      constantElement.const3 = true;
+      constantElement.type = enumType;
+      HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
+      fieldMap[indexFieldName] = new DartObjectImpl(intType, new IntState(i));
+      fieldMap[nameFieldName] = new DartObjectImpl(stringType, new StringState(constantName));
+      DartObjectImpl value = new DartObjectImpl(enumType, new GenericState(fieldMap));
+      constantElement.evaluationResult = new ValidResult(value);
+      fields.add(constantElement);
+    }
+    //
+    // Finish building the enum.
+    //
+    enumElement.fields = new List.from(fields);
+    // Client code isn't allowed to invoke the constructor, so we do not model it.
+    return enumElement;
+  }
+
   static ExportElementImpl exportFor(LibraryElement exportedLibrary, List<NamespaceCombinator> combinators) {
     ExportElementImpl spec = new ExportElementImpl();
     spec.exportedLibrary = exportedLibrary;
@@ -349,11 +406,7 @@
 
   static TopLevelVariableElementImpl topLevelVariableElement(Identifier name) => new TopLevelVariableElementImpl.forNode(name);
 
-  static TopLevelVariableElementImpl topLevelVariableElement2(String name) {
-    TopLevelVariableElementImpl element = new TopLevelVariableElementImpl(name, -1);
-    element.synthetic = true;
-    return element;
-  }
+  static TopLevelVariableElementImpl topLevelVariableElement2(String name) => topLevelVariableElement3(name, false, false, null);
 
   static TopLevelVariableElementImpl topLevelVariableElement3(String name, bool isConst, bool isFinal, DartType type) {
     TopLevelVariableElementImpl variable = new TopLevelVariableElementImpl(name, -1);
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 4b0c7e9..192b1d1 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -1848,4 +1848,14 @@
   }
 
   String toString() => writer.toString();
+
+  @override
+  visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+    // TODO: implement visitEnumConstantDeclaration
+  }
+
+  @override
+  visitEnumDeclaration(EnumDeclaration node) {
+    // TODO: implement visitEnumDeclaration
+  }
 }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 386d415..e2bef86 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,12 +1,12 @@
 name: analyzer
-version: 0.21.1
+version: 0.22.0-dev
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
 dependencies:
-  args: '>=0.10.0 <0.12.0'
+  args: '>=0.10.0 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   watcher: '>=0.9.0 <0.10.0'
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 68fe1cb..995324c 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -1982,6 +1982,14 @@
     _assertSource(";", AstFactory.emptyStatement());
   }
 
+  void test_visitEnumDeclaration_multiple() {
+    _assertSource("enum E {ONE, TWO}", AstFactory.enumDeclaration2("E", ["ONE", "TWO"]));
+  }
+
+  void test_visitEnumDeclaration_single() {
+    _assertSource("enum E {ONE}", AstFactory.enumDeclaration2("E", ["ONE"]));
+  }
+
   void test_visitExportDirective_combinator() {
     _assertSource("export 'a.dart' show A;", AstFactory.exportDirective2("a.dart", [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
   }
@@ -3186,6 +3194,14 @@
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitEmptyStatement);
       });
+      _ut.test('test_visitEnumDeclaration_multiple', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitEnumDeclaration_multiple);
+      });
+      _ut.test('test_visitEnumDeclaration_single', () {
+        final __test = new ToSourceVisitorTest();
+        runJUnitTest(__test, __test.test_visitEnumDeclaration_single);
+      });
       _ut.test('test_visitExportDirective_combinator', () {
         final __test = new ToSourceVisitorTest();
         runJUnitTest(__test, __test.test_visitExportDirective_combinator);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index a4a8204..288eb14 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -1015,6 +1015,63 @@
   }
 }
 
+class CompilationUnitElementImplTest extends EngineTestCase {
+  void test_getEnum_declared() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    CompilationUnitElementImpl unit = ElementFactory.compilationUnit("/lib.dart");
+    String enumName = "E";
+    ClassElement enumElement = ElementFactory.enumElement(typeProvider, enumName, []);
+    unit.enums = <ClassElement> [enumElement];
+    JUnitTestCase.assertSame(enumElement, unit.getEnum(enumName));
+  }
+
+  void test_getEnum_undeclared() {
+    TestTypeProvider typeProvider = new TestTypeProvider();
+    CompilationUnitElementImpl unit = ElementFactory.compilationUnit("/lib.dart");
+    String enumName = "E";
+    ClassElement enumElement = ElementFactory.enumElement(typeProvider, enumName, []);
+    unit.enums = <ClassElement> [enumElement];
+    JUnitTestCase.assertNull(unit.getEnum("${enumName}x"));
+  }
+
+  void test_getType_declared() {
+    CompilationUnitElementImpl unit = ElementFactory.compilationUnit("/lib.dart");
+    String className = "C";
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    unit.types = <ClassElement> [classElement];
+    JUnitTestCase.assertSame(classElement, unit.getType(className));
+  }
+
+  void test_getType_undeclared() {
+    CompilationUnitElementImpl unit = ElementFactory.compilationUnit("/lib.dart");
+    String className = "C";
+    ClassElement classElement = ElementFactory.classElement2(className, []);
+    unit.types = <ClassElement> [classElement];
+    JUnitTestCase.assertNull(unit.getType("${className}x"));
+  }
+
+  static dartSuite() {
+    _ut.group('CompilationUnitElementImplTest', () {
+      _ut.test('test_getEnum_declared', () {
+        final __test = new CompilationUnitElementImplTest();
+        runJUnitTest(__test, __test.test_getEnum_declared);
+      });
+      _ut.test('test_getEnum_undeclared', () {
+        final __test = new CompilationUnitElementImplTest();
+        runJUnitTest(__test, __test.test_getEnum_undeclared);
+      });
+      _ut.test('test_getType_declared', () {
+        final __test = new CompilationUnitElementImplTest();
+        runJUnitTest(__test, __test.test_getType_declared);
+      });
+      _ut.test('test_getType_undeclared', () {
+        final __test = new CompilationUnitElementImplTest();
+        runJUnitTest(__test, __test.test_getType_undeclared);
+      });
+    });
+  }
+}
+
 class ElementImplTest extends EngineTestCase {
   void test_equals() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
@@ -4425,6 +4482,7 @@
   TypeParameterTypeImplTest.dartSuite();
   VoidTypeImplTest.dartSuite();
   ClassElementImplTest.dartSuite();
+  CompilationUnitElementImplTest.dartSuite();
   ElementLocationImplTest.dartSuite();
   ElementImplTest.dartSuite();
   HtmlElementImplTest.dartSuite();
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 83e7eaf..1f593b5 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -679,6 +679,10 @@
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "abstract set m(v);", [ParserErrorCode.ABSTRACT_CLASS_MEMBER]);
   }
 
+  void test_abstractEnum() {
+    ParserTestCase.parseCompilationUnit("abstract enum E {ONE}", [ParserErrorCode.ABSTRACT_ENUM]);
+  }
+
   void test_abstractTopLevelFunction_function() {
     ParserTestCase.parseCompilationUnit("abstract f(v) {}", [ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION]);
   }
@@ -767,6 +771,10 @@
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const C() {}", [ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY]);
   }
 
+  void test_constEnum() {
+    ParserTestCase.parseCompilationUnit("const enum E {ONE}", [ParserErrorCode.CONST_ENUM]);
+  }
+
   void test_constFactory() {
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "const factory C() {}", [ParserErrorCode.CONST_FACTORY]);
   }
@@ -873,6 +881,10 @@
     ParserTestCase.parse4("parseSwitchStatement", "switch (e) {l1: case 0: break; l1: case 1: break;}", [ParserErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT]);
   }
 
+  void test_emptyEnumBody() {
+    ParserTestCase.parse3("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {}", [ParserErrorCode.EMPTY_ENUM_BODY]);
+  }
+
   void test_equalityCannotBeEqualityOperand_eq_eq() {
     ParserTestCase.parseExpression("1 == 2 == 3", [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
   }
@@ -1004,6 +1016,10 @@
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external C.c() {}", [ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY]);
   }
 
+  void test_externalEnum() {
+    ParserTestCase.parseCompilationUnit("external enum E {ONE}", [ParserErrorCode.EXTERNAL_ENUM]);
+  }
+
   void test_externalField_const() {
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "external const A f;", [ParserErrorCode.EXTERNAL_FIELD]);
   }
@@ -1072,6 +1088,10 @@
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final C() {}", [ParserErrorCode.FINAL_CONSTRUCTOR]);
   }
 
+  void test_finalEnum() {
+    ParserTestCase.parseCompilationUnit("final enum E {ONE}", [ParserErrorCode.FINAL_ENUM]);
+  }
+
   void test_finalMethod() {
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "final int m() {}", [ParserErrorCode.FINAL_METHOD]);
   }
@@ -1274,6 +1294,10 @@
     ParserTestCase.parse3("parseFinalConstVarOrType", <Object> [false], "a;", [ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE]);
   }
 
+  void test_missingEnumBody() {
+    ParserTestCase.parse3("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E;", [ParserErrorCode.MISSING_ENUM_BODY]);
+  }
+
   void test_missingExpressionInThrow_withCascade() {
     ParserTestCase.parse4("parseThrowExpression", "throw;", [ParserErrorCode.MISSING_EXPRESSION_IN_THROW]);
   }
@@ -1328,6 +1352,10 @@
     ParserTestCase.parse4("parseFunctionDeclarationStatement", "A<T> () {}", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
+  void test_missingIdentifier_inEnum() {
+    ParserTestCase.parse3("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {, TWO}", [ParserErrorCode.MISSING_IDENTIFIER]);
+  }
+
   void test_missingIdentifier_inSymbol_afterPeriod() {
     ParserTestCase.parse4("parseSymbolLiteral", "#a.", [ParserErrorCode.MISSING_IDENTIFIER]);
   }
@@ -1638,6 +1666,10 @@
     ParserTestCase.parseCompilationUnit("var class C {}", [ParserErrorCode.VAR_CLASS]);
   }
 
+  void test_varEnum() {
+    ParserTestCase.parseCompilationUnit("var enum E {ONE}", [ParserErrorCode.VAR_ENUM]);
+  }
+
   void test_varReturnType() {
     ParserTestCase.parse3("parseClassMember", <Object> ["C"], "var m() {}", [ParserErrorCode.VAR_RETURN_TYPE]);
   }
@@ -1732,6 +1764,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_abstractClassMember_setter);
       });
+      _ut.test('test_abstractEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_abstractEnum);
+      });
       _ut.test('test_abstractTopLevelFunction_function', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_abstractTopLevelFunction_function);
@@ -1816,6 +1852,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_constConstructorWithBody);
       });
+      _ut.test('test_constEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_constEnum);
+      });
       _ut.test('test_constFactory', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_constFactory);
@@ -1920,6 +1960,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_duplicatedModifier_var);
       });
+      _ut.test('test_emptyEnumBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_emptyEnumBody);
+      });
       _ut.test('test_equalityCannotBeEqualityOperand_eq_eq', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_equalityCannotBeEqualityOperand_eq_eq);
@@ -2036,6 +2080,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_externalConstructorWithBody_named);
       });
+      _ut.test('test_externalEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_externalEnum);
+      });
       _ut.test('test_externalField_const', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_externalField_const);
@@ -2104,6 +2152,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_finalConstructor);
       });
+      _ut.test('test_finalEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_finalEnum);
+      });
       _ut.test('test_finalMethod', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_finalMethod);
@@ -2296,6 +2348,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingConstFinalVarOrType_topLevel);
       });
+      _ut.test('test_missingEnumBody', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingEnumBody);
+      });
       _ut.test('test_missingExpressionInThrow_withCascade', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingExpressionInThrow_withCascade);
@@ -2348,6 +2404,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingIdentifier_functionDeclaration_returnTypeWithoutName);
       });
+      _ut.test('test_missingIdentifier_inEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_missingIdentifier_inEnum);
+      });
       _ut.test('test_missingIdentifier_inSymbol_afterPeriod', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_missingIdentifier_inSymbol_afterPeriod);
@@ -2644,6 +2704,10 @@
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_varClass);
       });
+      _ut.test('test_varEnum', () {
+        final __test = new ErrorParserTest();
+        runJUnitTest(__test, __test.test_varEnum);
+      });
       _ut.test('test_varReturnType', () {
         final __test = new ErrorParserTest();
         runJUnitTest(__test, __test.test_varReturnType);
@@ -3235,7 +3299,9 @@
     listener.setLineInfo(new TestSource(), scanner.lineStarts);
     Token token = scanner.tokenize();
     Parser parser = new Parser(null, listener);
+    parser.parseAsync = true;
     parser.parseDeferredLibraries = true;
+    parser.parseEnum = true;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     JUnitTestCase.assertNotNull(unit);
     listener.assertErrorsWithCodes(errorCodes);
@@ -7080,6 +7146,36 @@
     JUnitTestCase.assertNotNull(statement.semicolon);
   }
 
+  void test_parseEnumDeclaration_one() {
+    EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE}");
+    JUnitTestCase.assertNull(declaration.documentationComment);
+    JUnitTestCase.assertNotNull(declaration.keyword);
+    JUnitTestCase.assertNotNull(declaration.leftBracket);
+    JUnitTestCase.assertNotNull(declaration.name);
+    EngineTestCase.assertSizeOfList(1, declaration.constants);
+    JUnitTestCase.assertNotNull(declaration.rightBracket);
+  }
+
+  void test_parseEnumDeclaration_trailingComma() {
+    EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE,}");
+    JUnitTestCase.assertNull(declaration.documentationComment);
+    JUnitTestCase.assertNotNull(declaration.keyword);
+    JUnitTestCase.assertNotNull(declaration.leftBracket);
+    JUnitTestCase.assertNotNull(declaration.name);
+    EngineTestCase.assertSizeOfList(1, declaration.constants);
+    JUnitTestCase.assertNotNull(declaration.rightBracket);
+  }
+
+  void test_parseEnumDeclaration_two() {
+    EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE, TWO}");
+    JUnitTestCase.assertNull(declaration.documentationComment);
+    JUnitTestCase.assertNotNull(declaration.keyword);
+    JUnitTestCase.assertNotNull(declaration.leftBracket);
+    JUnitTestCase.assertNotNull(declaration.name);
+    EngineTestCase.assertSizeOfList(2, declaration.constants);
+    JUnitTestCase.assertNotNull(declaration.rightBracket);
+  }
+
   void test_parseEqualityExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseEqualityExpression", "x == y", []);
     JUnitTestCase.assertNotNull(expression.leftOperand);
@@ -10884,6 +10980,18 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseEmptyStatement);
       });
+      _ut.test('test_parseEnumDeclaration_one', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseEnumDeclaration_one);
+      });
+      _ut.test('test_parseEnumDeclaration_trailingComma', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseEnumDeclaration_trailingComma);
+      });
+      _ut.test('test_parseEnumDeclaration_two', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseEnumDeclaration_two);
+      });
       _ut.test('test_parseEqualityExpression_normal', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseEqualityExpression_normal);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index a097820..d3a43b3 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -235,7 +235,7 @@
   @override
   void set analysisOptions(AnalysisOptions options) {
     AnalysisOptions currentOptions = analysisOptions;
-    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.enableDeferredLoading != options.enableDeferredLoading || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
+    bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.enableAsync != options.enableAsync || currentOptions.enableDeferredLoading != options.enableDeferredLoading || currentOptions.enableEnum != options.enableEnum || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
     if (needsRecompute) {
       JUnitTestCase.fail("Cannot set options that cause the sources to be reanalyzed in a test context");
     }
@@ -312,6 +312,17 @@
 }
 
 class CompileTimeErrorCodeTest extends ResolverTestCase {
+  void fail_accessPrivateEnumField() {
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "String name(E e) {",
+        "  return e._name;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD]);
+    verify([source]);
+  }
+
   void fail_compileTimeConstantRaisesException() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -330,6 +341,59 @@
     verify([source]);
   }
 
+  void fail_extendsEnum() {
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.EXTENDS_ENUM]);
+    verify([source]);
+  }
+
+  void fail_implementsEnum() {
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A implements E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_ENUM]);
+    verify([source]);
+  }
+
+  void fail_instantiateEnum_const() {
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "E e(String name) {",
+        "  const E(0, name);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
+  void fail_instantiateEnum_new() {
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE }",
+        "E e(String name) {",
+        "  new E(0, name);",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
+    verify([source]);
+  }
+
+  void fail_missingEnumConstantInSwitch() {
+    Source source = addSource(EngineTestCase.createSource([
+        "enum E { ONE, TWO, THREE, FOUR }",
+        "bool odd(E e) {",
+        "  switch (e) {",
+        "    case ONE:",
+        "    case THREE: return true;",
+        "  }",
+        "  return false;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
+        CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH]);
+    verify([source]);
+  }
+
   void fail_mixinDeclaresConstructor() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -341,6 +405,13 @@
     verify([source]);
   }
 
+  void fail_mixinOfEnum() {
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A with E {}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_ENUM]);
+    verify([source]);
+  }
+
   void fail_mixinOfNonClass() {
     // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
     Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
@@ -3756,6 +3827,24 @@
     verify([source]);
   }
 
+  void test_symbol_constructor_badArgs() {
+    Source source = addSource(EngineTestCase.createSource([
+        "var s1 = const Symbol('3');",
+        "var s2 = const Symbol(3);",
+        "var s3 = const Symbol();",
+        "var s4 = const Symbol('x', 'y');",
+        "var s5 = const Symbol('x', foo: 'x');"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+        CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
+        CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,
+        CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
+    verify([source]);
+  }
+
   void test_typeAliasCannotReferenceItself_11987() {
     Source source = addSource(EngineTestCase.createSource([
         "typedef void F(List<G> l);",
@@ -5482,6 +5571,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_superInRedirectingConstructor_superRedirection);
       });
+      _ut.test('test_symbol_constructor_badArgs', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_symbol_constructor_badArgs);
+      });
       _ut.test('test_typeAliasCannotReferenceItself_11987', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_11987);
@@ -6004,6 +6097,24 @@
     _listener.assertNoErrors();
   }
 
+  void test_visitImportDirective_withCombinators() {
+    ShowCombinator combinator = AstFactory.showCombinator2(["A", "B", "C"]);
+    ImportDirective directive = AstFactory.importDirective3(null, null, [combinator]);
+    LibraryElementImpl library = ElementFactory.library(_definingLibrary.context, "lib");
+    TopLevelVariableElementImpl varA = ElementFactory.topLevelVariableElement2("A");
+    TopLevelVariableElementImpl varB = ElementFactory.topLevelVariableElement2("B");
+    TopLevelVariableElementImpl varC = ElementFactory.topLevelVariableElement2("C");
+    CompilationUnitElementImpl unit = library.definingCompilationUnit as CompilationUnitElementImpl;
+    unit.accessors = <PropertyAccessorElement> [varA.getter, varA.setter, varB.getter, varC.setter];
+    unit.topLevelVariables = <TopLevelVariableElement> [varA, varB, varC];
+    directive.element = ElementFactory.importFor(library, null, []);
+    _resolveNode(directive, []);
+    JUnitTestCase.assertSame(varA, combinator.shownNames[0].staticElement);
+    JUnitTestCase.assertSame(varB, combinator.shownNames[1].staticElement);
+    JUnitTestCase.assertSame(varC, combinator.shownNames[2].staticElement);
+    _listener.assertNoErrors();
+  }
+
   void test_visitIndexExpression_get() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType intType = _typeProvider.intType;
@@ -6551,6 +6662,10 @@
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitImportDirective_noCombinators_prefix);
       });
+      _ut.test('test_visitImportDirective_withCombinators', () {
+        final __test = new ElementResolverTest();
+        runJUnitTest(__test, __test.test_visitImportDirective_withCombinators);
+      });
       _ut.test('test_visitIndexExpression_get', () {
         final __test = new ElementResolverTest();
         runJUnitTest(__test, __test.test_visitIndexExpression_get);
@@ -10217,6 +10332,13 @@
 }
 
 class NonErrorResolverTest extends ResolverTestCase {
+  void fail_undefinedEnumConstant() {
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "E e() {", "  return E.ONE;", "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_ambiguousExport() {
     Source source = addSource(EngineTestCase.createSource([
         "library L;",
@@ -20092,6 +20214,14 @@
     verify([source]);
   }
 
+  void fail_undefinedEnumConstant() {
+    // We need a way to set the parseEnum flag in the parser to true.
+    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "E e() {", "  return E.TWO;", "}"]));
+    resolve(source);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
+    verify([source]);
+  }
+
   void test_ambiguousImport_function() {
     Source source = addSource(EngineTestCase.createSource([
         "import 'lib1.dart';",
diff --git a/pkg/args/CHANGELOG.md b/pkg/args/CHANGELOG.md
index 5349ae2..36b8208 100644
--- a/pkg/args/CHANGELOG.md
+++ b/pkg/args/CHANGELOG.md
@@ -1,5 +1,13 @@
-## 0.11.1
+## 0.12.0
 
+* Removed public constructors for `ArgResults` and `Option`.
+ 
+* `ArgResults.wasParsed()` can be used to determine if an option was actually
+  parsed or the default value is being returned.
+
+* Replaced `isFlag` and `allowMultiple` fields in the `Option` class with a
+  three-value `OptionType` enum.
+  
 * Options may define `valueHelp` which will then be shown in the usage.
 
 ## 0.11.0
diff --git a/pkg/args/lib/args.dart b/pkg/args/lib/args.dart
index ec40958..562df44 100644
--- a/pkg/args/lib/args.dart
+++ b/pkg/args/lib/args.dart
@@ -4,176 +4,6 @@
 
 library args;
 
-import 'package:collection/wrappers.dart';
-
-import 'src/parser.dart';
-import 'src/usage.dart';
-import 'src/options.dart';
-export 'src/options.dart';
-
-/// A class for taking a list of raw command line arguments and parsing out
-/// options and flags from them.
-class ArgParser {
-  final Map<String, Option> _options;
-  final Map<String, ArgParser> _commands;
-
-  /// The options that have been defined for this parser.
-  final Map<String, Option> options;
-
-  /// The commands that have been defined for this parser.
-  final Map<String, ArgParser> commands;
-
-  /// Whether or not this parser parses options that appear after non-option
-  /// arguments.
-  final bool allowTrailingOptions;
-
-  /// Creates a new ArgParser.
-  ///
-  /// If [allowTrailingOptions] is set, the parser will continue parsing even
-  /// after it finds an argument that is neither an option nor a command.
-  /// This allows options to be specified after regular arguments. Defaults to
-  /// `false`.
-  factory ArgParser({bool allowTrailingOptions}) =>
-      new ArgParser._(<String, Option>{}, <String, ArgParser>{},
-          allowTrailingOptions: allowTrailingOptions);
-
-  ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
-      {bool allowTrailingOptions}) :
-    this._options = options,
-    this.options = new UnmodifiableMapView(options),
-    this._commands = commands,
-    this.commands = new UnmodifiableMapView(commands),
-    this.allowTrailingOptions = allowTrailingOptions != null ?
-        allowTrailingOptions : false;
-
-  /// Defines a command.
-  ///
-  /// A command is a named argument which may in turn define its own options and
-  /// subcommands using the given parser. If [parser] is omitted, implicitly
-  /// creates a new one. Returns the parser for the command.
-  ArgParser addCommand(String name, [ArgParser parser]) {
-    // Make sure the name isn't in use.
-    if (_commands.containsKey(name)) {
-      throw new ArgumentError('Duplicate command "$name".');
-    }
-
-    if (parser == null) parser = new ArgParser();
-    _commands[name] = parser;
-    return parser;
-  }
-
-  /// Defines a flag. Throws an [ArgumentError] if:
-  ///
-  /// * There is already an option named [name].
-  /// * There is already an option using abbreviation [abbr].
-  void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
-      bool negatable: true, void callback(bool value), bool hide: false}) {
-    _addOption(name, abbr, help, null, null, null, defaultsTo, callback,
-        isFlag: true, negatable: negatable, hide: hide);
-  }
-
-  /// Defines a value-taking option. Throws an [ArgumentError] if:
-  ///
-  /// * There is already an option with name [name].
-  /// * There is already an option using abbreviation [abbr].
-  void addOption(String name, {String abbr, String help, String valueHelp,
-      List<String> allowed, Map<String, String> allowedHelp, String defaultsTo,
-      void callback(value), bool allowMultiple: false, bool hide: false}) {
-    _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
-        callback, isFlag: false, allowMultiple: allowMultiple,
-        hide: hide);
-  }
-
-  void _addOption(String name, String abbr, String help, String valueHelp,
-      List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
-      void callback(value), {bool isFlag, bool negatable: false,
-      bool allowMultiple: false, bool hide: false}) {
-    // Make sure the name isn't in use.
-    if (_options.containsKey(name)) {
-      throw new ArgumentError('Duplicate option "$name".');
-    }
-
-    // Make sure the abbreviation isn't too long or in use.
-    if (abbr != null) {
-      var existing = findByAbbreviation(abbr);
-      if (existing != null) {
-        throw new ArgumentError(
-            'Abbreviation "$abbr" is already used by "${existing.name}".');
-      }
-    }
-
-    _options[name] = new Option(name, abbr, help, valueHelp, allowed,
-        allowedHelp, defaultsTo, callback, isFlag: isFlag, negatable: negatable,
-        allowMultiple: allowMultiple, hide: hide);
-  }
-
-  /// Parses [args], a list of command-line arguments, matches them against the
-  /// flags and options defined by this parser, and returns the result.
-  ArgResults parse(List<String> args) =>
-      new Parser(null, this, args.toList(), null, null).parse();
-
-  /// Generates a string displaying usage information for the defined options.
-  ///
-  /// This is basically the help text shown on the command line.
-  String getUsage() => new Usage(this).generate();
-
-  /// Get the default value for an option. Useful after parsing to test if the
-  /// user specified something other than the default.
-  getDefault(String option) {
-    if (!options.containsKey(option)) {
-      throw new ArgumentError('No option named $option');
-    }
-    return options[option].defaultValue;
-  }
-
-  /// Finds the option whose abbreviation is [abbr], or `null` if no option has
-  /// that abbreviation.
-  Option findByAbbreviation(String abbr) {
-    return options.values.firstWhere((option) => option.abbreviation == abbr,
-        orElse: () => null);
-  }
-}
-
-/// The results of parsing a series of command line arguments using
-/// [ArgParser.parse()].
-///
-/// Includes the parsed options and any remaining unparsed command line
-/// arguments.
-class ArgResults {
-  final Map<String, dynamic> _options;
-
-  /// If these are the results for parsing a command's options, this will be the
-  /// name of the command. For top-level results, this returns `null`.
-  final String name;
-
-  /// The command that was selected, or `null` if none was.
-  ///
-  /// This will contain the options that were selected for that command.
-  final ArgResults command;
-
-  /// The remaining command-line arguments that were not parsed as options or
-  /// flags.
-  ///
-  /// If `--` was used to separate the options from the remaining arguments,
-  /// it will not be included in this list unless parsing stopped before the
-  /// `--` was reached.
-  final List<String> rest;
-
-  /// Creates a new [ArgResults].
-  ArgResults(this._options, this.name, this.command, List<String> rest)
-    : this.rest = new UnmodifiableListView(rest);
-
-  /// Gets the parsed command-line option named [name].
-  operator [](String name) {
-    if (!_options.containsKey(name)) {
-      throw new ArgumentError(
-          'Could not find an option named "$name".');
-    }
-
-    return _options[name];
-  }
-
-  /// Get the names of the options as an [Iterable].
-  Iterable<String> get options => _options.keys;
-}
-
+export 'src/arg_parser.dart';
+export 'src/arg_results.dart' hide newArgResults;
+export 'src/option.dart' hide newOption;
diff --git a/pkg/args/lib/src/arg_parser.dart b/pkg/args/lib/src/arg_parser.dart
new file mode 100644
index 0000000..b1ee628
--- /dev/null
+++ b/pkg/args/lib/src/arg_parser.dart
@@ -0,0 +1,135 @@
+// Copyright (c) 2014, 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 args.src.arg_parser;
+
+import 'package:collection/wrappers.dart';
+
+import 'arg_results.dart';
+import 'option.dart';
+import 'parser.dart';
+import 'usage.dart';
+
+/// A class for taking a list of raw command line arguments and parsing out
+/// options and flags from them.
+class ArgParser {
+  final Map<String, Option> _options;
+  final Map<String, ArgParser> _commands;
+
+  /// The options that have been defined for this parser.
+  final Map<String, Option> options;
+
+  /// The commands that have been defined for this parser.
+  final Map<String, ArgParser> commands;
+
+  /// Whether or not this parser parses options that appear after non-option
+  /// arguments.
+  final bool allowTrailingOptions;
+
+  /// Creates a new ArgParser.
+  ///
+  /// If [allowTrailingOptions] is set, the parser will continue parsing even
+  /// after it finds an argument that is neither an option nor a command.
+  /// This allows options to be specified after regular arguments. Defaults to
+  /// `false`.
+  factory ArgParser({bool allowTrailingOptions}) =>
+      new ArgParser._(<String, Option>{}, <String, ArgParser>{},
+          allowTrailingOptions: allowTrailingOptions);
+
+  ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
+      {bool allowTrailingOptions}) :
+    this._options = options,
+    this.options = new UnmodifiableMapView(options),
+    this._commands = commands,
+    this.commands = new UnmodifiableMapView(commands),
+    this.allowTrailingOptions = allowTrailingOptions != null ?
+        allowTrailingOptions : false;
+
+  /// Defines a command.
+  ///
+  /// A command is a named argument which may in turn define its own options and
+  /// subcommands using the given parser. If [parser] is omitted, implicitly
+  /// creates a new one. Returns the parser for the command.
+  ArgParser addCommand(String name, [ArgParser parser]) {
+    // Make sure the name isn't in use.
+    if (_commands.containsKey(name)) {
+      throw new ArgumentError('Duplicate command "$name".');
+    }
+
+    if (parser == null) parser = new ArgParser();
+    _commands[name] = parser;
+    return parser;
+  }
+
+  /// Defines a flag. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option named [name].
+  /// * There is already an option using abbreviation [abbr].
+  void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
+      bool negatable: true, void callback(bool value), bool hide: false}) {
+    _addOption(name, abbr, help, null, null, null, defaultsTo, callback,
+        OptionType.FLAG, negatable: negatable, hide: hide);
+  }
+
+  /// Defines a value-taking option. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option with name [name].
+  /// * There is already an option using abbreviation [abbr].
+  void addOption(String name, {String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, String defaultsTo,
+      void callback(value), bool allowMultiple: false, bool hide: false}) {
+    _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
+        callback, allowMultiple ? OptionType.MULTIPLE : OptionType.SINGLE,
+        hide: hide);
+  }
+
+  void _addOption(String name, String abbr, String help, String valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
+      void callback(value), OptionType type, {bool negatable: false,
+      bool hide: false}) {
+    // Make sure the name isn't in use.
+    if (_options.containsKey(name)) {
+      throw new ArgumentError('Duplicate option "$name".');
+    }
+
+    // Make sure the abbreviation isn't too long or in use.
+    if (abbr != null) {
+      var existing = findByAbbreviation(abbr);
+      if (existing != null) {
+        throw new ArgumentError(
+            'Abbreviation "$abbr" is already used by "${existing.name}".');
+      }
+    }
+
+    _options[name] = newOption(name, abbr, help, valueHelp, allowed,
+        allowedHelp, defaultsTo, callback, type, negatable: negatable,
+        hide: hide);
+  }
+
+  /// Parses [args], a list of command-line arguments, matches them against the
+  /// flags and options defined by this parser, and returns the result.
+  ArgResults parse(List<String> args) =>
+      new Parser(null, this, args.toList(), null, null).parse();
+
+  /// Generates a string displaying usage information for the defined options.
+  ///
+  /// This is basically the help text shown on the command line.
+  String getUsage() => new Usage(this).generate();
+
+  /// Get the default value for an option. Useful after parsing to test if the
+  /// user specified something other than the default.
+  getDefault(String option) {
+    if (!options.containsKey(option)) {
+      throw new ArgumentError('No option named $option');
+    }
+    return options[option].defaultValue;
+  }
+
+  /// Finds the option whose abbreviation is [abbr], or `null` if no option has
+  /// that abbreviation.
+  Option findByAbbreviation(String abbr) {
+    return options.values.firstWhere((option) => option.abbreviation == abbr,
+        orElse: () => null);
+  }
+}
diff --git a/pkg/args/lib/src/arg_results.dart b/pkg/args/lib/src/arg_results.dart
new file mode 100644
index 0000000..2e47a8e
--- /dev/null
+++ b/pkg/args/lib/src/arg_results.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2014, 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 args.src.arg_results;
+
+import 'package:collection/wrappers.dart';
+
+import 'arg_parser.dart';
+
+/// Creates a new [ArgResults].
+///
+/// Since [ArgResults] doesn't have a public constructor, this lets [Parser]
+/// get to it. This function isn't exported to the public API of the package.
+ArgResults newArgResults(ArgParser parser, Map<String, dynamic> parsed,
+      String name, ArgResults command, List<String> rest) {
+  return new ArgResults._(parser, parsed, name, command, rest);
+}
+
+/// The results of parsing a series of command line arguments using
+/// [ArgParser.parse()].
+///
+/// Includes the parsed options and any remaining unparsed command line
+/// arguments.
+class ArgResults {
+  /// The [ArgParser] whose options were parsed for these results.
+  final ArgParser _parser;
+
+  /// The option values that were parsed from arguments.
+  final Map<String, dynamic> _parsed;
+
+  /// If these are the results for parsing a command's options, this will be the
+  /// name of the command. For top-level results, this returns `null`.
+  final String name;
+
+  /// The command that was selected, or `null` if none was.
+  ///
+  /// This will contain the options that were selected for that command.
+  final ArgResults command;
+
+  /// The remaining command-line arguments that were not parsed as options or
+  /// flags.
+  ///
+  /// If `--` was used to separate the options from the remaining arguments,
+  /// it will not be included in this list unless parsing stopped before the
+  /// `--` was reached.
+  final List<String> rest;
+
+  /// Creates a new [ArgResults].
+  ArgResults._(this._parser, this._parsed, this.name, this.command,
+      List<String> rest)
+      : this.rest = new UnmodifiableListView(rest);
+
+  /// Gets the parsed command-line option named [name].
+  operator [](String name) {
+    if (!_parser.options.containsKey(name)) {
+      throw new ArgumentError('Could not find an option named "$name".');
+    }
+
+    return _parser.options[name].getOrDefault(_parsed[name]);
+  }
+
+  /// Get the names of the available options as an [Iterable].
+  ///
+  /// This includes the options whose values were parsed or that have defaults.
+  /// Options that weren't present and have no default will be omitted.
+  Iterable<String> get options {
+    var result = new Set.from(_parsed.keys);
+
+    // Include the options that have defaults.
+    _parser.options.forEach((name, option) {
+      if (option.defaultValue != null) result.add(name);
+    });
+
+    return result;
+  }
+
+  /// Returns `true` if the option with [name] was parsed from an actual
+  /// argument.
+  ///
+  /// Returns `false` if it wasn't provided and the default value or no default
+  /// value would be used instead.
+  bool wasParsed(String name) {
+    var option = _parser.options[name];
+    if (option == null) {
+      throw new ArgumentError('Could not find an option named "$name".');
+    }
+
+    return _parsed.containsKey(name);
+  }
+}
diff --git a/pkg/args/lib/src/option.dart b/pkg/args/lib/src/option.dart
new file mode 100644
index 0000000..6edc8ab
--- /dev/null
+++ b/pkg/args/lib/src/option.dart
@@ -0,0 +1,124 @@
+// Copyright (c) 2014, 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 args.src.option;
+
+import 'package:collection/wrappers.dart';
+
+/// Creates a new [Option].
+///
+/// Since [Option] doesn't have a public constructor, this lets [ArgParser]
+/// get to it. This function isn't exported to the public API of the package.
+Option newOption(String name, String abbreviation, String help,
+    String valueHelp, List<String> allowed, Map<String, String> allowedHelp,
+    defaultValue, Function callback, OptionType type,
+    {bool negatable, bool hide: false}) {
+  return new Option._(name, abbreviation, help, valueHelp, allowed, allowedHelp,
+      defaultValue, callback, type, negatable: negatable, hide: hide);
+}
+
+/// A command-line option. Includes both flags and options which take a value.
+class Option {
+  final String name;
+  final String abbreviation;
+  final List<String> allowed;
+  final defaultValue;
+  final Function callback;
+  final String help;
+  final String valueHelp;
+  final Map<String, String> allowedHelp;
+  final OptionType type;
+  final bool negatable;
+  final bool hide;
+
+  /// Whether the option is boolean-valued flag.
+  bool get isFlag => type == OptionType.FLAG;
+
+  /// Whether the option takes a single value.
+  bool get isSingle => type == OptionType.SINGLE;
+
+  /// Whether the option allows multiple values.
+  bool get isMultiple => type == OptionType.MULTIPLE;
+
+  Option._(this.name, this.abbreviation, this.help, this.valueHelp,
+      List<String> allowed, Map<String, String> allowedHelp, this.defaultValue,
+      this.callback, this.type, {this.negatable, this.hide: false}) :
+        this.allowed = allowed == null ?
+            null : new UnmodifiableListView(allowed),
+        this.allowedHelp = allowedHelp == null ?
+            null : new UnmodifiableMapView(allowedHelp) {
+
+    if (name.isEmpty) {
+      throw new ArgumentError('Name cannot be empty.');
+    } else if (name.startsWith('-')) {
+      throw new ArgumentError('Name $name cannot start with "-".');
+    }
+
+    // Ensure name does not contain any invalid characters.
+    if (_invalidChars.hasMatch(name)) {
+      throw new ArgumentError('Name "$name" contains invalid characters.');
+    }
+
+    if (abbreviation != null) {
+      if (abbreviation.length != 1) {
+        throw new ArgumentError('Abbreviation must be null or have length 1.');
+      } else if(abbreviation == '-') {
+        throw new ArgumentError('Abbreviation cannot be "-".');
+      }
+
+      if (_invalidChars.hasMatch(abbreviation)) {
+        throw new ArgumentError('Abbreviation is an invalid character.');
+      }
+    }
+  }
+
+  /// Returns [value] if non-`null`, otherwise returns the default value for
+  /// this option.
+  ///
+  /// For single-valued options, it will be [defaultValue] if set or `null`
+  /// otherwise. For multiple-valued options, it will be an empty list or a
+  /// list containing [defaultValue] if set.
+  dynamic getOrDefault(value) {
+    if (value != null) return value;
+
+    if (!isMultiple) return defaultValue;
+    if (defaultValue != null) return [defaultValue];
+    return [];
+  }
+
+  static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]''');
+}
+
+/// What kinds of values an option accepts.
+class OptionType {
+  /// An option that can only be `true` or `false`.
+  ///
+  /// The presence of the option name itself in the argument list means `true`.
+  static const FLAG = const OptionType._("OptionType.FLAG");
+
+  /// An option that takes a single value.
+  ///
+  /// Examples:
+  ///
+  ///     --mode debug
+  ///     -mdebug
+  ///     --mode=debug
+  ///
+  /// If the option is passed more than once, the last one wins.
+  static const SINGLE = const OptionType._("OptionType.SINGLE");
+
+  /// An option that allows multiple values.
+  ///
+  /// Example:
+  ///
+  ///     --output text --output xml
+  ///
+  /// In the parsed [ArgResults], a multiple-valued option will always return
+  /// a list, even if one or no values were passed.
+  static const MULTIPLE = const OptionType._("OptionType.MULTIPLE");
+
+  final String name;
+
+  const OptionType._(this.name);
+}
\ No newline at end of file
diff --git a/pkg/args/lib/src/options.dart b/pkg/args/lib/src/options.dart
deleted file mode 100644
index 34dc8d3..0000000
--- a/pkg/args/lib/src/options.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-library options;
-
-import 'package:collection/wrappers.dart';
-
-/// A command-line option. Includes both flags and options which take a value.
-class Option {
-  final String name;
-  final String abbreviation;
-  final List<String> allowed;
-  final defaultValue;
-  final Function callback;
-  final String help;
-  final String valueHelp;
-  final Map<String, String> allowedHelp;
-  final bool isFlag;
-  final bool negatable;
-  final bool allowMultiple;
-  final bool hide;
-
-  Option(this.name, this.abbreviation, this.help, this.valueHelp,
-      List<String> allowed, Map<String, String> allowedHelp, this.defaultValue,
-      this.callback, {this.isFlag, this.negatable, this.allowMultiple: false,
-      this.hide: false}) :
-        this.allowed = allowed == null ?
-            null : new UnmodifiableListView(allowed),
-        this.allowedHelp = allowedHelp == null ?
-            null : new UnmodifiableMapView(allowedHelp) {
-
-    if (name.isEmpty) {
-      throw new ArgumentError('Name cannot be empty.');
-    } else if (name.startsWith('-')) {
-      throw new ArgumentError('Name $name cannot start with "-".');
-    }
-
-    // Ensure name does not contain any invalid characters.
-    if (_invalidChars.hasMatch(name)) {
-      throw new ArgumentError('Name "$name" contains invalid characters.');
-    }
-
-    if (abbreviation != null) {
-      if (abbreviation.length != 1) {
-        throw new ArgumentError('Abbreviation must be null or have length 1.');
-      } else if(abbreviation == '-') {
-        throw new ArgumentError('Abbreviation cannot be "-".');
-      }
-
-      if (_invalidChars.hasMatch(abbreviation)) {
-        throw new ArgumentError('Abbreviation is an invalid character.');
-      }
-    }
-  }
-
-  static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]''');
-}
diff --git a/pkg/args/lib/src/parser.dart b/pkg/args/lib/src/parser.dart
index 3f2e79d..4d3417a 100644
--- a/pkg/args/lib/src/parser.dart
+++ b/pkg/args/lib/src/parser.dart
@@ -4,7 +4,9 @@
 
 library args.src.parser;
 
-import '../args.dart';
+import 'arg_parser.dart';
+import 'arg_results.dart';
+import 'option.dart';
 
 final _SOLO_OPT = new RegExp(r'^-([a-zA-Z0-9])$');
 final _ABBR_OPT = new RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
@@ -46,15 +48,6 @@
   ArgResults parse() {
     var commandResults = null;
 
-    // Initialize flags to their defaults.
-    grammar.options.forEach((name, option) {
-      if (option.allowMultiple) {
-        results[name] = [];
-      } else {
-        results[name] = option.defaultValue;
-      }
-    });
-
     // Parse the args.
     while (args.length > 0) {
       if (current == '--') {
@@ -89,21 +82,16 @@
       rest.add(args.removeAt(0));
     }
 
-    // Set unspecified multivalued arguments to their default value,
-    // if any, and invoke the callbacks.
+    // Invoke the callbacks.
     grammar.options.forEach((name, option) {
-      if (option.allowMultiple &&
-          results[name].length == 0 &&
-          option.defaultValue != null) {
-        results[name].add(option.defaultValue);
-      }
-      if (option.callback != null) option.callback(results[name]);
+      if (option.callback == null) return;
+      option.callback(option.getOrDefault(results[name]));
     });
 
     // Add in the leftover arguments we didn't parse to the innermost command.
     rest.addAll(args);
     args.clear();
-    return new ArgResults(results, commandName, commandResults, rest);
+    return newArgResults(grammar, results, commandName, commandResults, rest);
   }
 
   /// Pulls the value for [option] from the second argument in [args].
@@ -271,8 +259,9 @@
           '"$value" is not an allowed value for option "${option.name}".');
     }
 
-    if (option.allowMultiple) {
-      results[option.name].add(value);
+    if (option.isMultiple) {
+      var list = results.putIfAbsent(option.name, () => []);
+      list.add(value);
     } else {
       results[option.name] = value;
     }
diff --git a/pkg/args/pubspec.yaml b/pkg/args/pubspec.yaml
index c554816..32e84edc 100644
--- a/pkg/args/pubspec.yaml
+++ b/pkg/args/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.11.1-dev
+version: 0.12.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/args
diff --git a/pkg/args/test/args_test.dart b/pkg/args/test/args_test.dart
index 075a3e8..6792c95 100644
--- a/pkg/args/test/args_test.dart
+++ b/pkg/args/test/args_test.dart
@@ -189,6 +189,10 @@
         var parser = new ArgParser();
         parser.addFlag('woof');
         parser.addOption('meow');
+
+        parser.addOption('missing-option');
+        parser.addFlag('missing-flag', defaultsTo: null);
+
         var args = parser.parse(['--woof', '--meow', 'kitty']);
         expect(args.options, hasLength(2));
         expect(args.options, contains('woof'));
@@ -199,23 +203,77 @@
         var parser = new ArgParser();
         parser.addFlag('woof', defaultsTo: false);
         parser.addOption('meow', defaultsTo: 'kitty');
+
+        // Flags normally have a default value.
+        parser.addFlag('moo');
+
+        parser.addOption('missing-option');
+        parser.addFlag('missing-flag', defaultsTo: null);
+
         var args = parser.parse([]);
-        expect(args.options, hasLength(2));
+        expect(args.options, hasLength(3));
         expect(args.options, contains('woof'));
         expect(args.options, contains('meow'));
+        expect(args.options, contains('moo'));
       });
     });
 
     test('[] throws if the name is not an option', () {
-      var parser = new ArgParser();
-      var results = parser.parse([]);
+      var results = new ArgParser().parse([]);
       throwsIllegalArg(() => results['unknown']);
     });
 
     test('rest cannot be modified', () {
-      var results = new ArgResults({}, '', null, []);
+      var results = new ArgParser().parse([]);
       expect(() => results.rest.add('oops'), throwsUnsupportedError);
     });
+
+    group('.wasParsed()', () {
+      test('throws if the name is not an option', () {
+        var results = new ArgParser().parse([]);
+        throwsIllegalArg(() => results.wasParsed('unknown'));
+      });
+
+      test('returns true for parsed options', () {
+        var parser = new ArgParser();
+        parser.addFlag('fast');
+        parser.addFlag('verbose');
+        parser.addOption('mode');
+        parser.addOption('output');
+
+        var results = parser.parse(['--fast', '--mode=debug']);
+
+        expect(results.wasParsed('fast'), isTrue);
+        expect(results.wasParsed('verbose'), isFalse);
+        expect(results.wasParsed('mode'), isTrue);
+        expect(results.wasParsed('output'), isFalse);
+      });
+    });
+  });
+
+  group('Option', () {
+    test('.getOrDefault() returns a type-specific default value', () {
+      var parser = new ArgParser();
+      parser.addFlag('flag-no', defaultsTo: null);
+      parser.addFlag('flag-def', defaultsTo: true);
+      parser.addOption('single-no');
+      parser.addOption('single-def', defaultsTo: 'def');
+      parser.addOption('multi-no', allowMultiple: true);
+      parser.addOption('multi-def', allowMultiple: true, defaultsTo: 'def');
+
+      expect(parser.options['flag-no'].getOrDefault(null), equals(null));
+      expect(parser.options['flag-no'].getOrDefault(false), equals(false));
+      expect(parser.options['flag-def'].getOrDefault(null), equals(true));
+      expect(parser.options['flag-def'].getOrDefault(false), equals(false));
+      expect(parser.options['single-no'].getOrDefault(null), equals(null));
+      expect(parser.options['single-no'].getOrDefault('v'), equals('v'));
+      expect(parser.options['single-def'].getOrDefault(null), equals('def'));
+      expect(parser.options['single-def'].getOrDefault('v'), equals('v'));
+      expect(parser.options['multi-no'].getOrDefault(null), equals([]));
+      expect(parser.options['multi-no'].getOrDefault(['v']), equals(['v']));
+      expect(parser.options['multi-def'].getOrDefault(null), equals(['def']));
+      expect(parser.options['multi-def'].getOrDefault(['v']), equals(['v']));
+    });
   });
 }
 
@@ -232,7 +290,7 @@
 ];
 
 const _VALID_OPTIONS = const [
- 'a' // one char
+ 'a' // One character.
  'contains-dash',
  'contains_underscore',
  'ends-with-dash-',
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 4ed4931..b8b0ce7 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,10 +1,10 @@
 name: code_transformers
-version: 0.1.4+3
+version: 0.1.5
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: ">=0.15.6 <0.16.0"
+  analyzer: ">=0.15.6 <0.22.0"
   barback: ">=0.11.0 <0.15.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 09d60e4..e1d0afe 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  args: '>=0.9.0 <0.12.0'
+  args: '>=0.9.0 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
   source_maps: '>=0.9.1 <0.10.0'
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
index dd37a0a..9ff4057 100644
--- a/pkg/docgen/pubspec.yaml
+++ b/pkg/docgen/pubspec.yaml
@@ -3,7 +3,7 @@
 description: A documentation generator for the Dart repository.
 homepage: https://www.dartlang.org/
 dependencies:
-  args: '>=0.9.0 <0.12.0'
+  args: '>=0.9.0 <0.13.0'
   logging: '>=0.9.0 <0.10.0'
   markdown: 0.7.0
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index 6ac9d75..44e75ca 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -373,7 +373,12 @@
    */
   Map<int, DateTime> generateDates(int year, int leapDay) =>
       new Iterable.generate(365 + leapDay, (n) => n + 1)
-        .map((day) => new DateTime(year, 1, day)).toList().asMap();
+        .map((day) {
+          var result = new DateTime(year, 1, day);
+          // TODO(alanknight): This is a workaround for dartbug.com/15560.
+          if (result.toUtc() == result) result = new DateTime(year, 1, day);
+          return result;
+        }).toList().asMap();
 
   void verifyOrdinals(Map dates) {
     var f = new DateFormat("D");
diff --git a/pkg/json_rpc_2/test/server/parameters_test.dart b/pkg/json_rpc_2/test/server/parameters_test.dart
index 64fe232..3de0359 100644
--- a/pkg/json_rpc_2/test/server/parameters_test.dart
+++ b/pkg/json_rpc_2/test/server/parameters_test.dart
@@ -229,7 +229,8 @@
     test("[].asDateTime fails for invalid date/times", () {
       expect(() => parameters['string'].asDateTime,
           throwsInvalidParams('Parameter "string" for method "foo" must be a '
-              'valid date/time, but was "zap".'));
+              'valid date/time, but was "zap".\n'
+              'Invalid date format'));
     });
 
     test("[].asUri returns URI parameters", () {
@@ -262,9 +263,7 @@
       expect(() => parameters['invalid-uri'].asUri,
           throwsInvalidParams('Parameter "invalid-uri" for method "foo" must '
               'be a valid URI, but was "http://[::1".\n'
-              'Missing end `]` to match `[` in host at position 7.\n'
-              'http://[::1\n'
-              '       ^'));
+              'Missing end `]` to match `[` in host'));
     });
 
     group("with a nested parameter map", () {
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index 6fb7f61..dc2b5fe 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -35,5 +35,54 @@
         },
       ],
     },
+    {
+      'target_name': 'pub_packages',
+      'type': 'none',
+      'actions': [
+        {
+          'action_name': 'remove_html_imports',
+          'inputs': [
+            '../tools/remove_html_imports.py',
+            '<(SHARED_INTERMEDIATE_DIR)/http_files.stamp',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/remove_html_imports/http/lib/http.dart',
+          ],
+          'action': [
+            'python', '../tools/remove_html_imports.py',
+            'http/lib',
+            '<(SHARED_INTERMEDIATE_DIR)/remove_html_imports/http/lib',
+          ],
+        },
+        {
+          'action_name': 'make_pub_packages',
+          'inputs': [
+            '../tools/make_links.py',
+            '<!@(["python", "../tools/list_pkg_directories.py", '
+                '"--exclude=http", "."])',
+            '<!@(["python", "../tools/list_pkg_directories.py", '
+                '"third_party"])',
+            '<!@(["python", "../tools/list_pkg_directories.py", '
+                '"../third_party/pkg"])',
+            '<!@(["python", "../tools/list_pkg_directories.py", '
+                '"polymer/e2e_test/"])',
+            '../sdk/lib/_internal/compiler',
+            '../sdk/lib/_internal/libraries.dart',
+            '../site/try',
+            '<(SHARED_INTERMEDIATE_DIR)/remove_html_imports/http/lib/http.dart',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/pub_packages.stamp',
+          ],
+          'action': [
+            'python', '../tools/make_links.py',
+            '--timestamp_file=<(SHARED_INTERMEDIATE_DIR)/pub_packages.stamp',
+            '<(PRODUCT_DIR)/pub_packages',
+            '<@(_inputs)',
+            '<(SHARED_INTERMEDIATE_DIR)/remove_html_imports/http/lib',
+          ],
+        },
+      ],
+    }
   ],
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 798f43d..76bf1a2 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -92,6 +92,9 @@
 third_party/angular_tests/browser_test: Pass, Slow # Large dart2js compile time
 typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
+analysis_server/test/search/element_references_test: Pass, Slow
+analysis_services/test/index/store/codec_test: Pass, Slow
+
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 http/test/html/client_test: Fail # Issue 19750
 scheduled_test/test/scheduled_stream/scheduled_stream_test: Fail # Issue 19750
@@ -122,12 +125,16 @@
 analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 19756
 analysis_server/test/analysis_notification_outline_test: Pass, Slow # Issue 19756
 analysis_server/test/domain_search_test: Pass, Slow # Issue 19756
+analysis_server/test/search/element_reference_test: Pass, Slow # Issue 19756
+analysis_server/index/store/codec_test: Pass, Slow # Issue 19756
 
 [ $runtime == jsshell ]
 analysis_server/test/analysis_notification_occurrences_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_outline_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/analysis_notification_navigation_test: Pass, Slow # Issue 16473, 19756
 analysis_server/test/domain_analysis_test: Pass, Slow # Issue 16473, 19756
+analysis_server/test/analysis_notification_highlights_test: Pass, Slow # 16473, 19756
+analysis_server/test/search/top_level_declarations_test: Pass, Slow # 16473, 19756
 analyzer/test/generated/element_test: Pass, Slow # Issue 16473
 
 [ $runtime == d8 || $runtime == jsshell ]
@@ -216,6 +223,12 @@
 # Unexplained errors only occuring on Safari.
 typed_data/test/typed_buffers_test: RuntimeError
 
+[ $runtime == safari ]
+polymer/test/js_interop_test: Pass, RuntimeError # Issue 20075
+
+[ $runtime == safari || $ie ]
+polymer/test/two_way_bind_test: Pass, RuntimeError # Issue 20075
+
 # Skip browser-specific tests on VM
 [ $runtime == vm ]
 path/test/browser_test: Fail, OK # Uses dart:html
@@ -297,6 +310,7 @@
 shelf_web_socket/test/*: Fail, OK # Uses dart:io.
 smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
 smoke/test/codegen/recorder_test: Skip # Uses dart:io.
+stub_core_library/test/*: Fail, OK # Uses dart:io.
 third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
 third_party/angular_tests/vm_test: Skip # Uses dart:io
 watcher/test/*: Fail, OK # Uses dart:io.
diff --git a/pkg/pkg_files.gyp b/pkg/pkg_files.gyp
index 787e5dd..e091dcd 100644
--- a/pkg/pkg_files.gyp
+++ b/pkg/pkg_files.gyp
@@ -43,6 +43,26 @@
           ],
         },
       ],
-    }
+    },
+    {
+      'target_name': 'http_files_stamp',
+      'type': 'none',
+      'actions': [
+        {
+          'action_name': 'make_http_files_stamp',
+          'inputs': [
+            '../tools/create_timestamp_file.py',
+            '<!@(["python", "../tools/list_files.py", "\\.dart$", "http/lib"])',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/http_files.stamp',
+          ],
+          'action': [
+            'python', '../tools/create_timestamp_file.py',
+            '<@(_outputs)',
+          ],
+        },
+      ],
+    },
   ],
 }
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index 97cb4d3..1f97959 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,6 +4,11 @@
 package. We will also note important changes to the polyfill packages (observe,
 web_components, and template_binding) if they impact polymer.
 
+#### Pub version 0.12.0-dev
+ * Polymer Expressions had a breaking change so we also bumped the version on
+   this package.
+ * Fix for [17596](https://code.google.com/p/dart/issues/detail?id=17596)
+
 #### Pub version 0.11.1-dev
  * Use the latest template_binding with better NodeBind interop support (for
    two-way bindings with JS polymer elements).
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 3167f26..dc181c3 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -45,14 +45,16 @@
     seen.add(docId);
 
     Document document;
-    bool changed;
+    bool changed = false;
 
     return readPrimaryAsHtml(transform).then((doc) {
       document = doc;
+      changed = new _UrlNormalizer(transform, docId).visit(document) || changed;
+      
       experimentalBootstrap = document.querySelectorAll('link').any((link) =>
           link.attributes['rel'] == 'import' &&
           link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML);
-      changed = _extractScripts(document);
+      changed = _extractScripts(document) || changed;
       return _visitImports(document);
     }).then((importsFound) {
       changed = changed || importsFound;
@@ -160,7 +162,15 @@
   Future _inlineStylesheet(AssetId id, Element link) {
     return transform.readInputAsString(id).then((css) {
       css = new _UrlNormalizer(transform, id).visitCss(css);
-      link.replaceWith(new Element.tag('style')..text = css);
+      var styleElement = new Element.tag('style')..text = css;
+      // Copy over the extra attributes from the link tag to the style tag.
+      // This adds support for no-shim, shim-shadowdom, etc.
+      link.attributes.forEach((key, value) {
+        if (!IGNORED_LINKED_STYLE_ATTRS.contains(key)) {
+          styleElement.attributes[key] = value;
+        }
+      });
+      link.replaceWith(styleElement);
     });
   }
 
@@ -238,7 +248,11 @@
   var name = '${path.withoutExtension(id.path)}_'
       '${path.extension(id.path).substring(1)}';
   if (name.startsWith('lib/')) name = name.substring(4);
-  name = name.replaceAll('/', '.').replaceAll('-', '_');
+  name = name.split('/').map((part) {
+    part = part.replaceAll(INVALID_LIB_CHARS_REGEX, '_');
+    if (part.startsWith(NUM_REGEX)) part = '_${part}';
+    return part;
+  }).join(".");
   return '${id.package}.${name}_$suffix';
 }
 
@@ -286,7 +300,22 @@
   /// Counter used to ensure that every library name we inject is unique.
   int _count = 0;
 
-  _UrlNormalizer(this.transform, this.sourceId);
+  /// Path to the top level folder relative to the transform primaryInput.
+  /// This should just be some arbitrary # of ../'s.
+  final String topLevelPath;
+
+  /// Whether or not the normalizer has changed something in the tree.
+  bool changed = false;
+
+  _UrlNormalizer(transform, this.sourceId)
+      : transform = transform,
+        topLevelPath =
+          '../' * (transform.primaryInput.id.path.split('/').length - 2);
+
+  visit(Node node) {
+    super.visit(node);
+    return changed;
+  }
 
   visitElement(Element node) {
     // TODO(jakemac): Support custom elements that extend html elements which
@@ -297,20 +326,23 @@
         if (_urlAttributes.contains(name)) {
           if (value != '' && !value.trim().startsWith('{{')) {
             node.attributes[name] = _newUrl(value, node.sourceSpan);
+            changed = changed || value != node.attributes[name];
           }
         }
       });
     }
     if (node.localName == 'style') {
       node.text = visitCss(node.text);
+      changed = true;
     } else if (node.localName == 'script' &&
         node.attributes['type'] == TYPE_DART &&
         !node.attributes.containsKey('src')) {
       // TODO(jmesserly): we might need to visit JS too to handle ES Harmony
       // modules.
       node.text = visitInlineDart(node.text);
+      changed = true;
     }
-    super.visitElement(node);
+    return super.visitElement(node);
   }
 
   static final _URL = new RegExp(r'url\(([^)]*)\)', multiLine: true);
@@ -383,11 +415,11 @@
     var primaryId = transform.primaryInput.id;
 
     if (id.path.startsWith('lib/')) {
-      return 'packages/${id.package}/${id.path.substring(4)}';
+      return '${topLevelPath}packages/${id.package}/${id.path.substring(4)}';
     }
 
     if (id.path.startsWith('asset/')) {
-      return 'assets/${id.package}/${id.path.substring(6)}';
+      return '${topLevelPath}assets/${id.package}/${id.path.substring(6)}';
     }
 
     if (primaryId.package != id.package) {
@@ -422,4 +454,13 @@
                 //    video
 ];
 
+/// When inlining <link rel="stylesheet"> tags copy over all attributes to the
+/// style tag except these ones.
+const IGNORED_LINKED_STYLE_ATTRS =
+    const ['charset', 'href', 'href-lang', 'rel', 'rev'];
+
+/// Global RegExp objects for validating generated library names.
+final INVALID_LIB_CHARS_REGEX = new RegExp('[^a-z0-9_]');
+final NUM_REGEX = new RegExp('[0-9]');
+
 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index cfc1ede..726b488 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.11.1-dev
+version: 0.12.0-dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -8,7 +8,7 @@
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
   analyzer: '>=0.15.6 <0.16.0'
-  args: '>=0.10.0 <0.12.0'
+  args: '>=0.10.0 <0.13.0'
   barback: '>=0.9.0 <0.15.0'
   browser: '>=0.10.0 <0.11.0'
   code_transformers: '>=0.1.4 <0.2.0'
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 2e5437e..023bf4d 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -21,6 +21,7 @@
   group('rel=stylesheet', stylesheetTests);
   group('script type=dart', codeExtractorTests);
   group('url attributes', urlAttributeTests);
+  group('deep entrypoints', entryPointTests);
 }
 
 void importTests() {
@@ -158,6 +159,41 @@
       'a|web/second.js': '/*second*/'
     });
 
+  testPhases('Cleans library names generated from file paths.', phases,
+      {
+        'a|web/01_test.html':
+            '<!DOCTYPE html><html><head>'
+            '<script type="application/dart">/*1*/</script>'
+            '</head></html>',
+        'a|web/foo_02_test.html':
+            '<!DOCTYPE html><html><head>'
+            '<script type="application/dart">/*2*/</script>'
+            '</head></html>',
+        'a|web/test_03.html':
+            '<!DOCTYPE html><html><head>'
+            '<script type="application/dart">/*3*/</script>'
+            '</head></html>',
+        'a|web/*test_%foo_04!.html':
+            '<!DOCTYPE html><html><head>'
+            '<script type="application/dart">/*4*/</script>'
+            '</head></html>',
+        'a|web/%05_test.html':
+            '<!DOCTYPE html><html><head>'
+            '<script type="application/dart">/*5*/</script>'
+            '</head></html>',
+      }, {
+        'a|web/01_test.html.0.dart':
+            'library a.web._01_test_html_0;\n/*1*/',        // Appends an _ if it starts with a number.
+        'a|web/foo_02_test.html.0.dart':
+            'library a.web.foo_02_test_html_0;\n/*2*/',     // Allows numbers in the middle.
+        'a|web/test_03.html.0.dart':
+            'library a.web.test_03_html_0;\n/*3*/',         // Allows numbers at the end.
+        'a|web/*test_%foo_04!.html.0.dart':
+            'library a.web._test__foo_04__html_0;\n/*4*/',  // Replaces invalid characters with _.
+        'a|web/%05_test.html.0.dart':
+            'library a.web._05_test_html_0;\n/*5*/',        // Replace invalid character followed by number.
+      });
+
   testPhases('no transformation outside web/', phases,
     {
       'a|lib/test.html':
@@ -740,6 +776,28 @@
       'a|web/test2.css':
           'h1 { font-size: 70px; }',
     });
+
+  testPhases('inlined tags keep original attributes', phases, {
+       'a|web/test.html':
+           '<!DOCTYPE html><html><head>'
+           '<link rel="stylesheet" href="foo.css" no-shim>'
+           '<link rel="stylesheet" href="bar.css" shim-shadow foo>'
+           '</head></html>',
+       'a|web/foo.css':
+           'h1 { font-size: 70px; }',
+       'a|web/bar.css':
+           'h2 { font-size: 35px; }',
+     }, {
+       'a|web/test.html':
+           '<!DOCTYPE html><html><head></head><body>'
+           '<style no-shim="">h1 { font-size: 70px; }</style>'
+           '<style shim-shadow="" foo="">h2 { font-size: 35px; }</style>'
+           '</body></html>',
+       'a|web/foo.css':
+           'h1 { font-size: 70px; }',
+       'a|web/bar.css':
+           'h2 { font-size: 35px; }',
+     });
 }
 
 void urlAttributeTests() {
@@ -764,5 +822,54 @@
           '<script src="baz.jpg"></script>',
       'a|web/foo/test_2.html':
           '<foo-element src="baz.jpg"></foo-element>',
-    }); 
+    });
+}
+
+void entryPointTests() {
+  testPhases('one level deep entry points normalize correctly', phases, {
+      'a|web/test/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" href="../../packages/a/foo/foo.html">'
+          '</head></html>',
+      'a|lib/foo/foo.html':
+          '<script rel="import" href="../../../packages/b/bar/bar.js">'
+          '</script>',
+      'b|lib/bar/bar.js':
+          'console.log("here");',
+    }, {
+      'a|web/test/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script rel="import" href="../packages/b/bar/bar.js"></script>'
+          '</body></html>',
+    });
+
+  testPhases('includes in entry points normalize correctly', phases, {
+      'a|web/test/test.html':
+          '<!DOCTYPE html><html><head>'
+          '<script src="packages/a/foo/bar.js"></script>'
+          '</head></html>',
+      'a|lib/foo/bar.js':
+          'console.log("here");',
+    }, {
+      'a|web/test/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script src="../packages/a/foo/bar.js"></script>'
+          '</body></html>',
+    });
+
+  testPhases('two level deep entry points normalize correctly', phases, {
+    'a|web/test/well/test.html':
+        '<!DOCTYPE html><html><head>'
+        '<link rel="import" href="../../../packages/a/foo/foo.html">'
+        '</head></html>',
+    'a|lib/foo/foo.html':
+        '<script rel="import" href="../../../packages/b/bar/bar.js"></script>',
+    'b|lib/bar/bar.js':
+        'console.log("here");',
+  }, {
+    'a|web/test/well/test.html':
+        '<!DOCTYPE html><html><head></head><body>'
+        '<script rel="import" href="../../packages/b/bar/bar.js"></script>'
+        '</body></html>',
+  });
 }
\ No newline at end of file
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
index f40a16d..7767fc1 100644
--- a/pkg/source_maps/CHANGELOG.md
+++ b/pkg/source_maps/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.9.3
+
+* Support writing SingleMapping objects to source map version 3 format.
+* Support the `sourceRoot` field in the SingleMapping class.
+* Support updating the `targetUrl` field in the SingleMapping class.
+
 ## 0.9.2+2
 
 * Fix a bug in `FixedSpan.getLocationMessage`.
diff --git a/pkg/source_maps/lib/parser.dart b/pkg/source_maps/lib/parser.dart
index 23835a6..3fd0d14 100644
--- a/pkg/source_maps/lib/parser.dart
+++ b/pkg/source_maps/lib/parser.dart
@@ -16,6 +16,8 @@
 /// Parses a source map directly from a json string.
 // TODO(sigmund): evaluate whether other maps should have the json parsed, or
 // the string represenation.
+// TODO(tjblasi): Ignore the first line of [jsonMap] if the JSON safety string
+// `)]}'` begins the string representation of the map.
 Mapping parse(String jsonMap, {Map<String, Map> otherMaps}) =>
   parseJson(JSON.decode(jsonMap), otherMaps: otherMaps);
 
@@ -134,9 +136,6 @@
 
 /// A map containing direct source mappings.
 class SingleMapping extends Mapping {
-  /// Url of the target file.
-  final String targetUrl;
-
   /// Source urls used in the mapping, indexed by id.
   final List<String> urls;
 
@@ -146,7 +145,13 @@
   /// Entries indicating the beginning of each span.
   final List<TargetLineEntry> lines;
 
-  SingleMapping._internal(this.targetUrl, this.urls, this.names, this.lines);
+  /// Url of the target file.
+  String targetUrl;
+
+  /// Source root appended to the start of all entries in [urls].
+  String sourceRoot;
+
+  SingleMapping._(this.targetUrl, this.urls, this.names, this.lines);
 
   factory SingleMapping.fromEntries(
       Iterable<builder.Entry> entries, [String fileUrl]) {
@@ -186,15 +191,15 @@
             srcNameId));
       }
     }
-    return new SingleMapping._internal(
+    return new SingleMapping._(
         fileUrl, urls.keys.toList(), names.keys.toList(), lines);
   }
 
   SingleMapping.fromJson(Map map)
       : targetUrl = map['file'],
-        // TODO(sigmund): add support for 'sourceRoot'
         urls = map['sources'],
         names = map['names'],
+        sourceRoot = map['sourceRoot'],
         lines = <TargetLineEntry>[] {
     int line = 0;
     int column = 0;
@@ -303,7 +308,7 @@
 
     var result = {
       'version': 3,
-      'sourceRoot': '',
+      'sourceRoot': sourceRoot == null ? '' : sourceRoot,
       'sources': urls,
       'names' : names,
       'mappings' : buff.toString()
@@ -350,6 +355,9 @@
     var entry = _findColumn(line, column, _findLine(line));
     if (entry == null || entry.sourceUrlId == null) return null;
     var url = urls[entry.sourceUrlId];
+    if (sourceRoot != null) {
+      url = '${sourceRoot}${url}';
+    }
     if (files != null && files[url] != null) {
       var file = files[url];
       var start = file.getOffset(entry.sourceLine, entry.sourceColumn);
@@ -374,6 +382,8 @@
     return (new StringBuffer("$runtimeType : [")
         ..write('targetUrl: ')
         ..write(targetUrl)
+        ..write(', sourceRoot: ')
+        ..write(sourceRoot)
         ..write(', urls: ')
         ..write(urls)
         ..write(', names: ')
@@ -392,13 +402,16 @@
             ..write(': ')
             ..write(line)
             ..write(':')
-            ..write(entry.column)
-            ..write('   -->   ')
-            ..write(urls[entry.sourceUrlId])
-            ..write(': ')
-            ..write(entry.sourceLine)
-            ..write(':')
-            ..write(entry.sourceColumn);
+            ..write(entry.column);
+        if (entry.sourceUrlId != null) {
+          buff..write('   -->   ')
+              ..write(sourceRoot)
+              ..write(urls[entry.sourceUrlId])
+              ..write(': ')
+              ..write(entry.sourceLine)
+              ..write(':')
+              ..write(entry.sourceColumn);
+        }
         if (entry.sourceNameId != null) {
           buff..write(' (')
               ..write(names[entry.sourceNameId])
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
index 600506e..771e9e0 100644
--- a/pkg/source_maps/lib/span.dart
+++ b/pkg/source_maps/lib/span.dart
@@ -387,4 +387,7 @@
 class SpanFormatException extends SpanException implements FormatException {
   SpanFormatException(String message, Span span)
       : super(message, span);
+
+  get source => null;
+  int get position => null;
 }
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 9dee45f..ae0323d 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor version is upgraded, you *must* update that version constraint
 # in pub to stay in sync with this.
-version: 0.9.2+3
+version: 0.9.3
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
diff --git a/pkg/source_maps/test/parser_test.dart b/pkg/source_maps/test/parser_test.dart
index 8f1be3d..62cd08f 100644
--- a/pkg/source_maps/test/parser_test.dart
+++ b/pkg/source_maps/test/parser_test.dart
@@ -100,6 +100,20 @@
     expect(entry.sourceNameId, 0);
   });
 
+  test('parse with source root', () {
+    var inputMap = new Map.from(MAP_WITH_SOURCE_LOCATION);
+    inputMap['sourceRoot'] = '/pkg/';
+    var mapping = parseJson(inputMap);
+    expect(mapping.spanFor(0, 0).sourceUrl, "/pkg/input.dart");
+
+    var newSourceRoot = '/new/';
+
+    mapping.sourceRoot = newSourceRoot;
+    inputMap["sourceRoot"] = newSourceRoot;
+
+    expect(mapping.toJson(), equals(inputMap));
+  });
+
   test('parse and re-emit', () {
     for (var expected in [
         EXPECTED_MAP,
diff --git a/pkg/source_span/CHANGELOG.md b/pkg/source_span/CHANGELOG.md
new file mode 100644
index 0000000..04e4be2
--- /dev/null
+++ b/pkg/source_span/CHANGELOG.md
@@ -0,0 +1,33 @@
+# 1.0.0
+
+This package was extracted from the
+[`source_maps`](http://pub.dartlang.org/packages/source_maps) package, but the
+API has many differences. Among them:
+
+* `Span` has been renamed to `SourceSpan` and `Location` has been renamed to
+  `SourceLocation` to clarify their purpose and maintain consistency with the
+  package name. Likewise, `SpanException` is now `SourceSpanException` and
+  `SpanFormatException` is not `SourceSpanFormatException`.
+
+* `FixedSpan` and `FixedLocation` have been rolled into the `Span` and
+  `Location` classes, respectively.
+
+* `SourceFile` is more aggressive about validating its arguments. Out-of-bounds
+  lines, columns, and offsets will now throw errors rather than be silently
+  clamped.
+
+* `SourceSpan.sourceUrl`, `SourceLocation.sourceUrl`, and `SourceFile.url` now
+  return `Uri` objects rather than `String`s. The constructors allow either
+  `String`s or `Uri`s.
+
+* `Span.getLocationMessage` and `SourceFile.getLocationMessage` are now
+  `SourceSpan.message` and `SourceFile.message`, respectively. Rather than
+  taking both a `useColor` and a `color` parameter, they now take a single
+  `color` parameter that controls both whether and which color is used.
+
+* `Span.isIdentifier` has been removed. This property doesn't make sense outside
+  of a source map context.
+
+* `SourceFileSegment` has been removed. This class wasn't widely used and was
+  inconsistent in its choice of which parameters were considered relative and
+  which absolute.
diff --git a/pkg/source_span/LICENSE b/pkg/source_span/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/source_span/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/source_span/README.md b/pkg/source_span/README.md
new file mode 100644
index 0000000..4e2547e
--- /dev/null
+++ b/pkg/source_span/README.md
@@ -0,0 +1,15 @@
+`source_span` is a library for tracking locations in source code. It's designed
+to provide a standard representation for source code locations and spans so that
+disparate packages can easily pass them among one another, and to make it easy
+to generate human-friendly messages associated with a given piece of code.
+
+The most commonly-used class is the package's namesake, `SourceSpan`. It
+represents a span of characters in some source file, and is often attached to an
+object that has been parsed to indicate where it was parsed from. It provides
+access to the text of the span via `SourceSpan.text` and can be used to produce
+human-friendly messages using `SourceSpan.message()`.
+
+When parsing code from a file, `SourceFile` is useful. Not only does it provide
+an efficient means of computing line and column numbers, `SourceFile.span()`
+returns special `FileSpan`s that are able to provide more context for their
+error messages.
diff --git a/pkg/source_span/lib/source_span.dart b/pkg/source_span/lib/source_span.dart
new file mode 100644
index 0000000..e9646b1
--- /dev/null
+++ b/pkg/source_span/lib/source_span.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2014, 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 source_span;
+
+export "src/file.dart";
+export "src/location.dart";
+export "src/span.dart";
+export "src/span_exception.dart";
+export "src/span_mixin.dart";
diff --git a/pkg/source_span/lib/src/colors.dart b/pkg/source_span/lib/src/colors.dart
new file mode 100644
index 0000000..274fc92
--- /dev/null
+++ b/pkg/source_span/lib/src/colors.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2014, 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.
+
+// Color constants used for generating messages.
+library source_span.colors;
+
+const String RED = '\u001b[31m';
+
+const String YELLOW = '\u001b[33m';
+
+const String NONE = '\u001b[0m';
+
diff --git a/pkg/source_span/lib/src/file.dart b/pkg/source_span/lib/src/file.dart
new file mode 100644
index 0000000..0d2d6f6
--- /dev/null
+++ b/pkg/source_span/lib/src/file.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2014, 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 source_span.file;
+
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+import 'package:path/path.dart' as p;
+
+import 'colors.dart' as colors;
+import 'location.dart';
+import 'span.dart';
+import 'span_mixin.dart';
+import 'utils.dart';
+
+// Constants to determine end-of-lines.
+const int _LF = 10;
+const int _CR = 13;
+
+/// A class representing a source file.
+///
+/// This doesn't necessarily have to correspond to a file on disk, just a chunk
+/// of text usually with a URL associated with it.
+class SourceFile {
+  /// The URL where the source file is located.
+  ///
+  /// This may be null, indicating that the URL is unknown or unavailable.
+  final Uri url;
+
+  /// An array of offsets for each line beginning in the file.
+  ///
+  /// Each offset refers to the first character *after* the newline. If the
+  /// source file has a trailing newline, the final offset won't actually be in
+  /// the file.
+  final _lineStarts = <int>[0];
+
+  /// The code points of the characters in the file.
+  final Uint32List _decodedChars;
+
+  /// The length of the file in characters.
+  int get length => _decodedChars.length;
+
+  /// The number of lines in the file.
+  int get lines => _lineStarts.length;
+
+  /// Creates a new source file from [text].
+  ///
+  /// [url] may be either a [String], a [Uri], or `null`.
+  SourceFile(String text, {url})
+      : this.decoded(text.runes, url: url);
+
+  /// Creates a new source file from a list of decoded characters.
+  ///
+  /// [url] may be either a [String], a [Uri], or `null`.
+  SourceFile.decoded(Iterable<int> decodedChars, {url})
+      : url = url is String ? Uri.parse(url) : url,
+        _decodedChars = new Uint32List.fromList(decodedChars.toList()) {
+    for (var i = 0; i < _decodedChars.length; i++) {
+      var c = _decodedChars[i];
+      if (c == _CR) {
+        // Return not followed by newline is treated as a newline
+        var j = i + 1;
+        if (j >= _decodedChars.length || _decodedChars[j] != _LF) c = _LF;
+      }
+      if (c == _LF) _lineStarts.add(i + 1);
+    }
+  }
+
+  /// Returns a span in [this] from [start] to [end] (exclusive).
+  ///
+  /// If [end] isn't passed, it defaults to the end of the file.
+  FileSpan span(int start, [int end]) {
+    if (end == null) end = length - 1;
+    return new FileSpan._(this, location(start), location(end));
+  }
+
+  /// Returns a location in [this] at [offset].
+  FileLocation location(int offset) => new FileLocation._(this, offset);
+
+  /// Gets the 0-based line corresponding to [offset].
+  int getLine(int offset) {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (offset > length) {
+      throw new RangeError("Offset $offset must not be greater than the number "
+          "of characters in the file, $length.");
+    }
+    return binarySearch(_lineStarts, (o) => o > offset) - 1;
+  }
+
+  /// Gets the 0-based column corresponding to [offset].
+  ///
+  /// If [line] is passed, it's assumed to be the line containing [offset] and
+  /// is used to more efficiently compute the column.
+  int getColumn(int offset, {int line}) {
+    if (offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (offset > length) {
+      throw new RangeError("Offset $offset must be not be greater than the "
+          "number of characters in the file, $length.");
+    }
+
+    if (line == null) {
+      line = getLine(offset);
+    } else if (line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (line >= lines) {
+      throw new RangeError("Line $line must be less than the number of "
+          "lines in the file, $lines.");
+    }
+
+    var lineStart = _lineStarts[line];
+    if (lineStart > offset) {
+      throw new RangeError("Line $line comes after offset $offset.");
+    }
+
+    return offset - lineStart;
+  }
+
+  /// Gets the offset for a [line] and [column].
+  ///
+  /// [column] defaults to 0.
+  int getOffset(int line, [int column]) {
+    if (column == null) column = 0;
+
+    if (line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (line >= lines) {
+      throw new RangeError("Line $line must be less than the number of "
+          "lines in the file, $lines.");
+    } else if (column < 0) {
+      throw new RangeError("Column may not be negative, was $column.");
+    }
+
+    var result = _lineStarts[line] + column;
+    if (result > length ||
+        (line + 1 < lines && result >= _lineStarts[line + 1])) {
+      throw new RangeError("Line $line doesn't have $column columns.");
+    }
+
+    return result;
+  }
+
+  /// Returns the text of the file from [start] to [end] (exclusive).
+  ///
+  /// If [end] isn't passed, it defaults to the end of the file.
+  String getText(int start, [int end]) =>
+      new String.fromCharCodes(_decodedChars.sublist(start, end));
+}
+
+/// A [SourceLocation] within a [SourceFile].
+///
+/// Unlike the base [SourceLocation], [FileLocation] lazily computes its line
+/// and column values based on its offset and the contents of [file].
+///
+/// A [FileLocation] can be created using [SourceFile.location].
+class FileLocation extends SourceLocation {
+  /// The [file] that [this] belongs to.
+  final SourceFile file;
+
+  Uri get sourceUrl => file.url;
+  int get line => file.getLine(offset);
+  int get column => file.getColumn(offset);
+
+  FileLocation._(this.file, int offset)
+      : super(offset) {
+    if (offset > file.length) {
+      throw new RangeError("Offset $offset must not be greater than the number "
+          "of characters in the file, ${file.length}.");
+    }
+  }
+
+  FileSpan pointSpan() => new FileSpan._(file, this, this);
+}
+
+/// A [SourceSpan] within a [SourceFile].
+///
+/// Unlike the base [SourceSpan], [FileSpan] lazily computes its line and column
+/// values based on its offset and the contents of [file]. [FileSpan.message] is
+/// also able to provide more context then [SourceSpan.message], and
+/// [FileSpan.union] will return a [FileSpan] if possible.
+///
+/// A [FileSpan] can be created using [SourceFile.span].
+class FileSpan extends SourceSpanMixin {
+  /// The [file] that [this] belongs to.
+  final SourceFile file;
+
+  final FileLocation start;
+  final FileLocation end;
+
+  String get text => file.getText(start.offset, end.offset);
+
+  FileSpan._(this.file, this.start, this.end) {
+    if (end.offset < start.offset) {
+      throw new ArgumentError('End $end must come after start $start.');
+    }
+  }
+
+  SourceSpan union(SourceSpan other) {
+    if (other is! FileSpan) return super.union(other);
+
+    var span = expand(other);
+    var beginSpan = span.start == this.start ? this : other;
+    var endSpan = span.end == this.end ? this : other;
+
+    if (beginSpan.end.compareTo(endSpan.start) < 0) {
+      throw new ArgumentError("Spans $this and $other are disjoint.");
+    }
+
+    return span;
+  }
+
+  /// Returns a new span that covers both [this] and [other].
+  ///
+  /// Unlike [union], [other] may be disjoint from [this]. If it is, the text
+  /// between the two will be covered by the returned span.
+  FileSpan expand(FileSpan other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          " \"${other.sourceUrl}\" don't match.");
+    }
+
+    var start = min(this.start, other.start);
+    var end = max(this.end, other.end);
+    return new FileSpan._(file, start, end);    
+  }
+
+  String message(String message, {color}) {
+    if (color == true) color = colors.RED;
+    if (color == false) color = null;
+
+    var line = start.line;
+    var column = start.column;
+
+    var buffer = new StringBuffer();
+    buffer.write('line ${start.line + 1}, column ${start.column + 1}');
+    if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
+    buffer.write(': $message\n');
+
+    var textLine = file.getText(file.getOffset(line),
+        line == file.lines - 1 ? null : file.getOffset(line + 1));
+
+    column = math.min(column, textLine.length - 1);
+    var toColumn =
+        math.min(column + end.offset - start.offset, textLine.length);
+
+    if (color != null) {
+      buffer.write(textLine.substring(0, column));
+      buffer.write(color);
+      buffer.write(textLine.substring(column, toColumn));
+      buffer.write(colors.NONE);
+      buffer.write(textLine.substring(toColumn));
+    } else {
+      buffer.write(textLine);
+    }
+    if (!textLine.endsWith('\n')) buffer.write('\n');
+
+    buffer.write(' ' * column);
+    if (color != null) buffer.write(color);
+    buffer.write('^' * math.max(toColumn - column, 1));
+    if (color != null) buffer.write(colors.NONE);
+    return buffer.toString();
+  }
+}
diff --git a/pkg/source_span/lib/src/location.dart b/pkg/source_span/lib/src/location.dart
new file mode 100644
index 0000000..41f2518
--- /dev/null
+++ b/pkg/source_span/lib/src/location.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2014, 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 source_span.location;
+
+import 'span.dart';
+
+// A class that describes a single location within a source file.
+class SourceLocation implements Comparable<SourceLocation> {
+  /// URL of the source containing this location.
+  ///
+  /// This may be null, indicating that the source URL is unknown or
+  /// unavailable.
+  final Uri sourceUrl;
+
+  /// The 0-based offset of this location in the source.
+  final int offset;
+
+  /// The 0-based line of this location in the source.
+  final int line;
+
+  /// The 0-based column of this location in the source
+  final int column;
+
+  /// Returns a representation of this location in the `source:line:column`
+  /// format used by text editors.
+  ///
+  /// This prints 1-based lines and columns.
+  String get toolString {
+    var source = sourceUrl == null ? 'unknown source' : sourceUrl;
+    return '$source:${line + 1}:${column + 1}';
+  }
+
+  /// Creates a new location indicating [offset] within [sourceUrl].
+  ///
+  /// [line] and [column] default to assuming the source is a single line. This
+  /// means that [line] defaults to 0 and [column] defaults to [offset].
+  ///
+  /// [sourceUrl] may be either a [String], a [Uri], or `null`.
+  SourceLocation(int offset, {sourceUrl, int line, int column})
+      : sourceUrl = sourceUrl is String ? Uri.parse(sourceUrl) : sourceUrl,
+        offset = offset,
+        line = line == null ? 0 : line,
+        column = column == null ? offset : column {
+    if (this.offset < 0) {
+      throw new RangeError("Offset may not be negative, was $offset.");
+    } else if (this.line < 0) {
+      throw new RangeError("Line may not be negative, was $line.");
+    } else if (this.column < 0) {
+      throw new RangeError("Column may not be negative, was $column.");
+    }
+  }
+
+  /// Returns the distance in characters between [this] and [other].
+  ///
+  /// This always returns a non-negative value.
+  int distance(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return (offset - other.offset).abs();
+  }
+
+  /// Returns a span that covers only a single point: this location.
+  SourceSpan pointSpan() => new SourceSpan(this, this, "");
+
+  /// Compares two locations.
+  ///
+  /// [other] must have the same source URL as [this].
+  int compareTo(SourceLocation other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          "\"${other.sourceUrl}\" don't match.");
+    }
+    return offset - other.offset;
+  }
+
+  bool operator ==(SourceLocation other) =>
+      sourceUrl == other.sourceUrl && offset == other.offset;
+
+  int get hashCode => sourceUrl.hashCode + offset;
+
+  String toString() => '<$runtimeType: $offset $toolString>';
+}
diff --git a/pkg/source_span/lib/src/span.dart b/pkg/source_span/lib/src/span.dart
new file mode 100644
index 0000000..9f15048
--- /dev/null
+++ b/pkg/source_span/lib/src/span.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2014, 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 source_span.span;
+
+import 'location.dart';
+import 'span_mixin.dart';
+
+/// A class that describes a segment of source text.
+abstract class SourceSpan implements Comparable<SourceSpan> {
+  /// The start location of this span.
+  final SourceLocation start;
+
+  /// The end location of this span, exclusive.
+  final SourceLocation end;
+
+  /// The source text for this span.
+  final String text;
+
+  /// The URL of the source (typically a file) of this span.
+  ///
+  /// This may be null, indicating that the source URL is unknown or
+  /// unavailable.
+  final Uri sourceUrl;
+
+  /// The length of this span, in characters.
+  final int length;
+
+  /// Creates a new span from [start] to [end] (exclusive) containing [text].
+  ///
+  /// [start] and [end] must have the same source URL and [start] must come
+  /// before [end]. [text] must have a number of characters equal to the
+  /// distance between [start] and [end].
+  factory SourceSpan(SourceLocation start, SourceLocation end, String text) =>
+      new SourceSpanBase(start, end, text);
+
+  /// Creates a new span that's the union of [this] and [other].
+  ///
+  /// The two spans must have the same source URL and may not be disjoint.
+  /// [text] is computed by combining [this.text] and [other.text].
+  SourceSpan union(SourceSpan other);
+
+  /// Compares two spans.
+  ///
+  /// [other] must have the same source URL as [this]. This orders spans by
+  /// [start] then [length].
+  int compareTo(SourceSpan other);
+
+  /// Formats [message] in a human-friendly way associated with this span.
+  ///
+  /// [color] may either be a [String], a [bool], or `null`. If it's a string,
+  /// it indicates an ANSII terminal color escape that should be used to
+  /// highlight the span's text. If it's `true`, it indicates that the text
+  /// should be highlighted using the default color. If it's `false` or `null`,
+  /// it indicates that the text shouldn't be highlighted.
+  String message(String message, {color});
+}
+
+/// A base class for source spans with [start], [end], and [text] known at
+/// construction time.
+class SourceSpanBase extends SourceSpanMixin {
+  final SourceLocation start;
+  final SourceLocation end;
+  final String text;
+
+  SourceSpanBase(this.start, this.end, this.text) {
+    if (end.sourceUrl != start.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${start.sourceUrl}\" and "
+          " \"${end.sourceUrl}\" don't match.");
+    } else if (end.offset < start.offset) {
+      throw new ArgumentError('End $end must come after start $start.');
+    } else if (text.length != start.distance(end)) {
+      throw new ArgumentError('Text "$text" must be ${start.distance(end)} '
+          'characters long.');
+    }
+  }
+}
diff --git a/pkg/source_span/lib/src/span_exception.dart b/pkg/source_span/lib/src/span_exception.dart
new file mode 100644
index 0000000..af64241
--- /dev/null
+++ b/pkg/source_span/lib/src/span_exception.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, 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 source_span.span_exception;
+
+import 'span.dart';
+
+/// A class for exceptions that have source span information attached.
+class SourceSpanException implements Exception {
+  /// A message describing the exception.
+  final String message;
+
+  /// The span associated with this exception.
+  ///
+  /// This may be `null` if the source location can't be determined.
+  final SourceSpan span;
+
+  SourceSpanException(this.message, this.span);
+
+  /// Returns a string representation of [this].
+  ///
+  /// [color] may either be a [String], a [bool], or `null`. If it's a string,
+  /// it indicates an ANSII terminal color escape that should be used to
+  /// highlight the span's text. If it's `true`, it indicates that the text
+  /// should be highlighted using the default color. If it's `false` or `null`,
+  /// it indicates that the text shouldn't be highlighted.
+  String toString({color}) {
+    if (span == null) return message;
+    return "Error on " + span.message(message, color: color);
+  }
+}
+
+/// A [SourceSpanException] that's also a [FormatException].
+class SourceSpanFormatException extends SourceSpanException
+    implements FormatException {
+  final source;
+
+  int get position => span == null ? null : span.start.offset;
+
+  SourceSpanFormatException(String message, SourceSpan span, [this.source])
+      : super(message, span);
+}
diff --git a/pkg/source_span/lib/src/span_mixin.dart b/pkg/source_span/lib/src/span_mixin.dart
new file mode 100644
index 0000000..95a720a
--- /dev/null
+++ b/pkg/source_span/lib/src/span_mixin.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2014, 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 source_span.span_mixin;
+
+import 'package:path/path.dart' as p;
+
+import 'colors.dart' as colors;
+import 'span.dart';
+import 'utils.dart';
+
+/// A mixin for easily implementing [SourceSpan].
+///
+/// This implements the [SourceSpan] methods in terms of [start], [end], and
+/// [text]. This assumes that [start] and [end] have the same source URL, that
+/// [start] comes before [end], and that [text] has a number of characters equal
+/// to the distance between [start] and [end].
+abstract class SourceSpanMixin implements SourceSpan {
+  Uri get sourceUrl => start.sourceUrl;
+  int get length => end.offset - start.offset;
+
+  int compareTo(SourceSpan other) {
+    int d = start.compareTo(other.start);
+    return d == 0 ? end.compareTo(other.end) : d;
+  }
+
+  SourceSpan union(SourceSpan other) {
+    if (sourceUrl != other.sourceUrl) {
+      throw new ArgumentError("Source URLs \"${sourceUrl}\" and "
+          " \"${other.sourceUrl}\" don't match.");
+    }
+
+    var start = min(this.start, other.start);
+    var end = max(this.end, other.end);
+    var beginSpan = start == this.start ? this : other;
+    var endSpan = end == this.end ? this : other;
+
+    if (beginSpan.end.compareTo(endSpan.start) < 0) {
+      throw new ArgumentError("Spans $this and $other are disjoint.");
+    }
+
+    var text = beginSpan.text +
+        endSpan.text.substring(beginSpan.end.distance(endSpan.start));
+    return new SourceSpan(start, end, text);
+  }
+
+  String message(String message, {color}) {
+    if (color == true) color = colors.RED;
+    if (color == false) color = null;
+
+    var buffer = new StringBuffer();
+    buffer.write('line ${start.line + 1}, column ${start.column + 1}');
+    if (sourceUrl != null) buffer.write(' of ${p.prettyUri(sourceUrl)}');
+    buffer.write(': $message');
+    if (length == 0) return buffer.toString();
+
+    buffer.write("\n");
+    var textLine = text.split("\n").first;
+    if (color != null) buffer.write(color);
+    buffer.write(textLine);
+    buffer.write("\n");
+    buffer.write('^' * textLine.length);
+    if (color != null) buffer.write(colors.NONE);
+    return buffer.toString();
+  }
+
+  bool operator ==(SourceSpan other) =>
+      start == other.start && end == other.end;
+
+  int get hashCode => start.hashCode + (31 * end.hashCode);
+
+  String toString() => '<$runtimeType: from $start to $end "$text">';
+}
diff --git a/pkg/source_span/lib/src/utils.dart b/pkg/source_span/lib/src/utils.dart
new file mode 100644
index 0000000..4a8eb55
--- /dev/null
+++ b/pkg/source_span/lib/src/utils.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, 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 source_span.utils;
+
+/// Returns the minimum of [obj1] and [obj2] according to
+/// [Comparable.compareTo].
+Comparable min(Comparable obj1, Comparable obj2) =>
+    obj1.compareTo(obj2) > 0 ? obj2 : obj1;
+
+/// Returns the maximum of [obj1] and [obj2] according to
+/// [Comparable.compareTo].
+Comparable max(Comparable obj1, Comparable obj2) =>
+    obj1.compareTo(obj2) > 0 ? obj1 : obj2;
+
+/// Find the first entry in a sorted [list] that matches a monotonic predicate.
+///
+/// Given a result `n`, that all items before `n` will not match, `n` matches,
+/// and all items after `n` match too. The result is -1 when there are no
+/// items, 0 when all items match, and list.length when none does.
+int binarySearch(List list, bool matches(item)) {
+  if (list.length == 0) return -1;
+  if (matches(list.first)) return 0;
+  if (!matches(list.last)) return list.length;
+
+  int min = 0;
+  int max = list.length - 1;
+  while (min < max) {
+    var half = min + ((max - min) ~/ 2);
+    if (matches(list[half])) {
+      max = half;
+    } else {
+      min = half + 1;
+    }
+  }
+  return max;
+}
+
diff --git a/pkg/source_span/pubspec.yaml b/pkg/source_span/pubspec.yaml
new file mode 100644
index 0000000..66e5811
--- /dev/null
+++ b/pkg/source_span/pubspec.yaml
@@ -0,0 +1,12 @@
+name: source_span
+
+version: 1.0.0
+author: Dart Team <misc@dartlang.org>
+description: A library for identifying source spans and locations.
+homepage: http://www.dartlang.org
+dependencies:
+  path: '>=1.2.0 <2.0.0'
+environment:
+  sdk: '>=0.8.10+6 <2.0.0'
+dev_dependencies:
+  unittest: '>=0.9.0 <0.10.0'
diff --git a/pkg/source_span/test/file_message_test.dart b/pkg/source_span/test/file_message_test.dart
new file mode 100644
index 0000000..18b34e7
--- /dev/null
+++ b/pkg/source_span/test/file_message_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2014, 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:unittest/unittest.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_span/src/colors.dart' as colors;
+
+main() {
+  var file;
+  setUp(() {
+    file = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop
+""", url: "foo.dart");
+  });
+
+  test("points to the span in the source", () {
+    expect(file.span(4, 7).message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^"""));
+  });
+
+  test("gracefully handles a missing source URL", () {
+    var span = new SourceFile("foo bar baz").span(4, 7);
+    expect(span.message("oh no"), equals("""
+line 1, column 5: oh no
+foo bar baz
+    ^^^"""));
+  });
+
+  test("highlights the first line of a multiline span", () {
+    expect(file.span(4, 20).message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^^^^^^"""));
+  });
+
+  test("works for a point span", () {
+    expect(file.location(4).pointSpan().message("oh no"), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^"""));
+  });
+
+  test("works for a point span at the end of a line", () {
+    expect(file.location(11).pointSpan().message("oh no"), equals("""
+line 1, column 12 of foo.dart: oh no
+foo bar baz
+           ^"""));
+  });
+
+  test("works for a point span at the end of the file", () {
+    expect(file.location(38).pointSpan().message("oh no"), equals("""
+line 3, column 12 of foo.dart: oh no
+zip zap zop
+           ^"""));
+  });
+
+  test("works for a point span in an empty file", () {
+    expect(new SourceFile("").location(0).pointSpan().message("oh no"),
+        equals("""
+line 1, column 1: oh no
+
+^"""));
+  });
+
+  test("works for a single-line file without a newline", () {
+    expect(new SourceFile("foo bar").span(0, 7).message("oh no"),
+        equals("""
+line 1, column 1: oh no
+foo bar
+^^^^^^^"""));
+  });
+
+  group("colors", () {
+    test("doesn't colorize if color is false", () {
+      expect(file.span(4, 7).message("oh no", color: false), equals("""
+line 1, column 5 of foo.dart: oh no
+foo bar baz
+    ^^^"""));
+    });
+
+    test("colorizes if color is true", () {
+      expect(file.span(4, 7).message("oh no", color: true), equals("""
+line 1, column 5 of foo.dart: oh no
+foo ${colors.RED}bar${colors.NONE} baz
+    ${colors.RED}^^^${colors.NONE}"""));
+    });
+
+    test("uses the given color if it's passed", () {
+      expect(file.span(4, 7).message("oh no", color: colors.YELLOW), equals("""
+line 1, column 5 of foo.dart: oh no
+foo ${colors.YELLOW}bar${colors.NONE} baz
+    ${colors.YELLOW}^^^${colors.NONE}"""));
+    });
+  });
+}
diff --git a/pkg/source_span/test/file_test.dart b/pkg/source_span/test/file_test.dart
new file mode 100644
index 0000000..114a17e
--- /dev/null
+++ b/pkg/source_span/test/file_test.dart
@@ -0,0 +1,370 @@
+// Copyright (c) 2014, 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:unittest/unittest.dart';
+import 'package:source_span/source_span.dart';
+
+main() {
+  var file;
+  setUp(() {
+    file = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop""", url: "foo.dart");
+  });
+
+  group("errors", () {
+    group("for span()", () {
+      test("end must come after start", () {
+        expect(() => file.span(10, 5), throwsArgumentError);
+      });
+
+      test("start may not be negative", () {
+        expect(() => file.span(-1, 5), throwsRangeError);
+      });
+
+      test("end may not be outside the file", () {
+        expect(() => file.span(10, 100), throwsRangeError);
+      });
+    });
+
+    group("for location()", () {
+      test("offset may not be negative", () {
+        expect(() => file.location(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.location(100), throwsRangeError);
+      });
+    });
+
+    group("for getLine()", () {
+      test("offset may not be negative", () {
+        expect(() => file.getLine(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.getLine(100), throwsRangeError);
+      });
+    });
+
+    group("for getColumn()", () {
+      test("offset may not be negative", () {
+        expect(() => file.getColumn(-1), throwsRangeError);
+      });
+
+      test("offset may not be outside the file", () {
+        expect(() => file.getColumn(100), throwsRangeError);
+      });
+
+      test("line may not be negative", () {
+        expect(() => file.getColumn(1, line: -1), throwsRangeError);
+      });
+
+      test("line may not be outside the file", () {
+        expect(() => file.getColumn(1, line: 100), throwsRangeError);
+      });
+
+      test("line must be accurate", () {
+        expect(() => file.getColumn(1, line: 1), throwsRangeError);
+      });
+    });
+
+    group("getOffset()", () {
+      test("line may not be negative", () {
+        expect(() => file.getOffset(-1), throwsRangeError);
+      });
+
+      test("column may not be negative", () {
+        expect(() => file.getOffset(1, -1), throwsRangeError);
+      });
+
+      test("line may not be outside the file", () {
+        expect(() => file.getOffset(100), throwsRangeError);
+      });
+
+      test("column may not be outside the file", () {
+        expect(() => file.getOffset(2, 100), throwsRangeError);
+      });
+ 
+      test("column may not be outside the line", () {
+        expect(() => file.getOffset(1, 20), throwsRangeError);
+      });
+    });
+
+    group("for getText()", () {
+      test("end must come after start", () {
+        expect(() => file.getText(10, 5), throwsArgumentError);
+      });
+
+      test("start may not be negative", () {
+        expect(() => file.getText(-1, 5), throwsRangeError);
+      });
+
+      test("end may not be outside the file", () {
+        expect(() => file.getText(10, 100), throwsRangeError);
+      });
+    });
+
+    group("for span().union()", () {
+      test("source URLs must match", () {
+        var other = new SourceSpan(
+            new SourceLocation(10), new SourceLocation(11), "_");
+
+        expect(() => file.span(9, 10).union(other), throwsArgumentError);
+      });
+
+      test("spans may not be disjoint", () {
+        expect(() => file.span(9, 10).union(file.span(11, 12)),
+            throwsArgumentError);
+      });
+    });
+
+    test("for span().expand() source URLs must match", () {
+      var other = new SourceFile("""
+foo bar baz
+whiz bang boom
+zip zap zop""", url: "bar.dart").span(10, 11);
+
+      expect(() => file.span(9, 10).expand(other), throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(file.url, equals(Uri.parse("foo.dart")));
+    expect(file.lines, equals(3));
+    expect(file.length, equals(38));
+  });
+
+  group("new SourceFile()", () {
+    test("handles CRLF correctly", () {
+      expect(new SourceFile("foo\r\nbar").getLine(6), equals(1));
+    });
+
+    test("handles a lone CR correctly", () {
+      expect(new SourceFile("foo\rbar").getLine(5), equals(1));
+    });
+  });
+
+  group("span()", () {
+    test("returns a span between the given offsets", () {
+      var span = file.span(5, 10);
+      expect(span.start, equals(file.location(5)));
+      expect(span.end, equals(file.location(10)));
+    });
+
+    test("end defaults to the end of the file", () {
+      var span = file.span(5);
+      expect(span.start, equals(file.location(5)));
+      expect(span.end, equals(file.location(file.length - 1)));
+    });
+  });
+
+  group("getLine()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getLine(15), equals(1));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getLine(12), equals(1));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getLine(11), equals(0));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getLine(file.length), equals(2));
+    });
+  });
+
+  group("getColumn()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getColumn(15), equals(3));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getColumn(12), equals(0));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getColumn(11), equals(11));
+    });
+
+    test("works when line is passed as well", () {
+      expect(file.getColumn(12, line: 1), equals(0));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getColumn(file.length), equals(11));
+    });
+  });
+
+  group("getOffset()", () {
+    test("works for a middle character on the line", () {
+      expect(file.getOffset(1, 3), equals(15));
+    });
+
+    test("works for the first character of a line", () {
+      expect(file.getOffset(1), equals(12));
+    });
+
+    test("works for a newline character", () {
+      expect(file.getOffset(0, 11), equals(11));
+    });
+
+    test("works for the last offset", () {
+      expect(file.getOffset(2, 11), equals(file.length));
+    });
+  });
+
+  group("getText()", () {
+    test("returns a substring of the source", () {
+      expect(file.getText(8, 15), equals("baz\nwhi"));
+    });
+
+    test("end defaults to the end of the file", () {
+      expect(file.getText(20), equals("g boom\nzip zap zop"));
+    });
+  });
+
+  group("FileLocation", () {
+    test("reports the correct line number", () {
+      expect(file.location(15).line, equals(1));
+    });
+
+    test("reports the correct column number", () {
+      expect(file.location(15).column, equals(3));
+    });
+
+    test("pointSpan() returns a FileSpan", () {
+      var location = file.location(15);
+      var span = location.pointSpan();
+      expect(span, new isInstanceOf<FileSpan>());
+      expect(span.start, equals(location));
+      expect(span.end, equals(location));
+      expect(span.text, isEmpty);
+    });
+  });
+
+  group("FileSpan", () {
+    test("text returns a substring of the source", () {
+      expect(file.span(8, 15).text, equals("baz\nwhi"));
+    });
+
+    group("union()", () {
+      var span;
+      setUp(() {
+        span = file.span(5, 12);
+      });
+
+      test("works with a preceding adjacent span", () {
+        var other = file.span(0, 5);
+        var result = span.union(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a preceding overlapping span", () {
+        var other = file.span(0, 8);
+        var result = span.union(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a following adjacent span", () {
+        var other = file.span(12, 16);
+        var result = span.union(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with a following overlapping span", () {
+        var other = file.span(9, 16);
+        var result = span.union(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with an internal overlapping span", () {
+        var other = file.span(7, 10);
+        expect(span.union(other), equals(span));
+      });
+
+      test("works with an external overlapping span", () {
+        var other = file.span(0, 16);
+        expect(span.union(other), equals(other));
+      });
+
+      test("returns a FileSpan for a FileSpan input", () {
+        expect(span.union(file.span(0, 5)), new isInstanceOf<FileSpan>());
+      });
+
+      test("returns a base SourceSpan for a SourceSpan input", () {
+        var other = new SourceSpan(
+            new SourceLocation(0, sourceUrl: "foo.dart"),
+            new SourceLocation(5, sourceUrl: "foo.dart"),
+            "hey, ");
+        var result = span.union(other);
+        expect(result, isNot(new isInstanceOf<FileSpan>()));
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("hey, ar baz\n"));
+      });
+    });
+
+    group("expand()", () {
+      var span;
+      setUp(() {
+        span = file.span(5, 12);
+      });
+
+      test("works with a preceding nonadjacent span", () {
+        var other = file.span(0, 3);
+        var result = span.expand(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a preceding overlapping span", () {
+        var other = file.span(0, 8);
+        var result = span.expand(other);
+        expect(result.start, equals(other.start));
+        expect(result.end, equals(span.end));
+        expect(result.text, equals("foo bar baz\n"));
+      });
+
+      test("works with a following nonadjacent span", () {
+        var other = file.span(14, 16);
+        var result = span.expand(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with a following overlapping span", () {
+        var other = file.span(9, 16);
+        var result = span.expand(other);
+        expect(result.start, equals(span.start));
+        expect(result.end, equals(other.end));
+        expect(result.text, equals("ar baz\nwhiz"));
+      });
+
+      test("works with an internal overlapping span", () {
+        var other = file.span(7, 10);
+        expect(span.expand(other), equals(span));
+      });
+
+      test("works with an external overlapping span", () {
+        var other = file.span(0, 16);
+        expect(span.expand(other), equals(other));
+      });
+    });
+  });
+}
\ No newline at end of file
diff --git a/pkg/source_span/test/location_test.dart b/pkg/source_span/test/location_test.dart
new file mode 100644
index 0000000..1eedec4
--- /dev/null
+++ b/pkg/source_span/test/location_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2014, 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:unittest/unittest.dart';
+import 'package:source_span/source_span.dart';
+
+main() {
+  var location;
+  setUp(() {
+    location = new SourceLocation(15,
+        line: 2, column: 6, sourceUrl: "foo.dart");
+  });
+
+  group('errors', () {
+    group('for new SourceLocation()', () {
+      test('offset may not be negative', () {
+        expect(() => new SourceLocation(-1), throwsRangeError);
+      });
+
+      test('line may not be negative', () {
+        expect(() => new SourceLocation(0, line: -1), throwsRangeError);
+      });
+
+      test('column may not be negative', () {
+        expect(() => new SourceLocation(0, column: -1), throwsRangeError);
+      });
+    });
+
+    test('for distance() source URLs must match', () {
+      expect(() => location.distance(new SourceLocation(0)),
+          throwsArgumentError);
+    });
+
+    test('for compareTo() source URLs must match', () {
+      expect(() => location.compareTo(new SourceLocation(0)),
+          throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(location.sourceUrl, equals(Uri.parse("foo.dart")));
+    expect(location.offset, equals(15));
+    expect(location.line, equals(2));
+    expect(location.column, equals(6));
+  });
+
+  group('toolString', () {
+    test('returns a computer-readable representation', () {
+      expect(location.toolString, equals('foo.dart:3:7'));
+    });
+
+    test('gracefully handles a missing source URL', () {
+      var location = new SourceLocation(15, line: 2, column: 6);
+      expect(location.toolString, equals('unknown source:3:7'));
+    });
+  });
+
+  test("distance returns the absolute distance between locations", () {
+    var other = new SourceLocation(10, sourceUrl: "foo.dart");
+    expect(location.distance(other), equals(5));
+    expect(other.distance(location), equals(5));
+  });
+
+  test("pointSpan returns an empty span at location", () {
+    var span = location.pointSpan();
+    expect(span.start, equals(location));
+    expect(span.end, equals(location));
+    expect(span.text, isEmpty);
+  });
+
+  group("compareTo()", () {
+    test("sorts by offset", () {
+      var other = new SourceLocation(20, sourceUrl: "foo.dart");
+      expect(location.compareTo(other), lessThan(0));
+      expect(other.compareTo(location), greaterThan(0));
+    });
+
+    test("considers equal locations equal", () {
+      expect(location.compareTo(location), equals(0));
+    });
+  });
+
+
+  group("equality", () {
+    test("two locations with the same offset and source are equal", () {
+      var other = new SourceLocation(15, sourceUrl: "foo.dart");
+      expect(location, equals(other));
+    });
+
+    test("a different offset isn't equal", () {
+      var other = new SourceLocation(10, sourceUrl: "foo.dart");
+      expect(location, isNot(equals(other)));
+    });
+
+    test("a different source isn't equal", () {
+      var other = new SourceLocation(15, sourceUrl: "bar.dart");
+      expect(location, isNot(equals(other)));
+    });
+  });
+}
diff --git a/pkg/source_span/test/span_test.dart b/pkg/source_span/test/span_test.dart
new file mode 100644
index 0000000..c62753b
--- /dev/null
+++ b/pkg/source_span/test/span_test.dart
@@ -0,0 +1,256 @@
+// Copyright (c) 2014, 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:unittest/unittest.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_span/src/colors.dart' as colors;
+
+main() {
+  var span;
+  setUp(() {
+    span = new SourceSpan(
+        new SourceLocation(5, sourceUrl: "foo.dart"),
+        new SourceLocation(12, sourceUrl: "foo.dart"),
+        "foo bar");
+  });
+
+  group('errors', () {
+    group('for new SourceSpan()', () {
+      test('source URLs must match', () {
+        var start = new SourceLocation(0, sourceUrl: "foo.dart");
+        var end = new SourceLocation(1, sourceUrl: "bar.dart");
+        expect(() => new SourceSpan(start, end, "_"), throwsArgumentError);
+      });
+
+      test('end must come after start', () {
+        var start = new SourceLocation(1);
+        var end = new SourceLocation(0);
+        expect(() => new SourceSpan(start, end, "_"), throwsArgumentError);
+      });
+
+      test('text must be the right length', () {
+        var start = new SourceLocation(0);
+        var end = new SourceLocation(1);
+        expect(() => new SourceSpan(start, end, "abc"), throwsArgumentError);
+      });
+    });
+
+    group('for union()', () {
+      test('source URLs must match', () {
+        var other = new SourceSpan(
+            new SourceLocation(12, sourceUrl: "bar.dart"),
+            new SourceLocation(13, sourceUrl: "bar.dart"),
+            "_");
+
+        expect(() => span.union(other), throwsArgumentError);
+      });
+
+      test('spans may not be disjoint', () {
+        var other = new SourceSpan(
+            new SourceLocation(13, sourceUrl: 'foo.dart'),
+            new SourceLocation(14, sourceUrl: 'foo.dart'),
+            "_");
+
+        expect(() => span.union(other), throwsArgumentError);
+      });
+    });
+
+    test('for compareTo() source URLs must match', () {
+      var other = new SourceSpan(
+          new SourceLocation(12, sourceUrl: "bar.dart"),
+          new SourceLocation(13, sourceUrl: "bar.dart"),
+          "_");
+
+      expect(() => span.compareTo(other), throwsArgumentError);
+    });
+  });
+
+  test('fields work correctly', () {
+    expect(span.start, equals(new SourceLocation(5, sourceUrl: "foo.dart")));
+    expect(span.end, equals(new SourceLocation(12, sourceUrl: "foo.dart")));
+    expect(span.sourceUrl, equals(Uri.parse("foo.dart")));
+    expect(span.length, equals(7));
+  });
+
+  group("union()", () {
+    test("works with a preceding adjacent span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          "hey, ");
+
+      var result = span.union(other);
+      expect(result.start, equals(other.start));
+      expect(result.end, equals(span.end));
+      expect(result.text, equals("hey, foo bar"));
+    });
+
+    test("works with a preceding overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(8, sourceUrl: "foo.dart"),
+          "hey, foo");
+
+      var result = span.union(other);
+      expect(result.start, equals(other.start));
+      expect(result.end, equals(span.end));
+      expect(result.text, equals("hey, foo bar"));
+    });
+
+    test("works with a following adjacent span", () {
+      var other = new SourceSpan(
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          " baz");
+
+      var result = span.union(other);
+      expect(result.start, equals(span.start));
+      expect(result.end, equals(other.end));
+      expect(result.text, equals("foo bar baz"));
+    });
+
+    test("works with a following overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(9, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "bar baz");
+
+      var result = span.union(other);
+      expect(result.start, equals(span.start));
+      expect(result.end, equals(other.end));
+      expect(result.text, equals("foo bar baz"));
+    });
+
+    test("works with an internal overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(7, sourceUrl: "foo.dart"),
+          new SourceLocation(10, sourceUrl: "foo.dart"),
+          "o b");
+
+      expect(span.union(other), equals(span));
+    });
+
+    test("works with an external overlapping span", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "hey, foo bar baz");
+
+      expect(span.union(other), equals(other));
+    });
+  });
+
+  group("message()", () {
+    test("prints the text being described", () {
+      expect(span.message("oh no"), equals("""
+line 1, column 6 of foo.dart: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("gracefully handles a missing source URL", () {
+      var span = new SourceSpan(
+          new SourceLocation(5), new SourceLocation(12), "foo bar");
+
+      expect(span.message("oh no"), equalsIgnoringWhitespace("""
+line 1, column 6: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("gracefully handles empty text", () {
+      var span = new SourceSpan(
+          new SourceLocation(5), new SourceLocation(5), "");
+
+      expect(span.message("oh no"),
+          equals("line 1, column 6: oh no"));
+    });
+
+    test("doesn't colorize if color is false", () {
+      expect(span.message("oh no", color: false), equals("""
+line 1, column 6 of foo.dart: oh no
+foo bar
+^^^^^^^"""));
+    });
+
+    test("colorizes if color is true", () {
+      expect(span.message("oh no", color: true),
+          equals("""
+line 1, column 6 of foo.dart: oh no
+${colors.RED}foo bar
+^^^^^^^${colors.NONE}"""));
+    });
+
+    test("uses the given color if it's passed", () {
+      expect(span.message("oh no", color: colors.YELLOW), equals("""
+line 1, column 6 of foo.dart: oh no
+${colors.YELLOW}foo bar
+^^^^^^^${colors.NONE}"""));
+    });
+  });
+
+  group("compareTo()", () {
+    test("sorts by start location first", () {
+      var other = new SourceSpan(
+          new SourceLocation(6, sourceUrl: "foo.dart"),
+          new SourceLocation(14, sourceUrl: "foo.dart"),
+          "oo bar b");
+
+      expect(span.compareTo(other), lessThan(0));
+      expect(other.compareTo(span), greaterThan(0));
+    });
+
+    test("sorts by length second", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(14, sourceUrl: "foo.dart"),
+          "foo bar b");
+
+      expect(span.compareTo(other), lessThan(0));
+      expect(other.compareTo(span), greaterThan(0));
+    });
+
+    test("considers equal spans equal", () {
+      expect(span.compareTo(span), equals(0));
+    });
+  });
+
+  group("equality", () {
+    test("two spans with the same locations are equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          "foo bar");
+
+      expect(span, equals(other));
+    });
+
+    test("a different start isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(0, sourceUrl: "foo.dart"),
+          new SourceLocation(12, sourceUrl: "foo.dart"),
+          "hey, foo bar");
+
+      expect(span, isNot(equals(other)));
+    });
+
+    test("a different end isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "foo.dart"),
+          new SourceLocation(16, sourceUrl: "foo.dart"),
+          "foo bar baz");
+
+      expect(span, isNot(equals(other)));
+    });
+
+    test("a different source URL isn't equal", () {
+      var other = new SourceSpan(
+          new SourceLocation(5, sourceUrl: "bar.dart"),
+          new SourceLocation(12, sourceUrl: "bar.dart"),
+          "foo bar");
+
+      expect(span, isNot(equals(other)));
+    });
+  });
+}
diff --git a/pkg/source_span/test/utils_test.dart b/pkg/source_span/test/utils_test.dart
new file mode 100644
index 0000000..3921111
--- /dev/null
+++ b/pkg/source_span/test/utils_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2013, 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:unittest/unittest.dart';
+import 'package:source_span/src/utils.dart';
+
+main() {
+  group('binary search', () {
+    test('empty', () {
+      expect(binarySearch([], (x) => true), -1);
+    });
+
+    test('single element', () {
+      expect(binarySearch([1], (x) => true), 0);
+      expect(binarySearch([1], (x) => false), 1);
+    });
+
+    test('no matches', () {
+      var list = [1, 2, 3, 4, 5, 6, 7];
+      expect(binarySearch(list, (x) => false), list.length);
+    });
+
+    test('all match', () {
+      var list = [1, 2, 3, 4, 5, 6, 7];
+      expect(binarySearch(list, (x) => true), 0);
+    });
+
+    test('compare with linear search', () {
+      for (int size = 0; size < 100; size++) {
+        var list = [];
+        for (int i = 0; i < size; i++) {
+          list.add(i);
+        }
+        for (int pos = 0; pos <= size; pos++) {
+          expect(binarySearch(list, (x) => x >= pos),
+              _linearSearch(list, (x) => x >= pos));
+        }
+      }
+    });
+  });
+}
+
+_linearSearch(list, predicate) {
+  if (list.length == 0) return -1;
+  for (int i = 0; i < list.length; i++) {
+    if (predicate(list[i])) return i;
+  }
+  return list.length;
+}
+
diff --git a/pkg/stub_core_library/README.md b/pkg/stub_core_library/README.md
new file mode 100644
index 0000000..acc40e6
--- /dev/null
+++ b/pkg/stub_core_library/README.md
@@ -0,0 +1,6 @@
+This package exists to create stubs for core libraries that can't be safely
+imported on some platforms: `dart:io`, `dart:html`, and so on. These stubs are
+included in the SDK and used by pub to support cross-platform packages.
+
+This is an application package and is not intended to be uploaded to
+pub.dartlang.org.
diff --git a/pkg/stub_core_library/bin/stub_core_library.dart b/pkg/stub_core_library/bin/stub_core_library.dart
new file mode 100644
index 0000000..9bf638c
--- /dev/null
+++ b/pkg/stub_core_library/bin/stub_core_library.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2014, 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 stub_core_library.bin;
+
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:stub_core_library/src/utils.dart';
+import 'package:stub_core_library/stub_core_library.dart';
+
+/// A map from Dart core library sources to the filenames into which they should
+/// be generated.
+///
+/// The source paths are URL-formatted and relative to the Dart SDK root.
+const CORE_LIBRARIES = const {
+  'lib/io/io.dart': 'dart_io.dart',
+  'lib/html/html_common/html_common.dart': 'dart_html_common.dart',
+  'lib/html/html_common/metadata.dart': 'metadata.dart',
+  'lib/html/dartium/html_dartium.dart': 'dart_html.dart',
+  'lib/indexed_db/dartium/indexed_db_dartium.dart': 'dart_indexed_db.dart',
+  'lib/js/dartium/js_dartium.dart': 'dart_js.dart',
+  'lib/svg/dartium/svg_dartium.dart': 'dart_svg.dart',
+  'lib/web_audio/dartium/web_audio_dartium.dart': 'dart_web_audio.dart',
+  'lib/web_gl/dartium/web_gl_dartium.dart': 'dart_web_gl.dart',
+  'lib/web_sql/dartium/web_sql_dartium.dart': 'dart_web_sql.dart'
+};
+
+/// A map from stubbable "dart:" URLs to the names of the stub files they should
+/// be replaced with.
+const IMPORT_REPLACEMENTS = const {
+  'dart:io': 'dart_io.dart',
+  'dart:html_common': 'dart_html_common.dart',
+  'dart:html': 'dart_html.dart',
+  'dart:indexed_db': 'dart_indexed_db.dart',
+  'dart:js': 'dart_js.dart',
+  'dart:svg': 'dart_svg.dart',
+  'dart:web_audio': 'dart_web_audio.dart',
+  'dart:web_gl': 'dart_web_gl.dart',
+  'dart:web_sql': 'dart_web_sql.dart'
+};
+
+/// The exit code for a usage error.
+const USAGE_ERROR = 64;
+
+/// The root directory of the SDK.
+String get sdkRoot => p.join(
+    p.dirname(p.fromUri(Platform.script)), '..', '..', '..', 'sdk');
+
+/// The argument parser.
+final argParser = new ArgParser()
+    ..addFlag('help', abbr: 'h', help: 'Print this usage information.');
+
+/// The usage string.
+String get usage => """
+Generate Dart core library stubs.
+
+Usage: stub_core_libraries.dart <directory>
+
+${argParser.getUsage()}""";
+
+void main(List<String> arguments) {
+  var options;
+  try {
+    options = argParser.parse(arguments);
+  } on FormatException catch (e) {
+    stderr.writeln(e.message);
+    stderr.writeln(usage);
+    exitCode = USAGE_ERROR;
+    return;
+  }
+
+  if (options['help']) {
+    print(usage);
+    return;
+  }
+
+  var destination = options.rest.isEmpty ? p.current : options.rest.first;
+
+  // Don't allow extra arguments.
+  if (options.rest.length > 1) {
+    var unexpected = options.rest.skip(1).map((arg) => '"$arg"');
+    var arguments = pluralize("argument", unexpected.length);
+    stderr.writeln("Unexpected $arguments ${toSentence(unexpected)}.");
+    stderr.writeln(usage);
+    exitCode = USAGE_ERROR;
+    return;
+  }
+
+  new Directory(destination).createSync(recursive: true);
+
+  // TODO(nweiz): Tree-shake these libraries when issue 19896 is fixed.
+  CORE_LIBRARIES.forEach((path, output) {
+    path = p.join(sdkRoot, p.fromUri(path));
+    new File(p.join(destination, output))
+        .writeAsStringSync(stubFile(path, IMPORT_REPLACEMENTS));
+  });
+}
diff --git a/pkg/stub_core_library/lib/src/utils.dart b/pkg/stub_core_library/lib/src/utils.dart
new file mode 100644
index 0000000..d5bdd8f
--- /dev/null
+++ b/pkg/stub_core_library/lib/src/utils.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, 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 stub_core_libraries.utils;
+
+/// Returns a sentence fragment listing the elements of [iter].
+///
+/// This converts each element of [iter] to a string and separates them with
+/// commas and/or "and" where appropriate.
+String toSentence(Iterable iter) {
+  if (iter.length == 1) return iter.first.toString();
+  return iter.take(iter.length - 1).join(", ") + " and ${iter.last}";
+}
+
+/// Returns [name] if [number] is 1, or the plural of [name] otherwise.
+///
+/// By default, this just adds "s" to the end of [name] to get the plural. If
+/// [plural] is passed, that's used instead.
+String pluralize(String name, int number, {String plural}) {
+  if (number == 1) return name;
+  if (plural != null) return plural;
+  return '${name}s';
+}
diff --git a/pkg/stub_core_library/lib/stub_core_library.dart b/pkg/stub_core_library/lib/stub_core_library.dart
new file mode 100644
index 0000000..d61053e
--- /dev/null
+++ b/pkg/stub_core_library/lib/stub_core_library.dart
@@ -0,0 +1,391 @@
+// Copyright (c) 2014, 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 stub_core_library;
+
+import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:path/path.dart' as p;
+
+/// Returns the contents of a stub version of the library at [path].
+///
+/// A stub library has the same API as the original library, but none of the
+/// implementation. Specifically, this guarantees that any code that worked with
+/// the original library will be statically valid with the stubbed library, and
+/// its only runtime errors will be [UnsupportedError]s. This means that
+/// constants and const constructors are preserved.
+///
+/// [importReplacements] is a map from import URIs to their replacements. It's
+/// used so that mutliple interrelated libraries can refer to their stubbed
+/// versions rather than the originals.
+String stubFile(String path, [Map<String, String> importReplacements]) {
+  var visitor = new _StubVisitor(path, importReplacements);
+  parseDartFile(path).accept(visitor);
+  return visitor.toString();
+}
+
+/// Returns the contents of a stub version of the library parsed from [code].
+///
+/// If [code] contains `part` directives, they will be resolved relative to
+/// [path]. The contents of the parted files will be stubbed and inlined.
+String stubCode(String code, String path,
+    [Map<String, String> importReplacements]) {
+  var visitor = new _StubVisitor(path, importReplacements);
+  parseCompilationUnit(code, name: path).accept(visitor);
+  return visitor.toString();
+}
+
+/// An AST visitor that traverses the tree of the original library and writes
+/// the stubbed version.
+///
+/// In order to avoid complex tree-shaking logic, this takes a conservative
+/// approach to removing private code. Private classes may still be extended by
+/// public classes; private constants may be referenced by public constants; and
+/// private static and top-level methods may be referenced by public constants
+/// or by superclass constructor calls. All of these are preserved even though
+/// most could theoretically be eliminated.
+class _StubVisitor extends ToSourceVisitor {
+  /// The directory containing the library being visited.
+  final String _root;
+
+  /// Which imports to replace.
+  final Map<String, String> _importReplacements;
+
+  final PrintStringWriter _writer;
+
+  // TODO(nweiz): Get rid of this when issue 19897 is fixed.
+  /// The current class declaration being visited.
+  ///
+  /// This is `null` if there is no current class declaration.
+  ClassDeclaration _class;
+
+  _StubVisitor(String path, Map<String, String> importReplacements)
+      : this._(path, importReplacements, new PrintStringWriter());
+
+  _StubVisitor._(String path, Map<String, String> importReplacements,
+          PrintStringWriter writer)
+      : _root = p.dirname(path),
+        _importReplacements = importReplacements == null ? const {} :
+            importReplacements,
+        _writer = writer,
+        super(writer);
+
+  String toString() => _writer.toString();
+
+  visitImportDirective(ImportDirective node) {
+    node = _modifyDirective(node);
+    if (node != null) super.visitImportDirective(node);
+  }
+
+  visitExportDirective(ExportDirective node) {
+    node = _modifyDirective(node);
+    if (node != null) super.visitExportDirective(node);
+  }
+
+  visitPartDirective(PartDirective node) {
+    // Inline parts directly in the output file.
+    var path = p.url.join(_root, p.fromUri(node.uri.stringValue));
+    parseDartFile(path).accept(new _StubVisitor._(path, const {}, _writer));
+  }
+
+  visitPartOfDirective(PartOfDirective node) {
+    // Remove "part of", since parts are inlined.
+  }
+
+  visitClassDeclaration(ClassDeclaration node) {
+    _class = _clone(node);
+    _class.nativeClause = null;
+    super.visitClassDeclaration(_class);
+    _class = null;
+  }
+
+  visitConstructorDeclaration(ConstructorDeclaration node) {
+    node = _withoutExternal(node);
+
+    // Remove field initializers and redirecting initializers but not superclass
+    // initializers. The code is ugly because NodeList doesn't support
+    // removeWhere.
+    var superclassInitializers = node.initializers.where((initializer) =>
+        initializer is SuperConstructorInvocation).toList();
+    node.initializers.clear();
+    node.initializers.addAll(superclassInitializers);
+
+    // Add a space because ToSourceVisitor doesn't and it makes testing easier.
+    _writer.print(" ");
+    super.visitConstructorDeclaration(node);
+  }
+
+  visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    // If this is a const constructor, it should actually work, so don't screw
+    // with the superclass constructor.
+    if ((node.parent as ConstructorDeclaration).constKeyword != null) {
+      return super.visitSuperConstructorInvocation(node);
+    }
+
+    _writer.print("super");
+    _visitNodeWithPrefix(".", node.constructorName);
+    _writer.print("(");
+
+    // If one stubbed class extends another, we don't want to run the original
+    // code for the superclass constructor call, and we do want an
+    // UnsupportedException that points to the subclass rather than the
+    // superclass. To do this, we null out all but the first superclass
+    // constructor parameter and replace the first parameter with a throw.
+    var positionalArguments = node.argumentList.arguments
+        .where((argument) => argument is! NamedExpression);
+    if (positionalArguments.isNotEmpty) {
+      _writer.print(_unsupported(_functionName(node)));
+      for (var i = 0; i < positionalArguments.length - 1; i++) {
+        _writer.print(", null");
+      }
+    }
+
+    _writer.print(")");
+  }
+
+  visitMethodDeclaration(MethodDeclaration node) {
+    // Private non-static methods aren't public and aren't accessible from
+    // constant expressions, so can be safely removed.
+    if (Identifier.isPrivateName(node.name.name) && !node.isStatic) return;
+    _writer.print(" ");
+    super.visitMethodDeclaration(_withoutExternal(node));
+  }
+
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    super.visitFunctionDeclaration(_withoutExternal(node));
+  }
+
+  visitBlockFunctionBody(BlockFunctionBody node) => _emitFunctionBody(node);
+
+  visitExpressionFunctionBody(ExpressionFunctionBody node) =>
+      _emitFunctionBody(node);
+
+  visitNativeFunctionBody(NativeFunctionBody node) => _emitFunctionBody(node);
+
+  visitEmptyFunctionBody(FunctionBody node) {
+    // Preserve empty function bodies for abstract methods, since there's no
+    // reason not to. Note that "empty" here means "foo();" not "foo() {}".
+    var isAbstractMethod = node.parent is MethodDeclaration &&
+        !(node.parent as MethodDeclaration).isStatic && _class != null &&
+        _class.isAbstract;
+
+    // Preserve empty function bodies for const constructors because we want
+    // them to continue to work.
+    var isConstConstructor = node.parent is ConstructorDeclaration &&
+        (node.parent as ConstructorDeclaration).constKeyword != null;
+
+    if (isAbstractMethod || isConstConstructor) {
+      super.visitEmptyFunctionBody(node);
+      _writer.print(" ");
+    } else {
+      _writer.print(" ");
+      _emitFunctionBody(node);
+    }
+  }
+
+  visitFieldFormalParameter(FieldFormalParameter node) {
+    // Remove "this." because instance variables are replaced with getters and
+    // setters or just set to null.
+    _emitTokenWithSuffix(node.keyword, " ");
+
+    // Make sure the parameter is still typed by grabbing the type from the
+    // associated instance variable.
+    var type = node.type;
+    if (type == null) {
+      var variable = _class.members
+          .where((member) => member is FieldDeclaration)
+          .expand((member) => member.fields.variables)
+          .firstWhere((variable) => variable.name.name == node.identifier.name,
+              orElse: () => null);
+      if (variable != null) type = variable.parent.type;
+    }
+
+    _visitNodeWithSuffix(type, " ");
+    _visitNode(node.identifier);
+    _visitNode(node.parameters);
+  }
+
+  visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    node.variables.variables.forEach(_emitVariableDeclaration);
+  }
+
+  visitFieldDeclaration(FieldDeclaration node) {
+    _writer.print(" ");
+    node.fields.variables.forEach(_emitVariableDeclaration);
+  }
+
+  /// Modifies a directive to respect [importReplacements] and ignore hidden
+  /// core libraries.
+  ///
+  /// This can return `null`, indicating that the directive should not be
+  /// emitted.
+  UriBasedDirective _modifyDirective(UriBasedDirective node) {
+    // Ignore internal "dart:" libraries.
+    if (node.uri.stringValue.startsWith('dart:_')) return null;
+
+    // Replace libraries in [importReplacements].
+    if (_importReplacements.containsKey(node.uri.stringValue)) {
+      node = _clone(node);
+      var token = new StringToken(TokenType.STRING,
+          '"${_importReplacements[node.uri.stringValue]}"', 0);
+      node.uri = new SimpleStringLiteral(token, null);
+    }
+
+    return node;
+  }
+
+  /// Emits a variable declaration, either as a literal variable or as a getter
+  /// and maybe a setter that throw [UnsupportedError]s.
+  _emitVariableDeclaration(VariableDeclaration node) {
+    VariableDeclarationList parent = node.parent;
+    var isStatic = node.parent.parent is FieldDeclaration &&
+        (node.parent.parent as FieldDeclaration).isStatic;
+
+    // Preserve constants as-is.
+    if (node.isConst) {
+      if (isStatic) _writer.print("static ");
+      _writer.print("const ");
+      _visitNode(node);
+      _writer.print("; ");
+      return;
+    }
+
+    // Ignore non-const private variables.
+    if (Identifier.isPrivateName(node.name.name)) return;
+
+    // There's no need to throw errors for instance fields of classes that can't
+    // be constructed.
+    if (!isStatic && _class != null && !_inConstructableClass) {
+      _emitTokenWithSuffix(parent.keyword, " ");
+      _visitNodeWithSuffix(parent.type, " ");
+      _visitNode(node.name);
+      // Add an initializer to make sure that final variables are initialized.
+      if (node.isFinal) _writer.print(" = null; ");
+      return;
+    }
+
+    var name = node.name.name;
+    if (_class != null) name = "${_class.name}.$name";
+
+    // Convert public variables into getters and setters that throw
+    // UnsupportedErrors.
+    if (isStatic) _writer.print("static ");
+    _visitNodeWithSuffix(parent.type, " ");
+    _writer.print("get ");
+    _visitNode(node.name);
+    _writer.print(" => ${_unsupported(name)}; ");
+    if (node.isFinal) return;
+
+    if (isStatic) _writer.print("static ");
+    _writer.print("set ");
+    _visitNode(node.name);
+    _writer.print("(");
+    _visitNodeWithSuffix(parent.type, " ");
+    _writer.print("_) { ${_unsupported("$name=")}; } ");
+  }
+
+  /// Emits a function body.
+  ///
+  /// This usually emits a body that throws an [UnsupportedError], but it can
+  /// emit an empty body as well.
+  void _emitFunctionBody(FunctionBody node) {
+    // There's no need to throw errors for instance methods of classes that
+    // can't be constructed.
+    var parent = node.parent;
+    if (parent is MethodDeclaration && !parent.isStatic &&
+        !_inConstructableClass) {
+      _writer.print('{} ');
+      return;
+    }
+
+    _writer.print('{ ${_unsupported(_functionName(node))}; } ');
+  }
+
+  // Returns a human-readable name for the function containing [node].
+  String _functionName(AstNode node) {
+    // Come up with a nice name for the error message so users can tell exactly
+    // what unsupported method they're calling.
+    var function = node.getAncestor((ancestor) =>
+        ancestor is FunctionDeclaration || ancestor is MethodDeclaration);
+    if (function != null) {
+      var name = function.name.name;
+      if (function.isSetter) {
+        name = "$name=";
+      } else if (!function.isGetter &&
+          !(function is MethodDeclaration && function.isOperator)) {
+        name = "$name()";
+      }
+      if (_class != null) name = "${_class.name}.$name";
+      return name;
+    }
+
+    var constructor = node.getAncestor((ancestor) =>
+        ancestor is ConstructorDeclaration);
+    if (constructor == null) return "This function";
+
+    var name = "new ${constructor.returnType.name}";
+    if (constructor.name != null) name = "$name.${constructor.name}";
+    return "$name()";
+  }
+
+  /// Returns a deep copy of [node].
+  AstNode _clone(AstNode node) => node.accept(new AstCloner());
+
+  /// Returns a deep copy of [node] without the "external" keyword.
+  AstNode _withoutExternal(node) {
+    var clone = node.accept(new AstCloner());
+    clone.externalKeyword = null;
+    return clone;
+  }
+
+  /// Visits [node] if it's non-`null`.
+  void _visitNode(AstNode node) {
+    if (node != null) node.accept(this);
+  }
+
+  /// Visits [node] then emits [suffix] if [node] isn't `null`.
+  void _visitNodeWithSuffix(AstNode node, String suffix) {
+    if (node == null) return;
+    node.accept(this);
+    _writer.print(suffix);
+  }
+
+  /// Emits [prefix] then visits [node] if [node] isn't `null`.
+  void _visitNodeWithPrefix(String prefix, AstNode node) {
+    if (node == null) return;
+    _writer.print(prefix);
+    node.accept(this);
+  }
+
+  /// Emits [token] followed by [suffix] if [token] isn't `null`.
+  void _emitTokenWithSuffix(Token token, String suffix) {
+    if (token == null) return;
+    _writer.print(token.lexeme);
+    _writer.print(suffix);
+  }
+
+  /// Returns an expression that throws an [UnsupportedError] explaining that
+  /// [name] isn't supported.
+  String _unsupported(String name) => 'throw new UnsupportedError("$name is '
+      'unsupported on this platform.")';
+
+  /// Returns whether or not the visitor is currently visiting a class that can
+  /// be constructed without error after it's stubbed.
+  ///
+  /// There are two cases where a class will be constructable once it's been
+  /// stubbed. First, a class with a const constructor will be preserved, since
+  /// making the const constructor fail would statically break code. Second, a
+  /// class with a default constructor is preserved since adding a constructor
+  /// that throws an error could statically break uses of the class as a mixin.
+  bool get _inConstructableClass {
+    if (_class == null) return false;
+
+    var constructors = _class.members.where((member) =>
+        member is ConstructorDeclaration);
+    if (constructors.isEmpty) return true;
+
+    return constructors.any((constructor) => constructor.constKeyword != null);
+  }
+}
diff --git a/pkg/stub_core_library/pubspec.yaml b/pkg/stub_core_library/pubspec.yaml
new file mode 100644
index 0000000..fb6fce3
--- /dev/null
+++ b/pkg/stub_core_library/pubspec.yaml
@@ -0,0 +1,6 @@
+name: stub_core_library
+description: A repo-internal package for creating core library stubs.
+dependencies:
+  args: ">=0.11.0 <0.13.0"
+  analyzer: ">=0.22.0-dev <0.23.0"
+  path: ">=1.1.0 <2.0.0"
diff --git a/pkg/stub_core_library/test/stub_test.dart b/pkg/stub_core_library/test/stub_test.dart
new file mode 100644
index 0000000..5cdb775
--- /dev/null
+++ b/pkg/stub_core_library/test/stub_test.dart
@@ -0,0 +1,428 @@
+// Copyright (c) 2014, 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 stub_core_libraries.test;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:stub_core_library/stub_core_library.dart';
+import 'package:unittest/unittest.dart';
+
+String sandbox;
+
+main() {
+  setUp(() {
+    sandbox = Directory.systemTemp.createTempSync('stub_core_library_').path;
+  });
+
+  tearDown(() => new Directory(sandbox).deleteSync(recursive: true));
+
+  group("imports", () {
+    test("dart: imports are preserved by default", () {
+      expectStub("""
+        import "dart:core";
+        import "dart:html";
+        import "dart:fblthp";
+      """, """
+        import "dart:core";
+        import "dart:html";
+        import "dart:fblthp";
+      """);
+    });
+
+    test("internal dart: imports are removed", () {
+      expectStub("""
+        import "dart:_internal";
+        import "dart:_blink" as _blink;
+        import "dart:_fblthp";
+      """, "");
+    });
+
+    test("replaced imports are replaced", () {
+      expectStub("""
+        import "dart:html";
+        import "foo.dart" as foo;
+      """, """
+        import "dart_html.dart";
+        import "bar.dart" as foo;
+      """, {
+        "dart:html": "dart_html.dart",
+        "foo.dart": "bar.dart"
+      });
+    });
+
+    test("exports are replaced as well", () {
+      expectStub("""
+        export "dart:html";
+        export "foo.dart" show foo;
+      """, """
+        export "dart_html.dart";
+        export "bar.dart" show foo;
+      """, {
+        "dart:html": "dart_html.dart",
+        "foo.dart": "bar.dart"
+      });
+    });
+  });
+
+  test("a parted file is stubbed and included inline", () {
+    new File(p.join(sandbox, "part.dart")).writeAsStringSync("""
+      part of lib;
+      void foo() => print('foo!');
+    """);
+
+    expectStub("""
+      library lib;
+      part "part.dart";
+    """, """
+      library lib;
+      void foo() { ${unsupported("foo()")}; }
+    """);
+  });
+
+  test("a class declaration's native clause is removed", () {
+    expectStub("class Foo native 'Foo' {}", "class Foo {}");
+  });
+
+  group("constructors", () {
+    test("a constructor's body is stubbed out", () {
+      expectStub("""
+        class Foo {
+          Foo() { print("Created a foo!"); }
+        }
+      """, """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+        }
+      """);
+    });
+
+    test("a constructor's empty body is stubbed out", () {
+      expectStub("class Foo { Foo(); }", """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+        }
+      """);
+    });
+
+    test("a constructor's external declaration is removed", () {
+      expectStub("class Foo { external Foo(); }", """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+        }
+      """);
+    });
+
+    test("a constructor's field initializers are removed", () {
+      expectStub("""
+        class Foo {
+          final _field1;
+          final _field2;
+
+          Foo()
+            : _field1 = 1,
+              _field2 = 2;
+        }
+      """, """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+        }
+      """);
+    });
+
+    test("a constructor's redirecting initializers are removed", () {
+      expectStub("""
+        class Foo {
+          Foo() : this.create();
+          Foo.create();
+        }
+      """, """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+          Foo.create() { ${unsupported("new Foo.create()")}; }
+        }
+      """);
+    });
+
+    test("a constructor's superclass calls are preserved", () {
+      expectStub("""
+        class Foo {
+          Foo(int i, int j, {int k});
+        }
+
+        class Bar extends Foo {
+          Bar() : super(1, 2, k: 3);
+        }
+      """, """
+        class Foo {
+          Foo(int i, int j, {int k}) { ${unsupported("new Foo()")}; }
+        }
+
+        class Bar extends Foo {
+          Bar()
+              : super(${unsupported("new Bar()")}, null) {
+            ${unsupported("new Bar()")};
+          }
+        }
+      """);
+    });
+
+    test("a constructor's initializing formals are replaced with normal "
+        "parameters", () {
+      expectStub("""
+        class Foo {
+          final int _i;
+          var _j;
+          final List<int> _k;
+
+          Foo(this._i, this._j, this._k);
+        }
+      """, """
+        class Foo {
+          Foo(int _i, _j, List<int> _k) { ${unsupported("new Foo()")}; }
+        }
+      """);
+    });
+
+    test("a const constructor isn't stubbed", () {
+      expectStub("class Foo { const Foo(); }", "class Foo { const Foo(); }");
+    });
+
+    test("a const constructor's superclass calls are fully preserved", () {
+      expectStub("""
+        class Foo {
+          const Foo(int i, int j, int k);
+        }
+
+        class Bar extends Foo {
+          const Bar() : super(1, 2, 3);
+        }
+      """, """
+        class Foo {
+          const Foo(int i, int j, int k);
+        }
+
+        class Bar extends Foo {
+          const Bar() : super(1, 2, 3);
+        }
+      """);
+    });
+
+    test("a redirecting const constructor stops redirecting", () {
+      expectStub("""
+        class Foo {
+          const Foo.named(int i, int j, int k)
+              : this(i, j, k);
+          const Foo(int i, int j, int k);
+        }
+      """, """
+        class Foo {
+          const Foo.named(int i, int j, int k);
+          const Foo(int i, int j, int k);
+        }
+      """);
+    });
+  });
+
+  group("functions", () {
+    test("stubs a top-level function", () {
+      expectStub("void foo() => print('hello!');",
+          "void foo() { ${unsupported('foo()')}; }");
+    });
+
+    test("stubs a private top-level function", () {
+      expectStub("void _foo() => print('hello!');",
+          "void _foo() { ${unsupported('_foo()')}; }");
+    });
+
+    test("stubs a method", () {
+      expectStub("""
+        class Foo {
+          foo() => print("hello!");
+        }
+      """, """
+        class Foo {
+          foo() { ${unsupported('Foo.foo()')}; }
+        }
+      """);
+    });
+
+    test("empties a method in an unconstructable class", () {
+      expectStub("""
+        class Foo {
+          Foo();
+          foo() => print("hello!");
+        }
+      """, """
+        class Foo {
+          Foo() { ${unsupported('new Foo()')}; }
+          foo() {}
+        }
+      """);
+    });
+
+    test("removes a private instance method", () {
+      expectStub("""
+        class Foo {
+          _foo() => print("hello!");
+        }
+      """, "class Foo {}");
+    });
+
+    test("stubs a private static method", () {
+      expectStub("""
+        class Foo {
+          static _foo() => print("hello!");
+        }
+      """, """
+        class Foo {
+          static _foo() { ${unsupported('Foo._foo()')}; }
+        }
+      """);
+    });
+
+    test("preserves an abstract instance method", () {
+      expectStub("abstract class Foo { foo(); }",
+          "abstract class Foo { foo(); }");
+    });
+
+    test("removes a native function body", () {
+      expectStub("void foo() native 'foo';",
+          "void foo() { ${unsupported('foo()')}; }");
+    });
+  });
+
+  group("top-level fields", () {
+    test("stubs out a top-level field", () {
+      expectStub("int foo;", """
+        int get foo => ${unsupported('foo')};
+        set foo(int _) { ${unsupported('foo=')}; }
+      """);
+    });
+
+    test("stubs out a top-level field with a value", () {
+      expectStub("int foo = 12;", """
+        int get foo => ${unsupported('foo')};
+        set foo(int _) { ${unsupported('foo=')}; }
+      """);
+    });
+
+    test("stubs out a final top-level field", () {
+      expectStub("final int foo = 12;",
+          "int get foo => ${unsupported('foo')};");
+    });
+
+    test("preserves a const top-level field", () {
+      expectStub("const foo = 12;", "const foo = 12;");
+    });
+
+    test("removes a private top-level field", () {
+      expectStub("int _foo = 12;", "");
+    });
+
+    test("preserves a private const top-level field", () {
+      expectStub("const _foo = 12;", "const _foo = 12;");
+    });
+
+    test("splits a multiple-declaration top-level field", () {
+      expectStub("int foo, bar, baz;", """
+        int get foo => ${unsupported('foo')};
+        set foo(int _) { ${unsupported('foo=')}; }
+        int get bar => ${unsupported('bar')};
+        set bar(int _) { ${unsupported('bar=')}; }
+        int get baz => ${unsupported('baz')};
+        set baz(int _) { ${unsupported('baz=')}; }
+      """);
+    });
+  });
+
+  group("instance fields", () {
+    test("stubs out an instance field", () {
+      expectStub("class Foo { int foo; }", """
+        class Foo {
+          int get foo => ${unsupported('Foo.foo')};
+          set foo(int _) { ${unsupported('Foo.foo=')}; }
+        }
+      """);
+    });
+
+    test("stubs out an instance field with a value", () {
+      expectStub("class Foo { int foo = 12; }", """
+        class Foo {
+          int get foo => ${unsupported('Foo.foo')};
+          set foo(int _) { ${unsupported('Foo.foo=')}; }
+        }
+      """);
+    });
+
+    test("stubs out a final instance field", () {
+      expectStub("class Foo { final int foo = 12; }", """
+        class Foo {
+           int get foo => ${unsupported('Foo.foo')};
+        }
+      """);
+    });
+
+    test("removes a private instance field", () {
+      expectStub("class Foo { int _foo = 12; }", "class Foo { }");
+    });
+
+    test("stubs out a static instance field", () {
+      expectStub("class Foo { static int foo = 12; }", """
+        class Foo {
+           static int get foo => ${unsupported('Foo.foo')};
+           static set foo(int _) { ${unsupported('Foo.foo=')}; }
+        }
+      """);
+    });
+
+    test("removes a private static instance field", () {
+      expectStub("class Foo { static int _foo = 12; }", "class Foo { }");
+    });
+
+    test("preserves a static const instance field", () {
+      expectStub("class Foo { static const foo = 12; }",
+          "class Foo { static const foo = 12; }");
+    });
+
+    test("nulls a field for an unconstructable class", () {
+      expectStub("""
+        class Foo {
+          Foo();
+          final foo = 12;
+        }
+      """, """
+        class Foo {
+          Foo() { ${unsupported("new Foo()")}; }
+          final foo = null;
+        }
+      """);
+    });
+
+    test("splits a multiple-declaration instance field", () {
+      expectStub("class Foo { int foo, bar, baz; }", """
+        class Foo {
+          int get foo => ${unsupported('Foo.foo')};
+          set foo(int _) { ${unsupported('Foo.foo=')}; }
+          int get bar => ${unsupported('Foo.bar')};
+          set bar(int _) { ${unsupported('Foo.bar=')}; }
+          int get baz => ${unsupported('Foo.baz')};
+          set baz(int _) { ${unsupported('Foo.baz=')}; }
+        }
+      """);
+    });
+  });
+}
+
+/// Expects that [source] will transform into [expected] when stubbed.
+void expectStub(String source, String expected,
+    [Map<String, String> importReplacements]) {
+  expect(stubCode(source, p.join(sandbox, 'source.dart'), importReplacements),
+      equalsIgnoringWhitespace(expected));
+}
+
+/// Returns code for throwing an [UnsupportedError] for the given name.
+String unsupported(String name) => 'throw new UnsupportedError("$name is '
+    'unsupported on this platform.")';
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index a344255..e68be83 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -930,7 +930,7 @@
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
+          {{ ref['closureFunc'].name }}
         </a>
       </template>
 
@@ -6564,6 +6564,7 @@
         <library-nav-menu library="{{ function.owningLibrary }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -15633,6 +15634,7 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
+    <nav-menu link="{{ script.owningLibrary.link }}" anchor="{{ script.owningLibrary.name }}"></nav-menu>
     <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 754a75f..bee1169 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0:function(a){var z,y,x,w
+aN:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -193,23 +193,23 @@
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"$0","gAY",0,0,69],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,70],
+bu:[function(a){return H.a5(a)},"$0","gAY",0,0,71],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,72],
 gbx:function(a){return new H.cu(H.wO(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gAY",0,0,69],
+bu:[function(a){return String(a)},"$0","gAY",0,0,71],
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isa2:true},
 CDU:{
 "^":"Gv;",
 n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gAY",0,0,69],
+bu:[function(a){return"null"},"$0","gAY",0,0,71],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,70]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,72]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
@@ -230,7 +230,7 @@
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
 H.IC(a,b,c)},
 Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
@@ -238,12 +238,12 @@
 return!0}return!1},
 Nk:function(a,b){H.Ap(a,b)},
 ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -285,7 +285,7 @@
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Oq(a,0)])
 else{z=H.VM(a.slice(),[H.Oq(a,0)])
@@ -314,12 +314,7 @@
 $asWO:null,
 $isyN:true,
 $isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -349,11 +344,11 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,71],
+return y},"$1","gKy",2,0,14,73],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"$0","gAY",0,0,69],
+else return""+a},"$0","gAY",0,0,71],
 giO:function(a){return a&0x1FFFFFFF},
 J:function(a){return-a},
 g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -387,6 +382,8 @@
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
+ib:function(a,b){if(b<0)throw H.b(P.u(b))
+return b>31?0:a>>>b},
 i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a&b)>>>0},
 w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -506,7 +503,7 @@
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gAY",0,0,69],
+bu:[function(a){return a},"$0","gAY",0,0,71],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -549,7 +546,7 @@
 init.globalState.Xz.bL()
 return z},
 cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
+Ke:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -575,7 +572,7 @@
 x=H.KT(y,[y]).BD(a)
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
+if(y)u.vV(0,new H.Fx(z,a))
 else u.vV(0,a)}init.globalState.Xz.bL()},
 yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
@@ -591,7 +588,7 @@
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
-uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=H.b0(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
@@ -613,9 +610,7 @@
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
+case"spawn-worker":break
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
@@ -623,56 +618,21 @@
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.yb(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","dM",4,0,null,0,1],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+yb:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.t0(P.EF(["command","log","msg",a],null,null))
 y.toString
-self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.XO(w,null)
+self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
+z=new H.oP(w,null)
 throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.Vr(b,".dart"))b=J.ew(b,".js")
-z=P.at()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gTw(z).ml(new H.yk(y))
-x=new H.VU(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.WK(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.uK,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -685,35 +645,30 @@
 x=new H.vK(a,b,c,d,z)
 if(e===!0){z.oz(w,w)
 init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
 t0:function(a){var z
 if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
+return z.tf(a)}else{z=new H.fL(new H.cx())
 z.mR=new H.m3(null)
-return z.Zo(a)}},
+return z.tf(a)}},
 b0:function(a){if(init.globalState.ji===!0)return new H.BV(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
-JO:{
-"^":"TpZ:72;a,c",
+Fx:{
+"^":"TpZ:74;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 pq:{
-"^":"a;Hg,NO,Y7,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.My()==null
-y=$.Fv()
-x=z&&$.wB()===!0
+"^":"a;Hg,NO,hJ,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
+qi:function(a){var z,y,x
+z=self.window==null
+y=self.Worker
+x=z&&!!self.postMessage
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
@@ -721,17 +676,17 @@
 this.da=z&&!x
 y=H.IY
 x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Pt(null,y)
+x.Eo(null,y)
 this.Xz=new H.cC(x,0)
 this.iR=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.In()
+if(this.EF===!0){z=new H.JH()
 this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.uK,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
+self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
+self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
+static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,Ji,pa,ir",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 oz:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -761,19 +716,19 @@
 this.pa=b},
 ZC:function(a,b){var z,y
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.Ji
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
 if(y){J.H4(a,null)
 return}y=new H.NY(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
 return}z=this.M2
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 this.M2=z}z.NZ(0,y)},
 bc:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.Ji
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
 if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
@@ -781,13 +736,12 @@
 z.Rk.NZ(0,new H.IY(this,y,"kill"))
 return}z=this.M2
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 this.M2=z}z.NZ(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
 if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
-z=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
+if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
 y.fixed$length=init
@@ -799,16 +753,16 @@
 init.globalState.N0=this
 $=this.En
 y=null
-this.Ji=!0
+this.mf=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.XO(v,null)
+w=new H.oP(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.Ji=!1
+if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,73,74],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,75,76],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
@@ -844,10 +798,10 @@
 this.ir.V1(0)
 z=this.CN
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
+this.CN=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NY:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -864,61 +818,35 @@
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-Wu:function(){if($.My()!=null)new H.Rm(this).$0()
+Wu:function(){if(self.window!=null)new H.Rm(this).$0()
 else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.Wu()
 else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.rj
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,17],
 $isIY:true},
-In:{
+JH:{
 "^":"a;"},
 kb:{
-"^":"TpZ:72;a,b,c,d,e,f",
+"^":"TpZ:74;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xn:{
-"^":"TpZ:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-jl3:{
-"^":"TpZ:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,76,"call"],
-$isEH:true},
-yk:{
-"^":"TpZ:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-WK:{
-"^":"TpZ:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-hI:{
-"^":"TpZ:72;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
 vK:{
-"^":"TpZ:18;a,b,c,d,e",
+"^":"TpZ:17;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
@@ -952,12 +880,12 @@
 y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isVU&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
+giO:function(a){return J.Mo(this.JE)},
 $isVU:true,
 $ispW:true,
 $ishq:true},
 Ua:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gKS()){if(this.c){y=this.a
@@ -982,7 +910,7 @@
 $ispW:true,
 $ishq:true},
 yo:{
-"^":"a;qK>,D1,KS<",
+"^":"a;x6>,D1,KS<",
 wy:function(a){return this.D1.$1(a)},
 pr:function(){this.KS=!0
 this.D1=null},
@@ -991,41 +919,27 @@
 this.KS=!0
 this.D1=null
 z=init.globalState.N0
-y=this.qK
+y=this.x6
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
 z.PC()},
 Rf:function(a,b){if(this.KS)return
 this.wy(b)},
 $isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"wS;vl,tU",
-KR:function(a,b,c,d){var z=this.tU
-z.toString
-return H.VM(new P.u2(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-xO:[function(a){this.vl.xO(0)
-this.tU.xO(0)},"$0","gQF",0,0,18],
-TL:function(a){var z=P.HT(this.gQF(this),null,null,null,!0,null)
-this.tU=z
-this.vl.D1=z.ght(z)},
-$aswS:function(){return[null]},
-$iswS:true},
+static:{"^":"kz"}},
 RS:{
 "^":"hz;Ao,mR",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.ki(a.JE)]
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.Mo(a.JE)]
 if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
+yf:function(a){if(!!a.$iskuS)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;mR",
 DE:function(a){if(!!a.$isVU)return new H.VU(a.JE,a.tv)
 if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 BV:{
 "^":"fPc;RZ",
@@ -1039,7 +953,7 @@
 u=v.hV(w)
 if(u==null)return
 return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
 "^":"a;u5",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
@@ -1056,9 +970,9 @@
 u:function(a,b,c){},
 CH:function(a){},
 no:function(){}},
-BB:{
+HU5:{
 "^":"a;",
-Zo:function(a){var z
+tf:function(a){var z
 if(H.vM(a))return this.Pq(a)
 this.mR.CH(0)
 z=null
@@ -1073,7 +987,7 @@
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
-"^":"BB;",
+"^":"HU5;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x,w
 z=this.mR.t(0,a)
@@ -1098,12 +1012,12 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 RK:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,78,79,"call"],
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,77,78,"call"],
 $isEH:true},
 hz:{
-"^":"BB;",
+"^":"HU5;",
 Pq:function(a){return a},
 wb:function(a){var z,y
 z=this.mR.t(0,a)
@@ -1171,40 +1085,48 @@
 PR:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
 "^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+ed:function(){if(self.setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.p9==null)return
 H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
+var z=this.p9
+if(this.Om)self.clearTimeout(z)
+else self.clearInterval(z)
 this.p9=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.GL
+this.p9=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
 else z=!1
 if(z){this.p9=1
 z=init.globalState.Xz
 y=init.globalState.N0
 z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+this.zu=!0}else if(self.setTimeout!=null){++init.globalState.Xz.GL
+this.p9=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+z.WI(a,b)
 return z}}},
 Av:{
-"^":"TpZ:18;a,b",
+"^":"TpZ:17;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 vt:{
-"^":"TpZ:18;c,d",
+"^":"TpZ:17;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;qK>",
+DH:{
+"^":"TpZ:74;a,b",
+$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kuS:{
+"^":"a;x6>",
 giO:function(a){var z,y,x
-z=this.qK
+z=this.x6
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1217,10 +1139,10 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
+if(!!J.x(b).$iskuS){z=this.x6
+y=b.x6
 return z==null?y==null:z===y}return!1},
-$isiV:true,
+$iskuS:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
@@ -1237,7 +1159,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1278,8 +1200,19 @@
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-Ao:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
+Qn:[function(){return Date.now()},"$0","EY",0,0,4],
+PA:function(){var z,y
+if($.zIm!=null)return
+$.zIm=1000
+$.lEO=H.EY()
+if(typeof window=="undefined")return
+z=window
+if(z==null)return
+y=z.performance
+if(y==null)return
+if(typeof y.now!="function")return
+$.zIm=1000000
+$.lEO=new H.aH8(y)},
 RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
@@ -1368,7 +1301,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
@@ -1422,7 +1355,7 @@
 else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1491,7 +1424,7 @@
 rm:function(a,b,c,d){var z,y
 z=H.uj
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1532,7 +1465,7 @@
 ag:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Hs(z)
 return new H.fw(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
@@ -1577,7 +1510,7 @@
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
 return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+IGs:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
 IU:function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
@@ -1651,7 +1584,7 @@
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
-Xn:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Gz:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1710,7 +1643,7 @@
 z["+"+v]=s
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
+z=C.GM()
 z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
@@ -1750,7 +1683,7 @@
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
 gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
 u:function(a,b,c){return this.EP()},
 Rz:function(a,b){return this.EP()},
@@ -1774,8 +1707,8 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Oq(this,0),H.Oq(this,1))},
 $isyN:true},
 hY:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,78,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1831,8 +1764,7 @@
 x=P.Fl(P.qU,P.KN)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
-y=x.gvc(x)
-y=P.F(y,!0,H.ip(y,"mW",0))
+y=x.gvc(x).br(0)
 H.rd(y,null)
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
@@ -1846,7 +1778,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"TpZ:5;a,b,c",
+"^":"TpZ:3;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1854,15 +1786,19 @@
 if(y>=z.length)return H.e(z,y)
 z[y]=x},
 $isEH:true},
+aH8:{
+"^":"TpZ:74;a",
+$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
+$isEH:true},
 Cj:{
-"^":"TpZ:81;a,b,c",
+"^":"TpZ:80;a,b,c",
 $2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"TpZ:81;a,b",
+"^":"TpZ:80;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(0,a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1899,7 +1835,7 @@
 "^":"XS;K9,Ga",
 bu:[function(a){var z=this.Ga
 if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,69],
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,71],
 $isJS:true,
 $isXS:true},
 u0:{
@@ -1909,7 +1845,7 @@
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.cR
 if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,69],
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,71],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1920,13 +1856,13 @@
 vV:{
 "^":"XS;K9",
 bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,69]},
+return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
 Am:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-XO:{
+oP:{
 "^":"a;lA,ui",
 bu:[function(a){var z,y
 z=this.ui
@@ -1935,30 +1871,30 @@
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
 this.ui=z
-return z},"$0","gAY",0,0,69]},
+return z},"$0","gAY",0,0,71]},
 dr:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"TpZ:72;b,c",
+"^":"TpZ:74;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"TpZ:72;d,e,f",
+"^":"TpZ:74;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"TpZ:72;UI,bK,Gq,Rm",
+"^":"TpZ:74;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"TpZ:72;w3,HZ,mG,xC,cj",
+"^":"TpZ:74;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 TpZ:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gAY",0,0,69],
+bu:[function(a){return"Closure"},"$0","gAY",0,0,71],
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
@@ -1986,13 +1922,13 @@
 if(z[v]===a)return v}}}},
 Pe:{
 "^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return this.G1},"$0","gAY",0,0,71],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 bb:{
 "^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,69],
-static:{Yi:function(a){return new H.bb(a)}}},
+bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -2030,7 +1966,7 @@
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gAY",0,0,69],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gAY",0,0,71],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -2038,17 +1974,17 @@
 return z}}},
 hJ:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gAY",0,0,69],
+bu:[function(a){return"dynamic"},"$0","gAY",0,0,71],
 za:function(){return},
 $ishJ:true},
-tu:{
+Hs:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gAY",0,0,69]},
+bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
 fw:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
@@ -2061,7 +1997,7 @@
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.uG(this.re,", ")+">"},"$0","gAY",0,0,69]},
+bu:[function(a){return H.d(this.oc)+"<"+J.xp(this.re,", ")+">"},"$0","gAY",0,0,71]},
 cu:{
 "^":"a;LU,ke",
 bu:[function(a){var z,y
@@ -2069,22 +2005,22 @@
 if(z!=null)return z
 y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
-return y},"$0","gAY",0,0,69],
+return y},"$0","gAY",0,0,71],
 giO:function(a){return J.v1(this.LU)},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"TpZ:82;b",
+"^":"TpZ:81;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
-"^":"TpZ:5;c",
+"^":"TpZ:3;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
@@ -2134,7 +2070,7 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSP:true,
+$iswL:true,
 static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2182,26 +2118,26 @@
 $isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
+"^":"LPc;IF,Qw,cw,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+gv8:function(a){return a.IF},
+sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
+gFR:function(a){return a.Qw},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-F6:[function(a,b,c,d){var z=a.fi
+sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
+gph:function(a){return a.cw},
+sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+F6:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
-if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,83,46,47,84],
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,82,49,50,83],
 static:{zy:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
+a.IF=!1
+a.Qw=null
+a.cw="action"
 a.Cc=[]
 a.q1=!1
 a.oG=!1
@@ -2214,17 +2150,17 @@
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.Si(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
-Xk:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,12,13],
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
 return C.xr.kV(z)},
 FI:function(a){if(a==null)return P.Vu(null,null,null)
@@ -2240,7 +2176,7 @@
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","xK",2,0,15],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","HH",2,0,14],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2251,12 +2187,12 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-As:[function(a){var z=J.Wx(a)
+Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return C.CD.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","p0",2,0,15,16],
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2281,7 +2217,7 @@
 z=b.gG2()
 H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gbf())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gXa())}this.Eh=b},
+H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gVG())}this.Eh=b},
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
 gvK:function(){return this.cC},
@@ -2300,10 +2236,10 @@
 z.Cy()},
 x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
 yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,85,24],
+this.og("error/",null)},"$1","gbf",2,0,84,23],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,86,87],
+else this.og("error/",null)},"$1","gVG",2,0,85,86],
 og:function(a,b){var z,y,x,w,v
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 for(y=this.OJ,x=0;x<y.length;++x){w=y[x]
@@ -2319,7 +2255,7 @@
 if(J.xC(this.Ef,a))return
 if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
 this.Ef.oV()
-J.r4(this.bn)}N.QM("").To("Installing page: "+H.d(a))
+J.qv(this.bn)}N.QM("").To("Installing page: "+H.d(a))
 try{a.ci()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}this.bn.appendChild(a.gyF())
@@ -2328,10 +2264,10 @@
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
 this.nq(this,w)}this.Ef=x},
-ab:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,88,89],
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
 aO:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,88,89],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
 Ty:function(a){var z=this.m2.TY
 z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -2344,13 +2280,13 @@
 this.AQ(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"TpZ:90;",
+"^":"TpZ:89;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,91,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 Kf:{
 "^":"a;KJ",
@@ -2392,12 +2328,12 @@
 this.bo(0,z)
 y.e6(a)}},
 ng:{
-"^":"yVe;MP,ec,c5,ro,dUC,pt",
+"^":"yVe;MP,ec,c5,ro,fb,pt",
 Cy:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,92,14],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
@@ -2414,12 +2350,12 @@
 this.i6.Eh.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
 VU:function(a){return!0}},
 mo:{
-"^":"TpZ:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,93,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Go5:{
-"^":"TpZ:13;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
 "^":"OS;i6,yF,fz,AP,fn",
@@ -2430,13 +2366,13 @@
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
 Za:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,94,"call"],
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ha:{
-"^":"TpZ:13;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Sy:{
 "^":"OS;i6,yF,fz,AP,fn",
@@ -2455,9 +2391,9 @@
 VU:function(a){return J.co(a,"vm-connect/")}},
 ut:{
 "^":"a;IU",
-cv:function(a){return G.Xk(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
-"^":"TpZ:5;",
+"^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
 z=C.xr.kV(a)
 if(z==null)return z
@@ -2466,14 +2402,14 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,95,"call"],
+y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 XN:{
-"^":"TpZ:13;",
-$1:[function(a){},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,jY>,TY,ro,dUC,pt",
+"^":"d3;wu,jY>,TY,ro,fb,pt",
 BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
@@ -2507,7 +2443,7 @@
 UJ:function(){var z,y,x,w,v
 z=this.jY
 z.V1(z)
-y=G.Xk(this.wu.IU+".history")
+y=G.DUC(this.wu.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2516,17 +2452,17 @@
 if(!(w<v))break
 x.u(y,w,U.K9(x.t(y,w)));++w}z.FV(0,y)
 this.XT()},
-Ff:function(){this.UJ()
+XA:function(){this.UJ()
 var z=this.TP(this.BZ())
 this.TY=z
 this.h(0,z)},
 static:{"^":"dI"}},
 Un:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"TpZ:96;",
+"^":"TpZ:95;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2544,7 +2480,7 @@
 return this.yq},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-iY:{
+xK:{
 "^":"Pi;vp>,AP,fn",
 mA:function(a){var z,y
 z=this.vp
@@ -2556,7 +2492,7 @@
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.kJ(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.oF(z,y.kJ(z,x)+1,J.Mx(x))
 else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
@@ -2569,12 +2505,12 @@
 v=w.kJ(z,a)+1
 w.UZ(z,v,v+y)}},
 Kt:{
-"^":"a;ph>,OV<",
-static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,17]}},
+"^":"a;ph>,xy<",
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,16]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
-lg:{
+Vz:{
 "^":"Pi;oH<,vp>,zz<",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
@@ -2584,15 +2520,17 @@
 F.Wi(this,C.JB,0,1)},
 eE:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
+return J.UQ(J.U8(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,97],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,97],
+return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gCa",4,0,96],
 Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
+H.PA()
+$.xj=$.zIm
+new P.VV(null,null).wE(0)
 z=this.zz
 if(this.jV){y=this.gpPX()
-H.rd(z,y)}else{y=this.gPd()
+H.rd(z,y)}else{y=this.gCa()
 H.rd(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
@@ -2602,17 +2540,17 @@
 Gu:function(a,b){var z,y
 z=this.vp
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
+y=J.UQ(J.U8(z[a]),b)
 z=this.oH
 if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
+return z[b].gxy().$1(y)},
 YU:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,98]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,97]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
 z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.qt,new E.e6(),C.p1,new E.e7(),C.yJ,new E.e8(),C.la,new E.e9(),C.yL,new E.e10(),C.bJ,new E.e11(),C.ox,new E.e12(),C.Je,new E.e13(),C.kI,new E.e14(),C.vY,new E.e15(),C.Rs,new E.e16(),C.Lw,new E.e17(),C.eR,new E.e18(),C.iE,new E.e19(),C.f4,new E.e20(),C.VK,new E.e21(),C.aH,new E.e22(),C.aK,new E.e23(),C.GP,new E.e24(),C.vs,new E.e25(),C.Gr,new E.e26(),C.TU,new E.e27(),C.Fe,new E.e28(),C.tP,new E.e29(),C.yh,new E.e30(),C.Zb,new E.e31(),C.u7,new E.e32(),C.p8,new E.e33(),C.qR,new E.e34(),C.ld,new E.e35(),C.ne,new E.e36(),C.B0,new E.e37(),C.r1,new E.e38(),C.mr,new E.e39(),C.Ek,new E.e40(),C.Pn,new E.e41(),C.YT,new E.e42(),C.h7,new E.e43(),C.R3,new E.e44(),C.WQ,new E.e45(),C.fV,new E.e46(),C.jU,new E.e47(),C.OO,new E.e48(),C.Mc,new E.e49(),C.FP,new E.e50(),C.kF,new E.e51(),C.UD,new E.e52(),C.Aq,new E.e53(),C.DS,new E.e54(),C.C9,new E.e55(),C.VF,new E.e56(),C.uU,new E.e57(),C.YJ,new E.e58(),C.eF,new E.e59(),C.oI,new E.e60(),C.ST,new E.e61(),C.QH,new E.e62(),C.qX,new E.e63(),C.rE,new E.e64(),C.nf,new E.e65(),C.EI,new E.e66(),C.JB,new E.e67(),C.RY,new E.e68(),C.d4,new E.e69(),C.cF,new E.e70(),C.SI,new E.e71(),C.zS,new E.e72(),C.YA,new E.e73(),C.Ge,new E.e74(),C.A7,new E.e75(),C.He,new E.e76(),C.im,new E.e77(),C.Ss,new E.e78(),C.k6,new E.e79(),C.oj,new E.e80(),C.PJ,new E.e81(),C.q2,new E.e82(),C.d2,new E.e83(),C.kN,new E.e84(),C.fn,new E.e85(),C.yB,new E.e86(),C.eJ,new E.e87(),C.iG,new E.e88(),C.Py,new E.e89(),C.pC,new E.e90(),C.uu,new E.e91(),C.qs,new E.e92(),C.XH,new E.e93(),C.tJ,new E.e94(),C.F8,new E.e95(),C.C1,new E.e96(),C.Nr,new E.e97(),C.nL,new E.e98(),C.a0,new E.e99(),C.Yg,new E.e100(),C.bR,new E.e101(),C.ai,new E.e102(),C.ob,new E.e103(),C.MY,new E.e104(),C.Iv,new E.e105(),C.Wg,new E.e106(),C.tD,new E.e107(),C.nZ,new E.e108(),C.Of,new E.e109(),C.Vl,new E.e110(),C.pY,new E.e111(),C.XL,new E.e112(),C.LA,new E.e113(),C.AT,new E.e114(),C.Lk,new E.e115(),C.dK,new E.e116(),C.xf,new E.e117(),C.rB,new E.e118(),C.bz,new E.e119(),C.Jx,new E.e120(),C.b5,new E.e121(),C.Lc,new E.e122(),C.hf,new E.e123(),C.uk,new E.e124(),C.Zi,new E.e125(),C.TN,new E.e126(),C.GI,new E.e127(),C.Wn,new E.e128(),C.ur,new E.e129(),C.VN,new E.e130(),C.EV,new E.e131(),C.VI,new E.e132(),C.eh,new E.e133(),C.SA,new E.e134(),C.kV,new E.e135(),C.vp,new E.e136(),C.cc,new E.e137(),C.DY,new E.e138(),C.Lx,new E.e139(),C.M3,new E.e140(),C.wT,new E.e141(),C.JK,new E.e142(),C.SR,new E.e143(),C.t6,new E.e144(),C.rP,new E.e145(),C.pX,new E.e146(),C.VD,new E.e147(),C.NN,new E.e148(),C.UX,new E.e149(),C.YS,new E.e150(),C.pu,new E.e151(),C.BJ,new E.e152(),C.c6,new E.e153(),C.td,new E.e154(),C.Gn,new E.e155(),C.zO,new E.e156(),C.vg,new E.e157(),C.YV,new E.e158(),C.If,new E.e159(),C.Ys,new E.e160(),C.zm,new E.e161(),C.nX,new E.e162(),C.xP,new E.e163(),C.XM,new E.e164(),C.Ic,new E.e165(),C.yG,new E.e166(),C.uI,new E.e167(),C.O9,new E.e168(),C.ba,new E.e169(),C.tW,new E.e170(),C.CG,new E.e171(),C.Wj,new E.e172(),C.vb,new E.e173(),C.UL,new E.e174(),C.AY,new E.e175(),C.QK,new E.e176(),C.AO,new E.e177(),C.Xd,new E.e178(),C.I7,new E.e179(),C.kY,new E.e180(),C.Wm,new E.e181(),C.GR,new E.e182(),C.KX,new E.e183(),C.ja,new E.e184(),C.Dj,new E.e185(),C.ir,new E.e186(),C.dx,new E.e187(),C.ni,new E.e188(),C.X2,new E.e189(),C.F3,new E.e190(),C.UY,new E.e191(),C.Aa,new E.e192(),C.nY,new E.e193(),C.tg,new E.e194(),C.HD,new E.e195(),C.iU,new E.e196(),C.eN,new E.e197(),C.ue,new E.e198(),C.nh,new E.e199(),C.L2,new E.e200(),C.Gs,new E.e201(),C.bE,new E.e202(),C.YD,new E.e203(),C.PX,new E.e204(),C.N8,new E.e205(),C.EA,new E.e206(),C.oW,new E.e207(),C.hd,new E.e208(),C.pH,new E.e209(),C.Ve,new E.e210(),C.jM,new E.e211(),C.W5,new E.e212(),C.uX,new E.e213(),C.nt,new E.e214(),C.IT,new E.e215(),C.li,new E.e216(),C.PM,new E.e217(),C.k5,new E.e218(),C.Nv,new E.e219(),C.Cw,new E.e220(),C.TW,new E.e221(),C.xS,new E.e222(),C.ft,new E.e223(),C.QF,new E.e224(),C.mi,new E.e225(),C.zz,new E.e226(),C.hO,new E.e227(),C.ei,new E.e228(),C.HK,new E.e229(),C.je,new E.e230(),C.Ef,new E.e231(),C.QL,new E.e232(),C.RH,new E.e233(),C.Q1,new E.e234(),C.ID,new E.e235(),C.z6,new E.e236(),C.bc,new E.e237(),C.kw,new E.e238(),C.ep,new E.e239(),C.J2,new E.e240(),C.zU,new E.e241(),C.OU,new E.e242(),C.bn,new E.e243(),C.mh,new E.e244(),C.Fh,new E.e245(),C.yv,new E.e246(),C.LP,new E.e247(),C.jh,new E.e248(),C.fj,new E.e249(),C.xw,new E.e250(),C.zn,new E.e251(),C.RJ,new E.e252(),C.Tc,new E.e253(),C.YE,new E.e254(),C.Uy,new E.e255()],null,null)
@@ -2625,1881 +2563,1881 @@
 $.qe=v
 $.M6=[new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446()]
 $.UG=!0
-F.E2()},"$0","V7A",0,0,18],
+F.E2()},"$0","jk",0,0,17],
 em:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.r0(a)},
 $isEH:true},
 ed:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 wa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gA3()},
 $isEH:true},
 Or:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqZ()},
 $isEH:true},
 YL:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 wf:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gQ1()},
 $isEH:true},
 Oa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 emv:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 Lbd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gfj()},
 $isEH:true},
 QAa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 CvS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gCs()},
 $isEH:true},
 edy:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 waE:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Ore:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 YLa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.hn(a)},
 $isEH:true},
 wfa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.HP(a)},
 $isEH:true},
 Oaa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zF(a)},
 $isEH:true},
 e0:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 e1:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Uf(a)},
 $isEH:true},
 e2:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.RC(a)},
 $isEH:true},
 e3:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gaP()},
 $isEH:true},
 e4:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.E3(a)},
 $isEH:true},
 e5:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.on(a)},
 $isEH:true},
 e6:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.SM(a)},
 $isEH:true},
 e7:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.goH()},
 $isEH:true},
 e8:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mh(a)},
 $isEH:true},
 e9:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jO(a)},
 $isEH:true},
 e10:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xe(a)},
 $isEH:true},
 e11:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.OT(a)},
 $isEH:true},
 e12:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ok(a)},
 $isEH:true},
 e13:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gl()},
 $isEH:true},
 e14:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.h6(a)},
 $isEH:true},
 e15:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jr(a)},
 $isEH:true},
 e16:{
-"^":"TpZ:13;",
-$1:function(a){return J.P3(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.Cg(a)},
 $isEH:true},
 e17:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.o4(a)},
 $isEH:true},
 e18:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guh()},
 $isEH:true},
 e19:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gP9()},
 $isEH:true},
 e20:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guH()},
 $isEH:true},
 e21:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.mP(a)},
 $isEH:true},
 e22:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.BT(a)},
 $isEH:true},
 e23:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.vi(a)},
 $isEH:true},
 e24:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nq(a)},
 $isEH:true},
 e25:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.k0(a)},
 $isEH:true},
 e26:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.rw(a)},
 $isEH:true},
 e27:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.lk(a)},
 $isEH:true},
 e28:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gej()},
 $isEH:true},
 e29:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gw2()},
 $isEH:true},
 e30:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.w8(a)},
 $isEH:true},
 e31:{
-"^":"TpZ:13;",
-$1:function(a){return J.is(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.zk(a)},
 $isEH:true},
 e32:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.kv(a)},
 $isEH:true},
 e33:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.a3(a)},
 $isEH:true},
 e34:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ts(a)},
 $isEH:true},
 e35:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ky(a)},
 $isEH:true},
 e36:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.io(a)},
 $isEH:true},
 e37:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.kE(a)},
 $isEH:true},
 e38:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Gl(a)},
 $isEH:true},
 e39:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mz(a)},
 $isEH:true},
 e40:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nb(a)},
 $isEH:true},
 e41:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gty()},
 $isEH:true},
 e42:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yn(a)},
 $isEH:true},
 e43:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gMX()},
 $isEH:true},
 e44:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gx5()},
 $isEH:true},
 e45:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pm(a)},
 $isEH:true},
 e46:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gtJ()},
 $isEH:true},
 e47:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ec(a)},
 $isEH:true},
 e48:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ra(a)},
 $isEH:true},
 e49:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.YH(a)},
 $isEH:true},
 e50:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.WX(a)},
 $isEH:true},
 e51:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.IP(a)},
 $isEH:true},
 e52:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZd()},
 $isEH:true},
 e53:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.TM(a)},
 $isEH:true},
 e54:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xo(a)},
 $isEH:true},
 e55:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gkA()},
 $isEH:true},
 e56:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gGK()},
 $isEH:true},
 e57:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gan()},
 $isEH:true},
 e58:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gcQ()},
 $isEH:true},
 e59:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gS7()},
 $isEH:true},
 e60:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJz()},
 $isEH:true},
 e61:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.PY(a)},
 $isEH:true},
 e62:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.bu(a)},
 $isEH:true},
 e63:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.VL(a)},
 $isEH:true},
 e64:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zN(a)},
 $isEH:true},
 e65:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.m4(a)},
 $isEH:true},
 e66:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gmu()},
 $isEH:true},
 e67:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gCO()},
 $isEH:true},
 e68:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.MB(a)},
 $isEH:true},
 e69:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.eU(a)},
 $isEH:true},
 e70:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.DB(a)},
 $isEH:true},
 e71:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gGf()},
 $isEH:true},
 e72:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvS()},
 $isEH:true},
 e73:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJL()},
 $isEH:true},
 e74:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Er(a)},
 $isEH:true},
 e75:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.OB(a)},
 $isEH:true},
 e76:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.YQ(a)},
 $isEH:true},
 e77:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.tC(a)},
 $isEH:true},
 e78:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gu9()},
 $isEH:true},
 e79:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aW(a)},
 $isEH:true},
 e80:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aB(a)},
 $isEH:true},
 e81:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gL4()},
 $isEH:true},
 e82:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gaj()},
 $isEH:true},
 e83:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giq()},
 $isEH:true},
 e84:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gBm()},
 $isEH:true},
 e85:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xR(a)},
 $isEH:true},
 e86:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.US(a)},
 $isEH:true},
 e87:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gNI()},
 $isEH:true},
 e88:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gva()},
 $isEH:true},
 e89:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gKt()},
 $isEH:true},
 e90:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gp2()},
 $isEH:true},
 e91:{
-"^":"TpZ:13;",
-$1:function(a){return J.UU(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.IA(a)},
 $isEH:true},
 e92:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ew(a)},
 $isEH:true},
 e93:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVM()},
 $isEH:true},
 e94:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Xi(a)},
 $isEH:true},
 e95:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.bL(a)},
 $isEH:true},
 e96:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUB()},
 $isEH:true},
 e97:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gRs()},
 $isEH:true},
 e98:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ix(a)},
 $isEH:true},
 e99:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gni()},
 $isEH:true},
 e100:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqy()},
 $isEH:true},
 e101:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.wz(a)},
 $isEH:true},
 e102:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.FN(a)},
 $isEH:true},
 e103:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Wk(a)},
 $isEH:true},
 e104:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gho()},
 $isEH:true},
 e105:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.eT(a)},
 $isEH:true},
 e106:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.C8(a)},
 $isEH:true},
 e107:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.tf(a)},
 $isEH:true},
 e108:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pO(a)},
 $isEH:true},
 e109:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cU(a)},
 $isEH:true},
 e110:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gW1()},
 $isEH:true},
 e111:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYG()},
 $isEH:true},
 e112:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gi2()},
 $isEH:true},
 e113:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gHY()},
 $isEH:true},
 e114:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gFo()},
 $isEH:true},
 e115:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.j0(a)},
 $isEH:true},
 e116:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ZN(a)},
 $isEH:true},
 e117:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xa(a)},
 $isEH:true},
 e118:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aT(a)},
 $isEH:true},
 e119:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.KG(a)},
 $isEH:true},
 e120:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giR()},
 $isEH:true},
 e121:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEB()},
 $isEH:true},
 e122:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Iz(a)},
 $isEH:true},
 e123:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Yq(a)},
 $isEH:true},
 e124:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uY(a)},
 $isEH:true},
 e125:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.X7(a)},
 $isEH:true},
 e126:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.IR(a)},
 $isEH:true},
 e127:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gPE()},
 $isEH:true},
 e128:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.q8(a)},
 $isEH:true},
 e129:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.ghX()},
 $isEH:true},
 e130:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvU()},
 $isEH:true},
 e131:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jl(a)},
 $isEH:true},
 e132:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gRd()},
 $isEH:true},
 e133:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zY(a)},
 $isEH:true},
 e134:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.de(a)},
 $isEH:true},
 e135:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ds(a)},
 $isEH:true},
 e136:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cO(a)},
 $isEH:true},
 e137:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gzM()},
 $isEH:true},
 e138:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gMN()},
 $isEH:true},
 e139:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giP()},
 $isEH:true},
 e140:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gmd()},
 $isEH:true},
 e141:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.geH()},
 $isEH:true},
 e142:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yc(a)},
 $isEH:true},
 e143:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Yf(a)},
 $isEH:true},
 e144:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zq(a)},
 $isEH:true},
 e145:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ih(a)},
 $isEH:true},
 e146:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.z2(a)},
 $isEH:true},
 e147:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ZF(a)},
 $isEH:true},
 e148:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Lh(a)},
 $isEH:true},
 e149:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zv(a)},
 $isEH:true},
 e150:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.O6(a)},
 $isEH:true},
 e151:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Pf(a)},
 $isEH:true},
 e152:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUY()},
 $isEH:true},
 e153:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvK()},
 $isEH:true},
 e154:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jj(a)},
 $isEH:true},
 e155:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.t8(a)},
 $isEH:true},
 e156:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gL1()},
 $isEH:true},
 e157:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gxQ()},
 $isEH:true},
 e158:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEl()},
 $isEH:true},
 e159:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gxH()},
 $isEH:true},
 e160:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ee(a)},
 $isEH:true},
 e161:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.JG(a)},
 $isEH:true},
 e162:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Lp(a)},
 $isEH:true},
 e163:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.z1(a)},
 $isEH:true},
 e164:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.AF(a)},
 $isEH:true},
 e165:{
-"^":"TpZ:13;",
-$1:function(a){return J.fi(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e166:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Kl(a)},
 $isEH:true},
 e167:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gU6()},
 $isEH:true},
 e168:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cj(a)},
 $isEH:true},
 e169:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.br(a)},
 $isEH:true},
 e170:{
-"^":"TpZ:13;",
-$1:function(a){return J.PB(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.jL(a)},
 $isEH:true},
 e171:{
-"^":"TpZ:13;",
-$1:function(a){return J.fy(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.L6(a)},
 $isEH:true},
 e172:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Qa(a)},
 $isEH:true},
 e173:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ks(a)},
 $isEH:true},
 e174:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.CN(a)},
 $isEH:true},
 e175:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ql(a)},
 $isEH:true},
 e176:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ul(a)},
 $isEH:true},
 e177:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUx()},
 $isEH:true},
 e178:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.id(a)},
 $isEH:true},
 e179:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gm8()},
 $isEH:true},
 e180:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.BZ(a)},
 $isEH:true},
 e181:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.H1(a)},
 $isEH:true},
 e182:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Cm(a)},
 $isEH:true},
 e183:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.fU(a)},
 $isEH:true},
 e184:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.GH(a)},
 $isEH:true},
 e185:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.n8(a)},
 $isEH:true},
 e186:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gLc()},
 $isEH:true},
 e187:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gNS()},
 $isEH:true},
 e188:{
-"^":"TpZ:13;",
-$1:function(a){return a.gzK()},
+"^":"TpZ:12;",
+$1:function(a){return a.gVI()},
 $isEH:true},
 e189:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.iL(a)},
 $isEH:true},
 e190:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.k7(a)},
 $isEH:true},
 e191:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uW(a)},
 $isEH:true},
 e192:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.W2(a)},
 $isEH:true},
 e193:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UT(a)},
 $isEH:true},
 e194:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Kd(a)},
 $isEH:true},
 e195:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pU(a)},
 $isEH:true},
 e196:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Tg(a)},
 $isEH:true},
 e197:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVc()},
 $isEH:true},
 e198:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gpF()},
 $isEH:true},
 e199:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.TY(a)},
 $isEH:true},
 e200:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gA6()},
 $isEH:true},
 e201:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ry(a)},
 $isEH:true},
 e202:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UP(a)},
 $isEH:true},
 e203:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UA(a)},
 $isEH:true},
 e204:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zH(a)},
 $isEH:true},
 e205:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zs(a)},
 $isEH:true},
 e206:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gXR()},
 $isEH:true},
 e207:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.NB(a)},
 $isEH:true},
 e208:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gzS()},
 $isEH:true},
 e209:{
-"^":"TpZ:13;",
-$1:function(a){return J.U8(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.Cr(a)},
 $isEH:true},
 e210:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.oN(a)},
 $isEH:true},
 e211:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gV8()},
 $isEH:true},
 e212:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gp8()},
 $isEH:true},
 e213:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.F9(a)},
 $isEH:true},
 e214:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.HB(a)},
 $isEH:true},
 e215:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yI(a)},
 $isEH:true},
 e216:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jx(a)},
 $isEH:true},
 e217:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jB(a)},
 $isEH:true},
 e218:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gS5()},
 $isEH:true},
 e219:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gDo()},
 $isEH:true},
 e220:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guj()},
 $isEH:true},
 e221:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.j1(a)},
 $isEH:true},
 e222:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Aw(a)},
 $isEH:true},
 e223:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.l2(a)},
 $isEH:true},
 e224:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gm2()},
 $isEH:true},
 e225:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.dY(a)},
 $isEH:true},
 e226:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yq(a)},
 $isEH:true},
 e227:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gki()},
 $isEH:true},
 e228:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZn()},
 $isEH:true},
 e229:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvs()},
 $isEH:true},
 e230:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVh()},
 $isEH:true},
 e231:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZX()},
 $isEH:true},
 e232:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Rg(a)},
 $isEH:true},
 e233:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.d5(a)},
 $isEH:true},
 e234:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.SG(a)},
 $isEH:true},
 e235:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cs(a)},
 $isEH:true},
 e236:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVF()},
 $isEH:true},
 e237:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gkw()},
 $isEH:true},
 e238:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.K2(a)},
 $isEH:true},
 e239:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uy(a)},
 $isEH:true},
 e240:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEy()},
 $isEH:true},
 e241:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.XJ(a)},
 $isEH:true},
 e242:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gjW()},
 $isEH:true},
 e243:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.P4(a)},
 $isEH:true},
 e244:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJk()},
 $isEH:true},
 e245:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Q2(a)},
 $isEH:true},
 e246:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gSu()},
 $isEH:true},
 e247:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gSU()},
 $isEH:true},
 e248:{
-"^":"TpZ:13;",
-$1:function(a){return a.gXA()},
+"^":"TpZ:12;",
+$1:function(a){return a.gFc()},
 $isEH:true},
 e249:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYY()},
 $isEH:true},
 e250:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZ3()},
 $isEH:true},
 e251:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ry(a)},
 $isEH:true},
 e252:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.I2(a)},
 $isEH:true},
 e253:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gTX()},
 $isEH:true},
 e254:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.NC(a)},
 $isEH:true},
 e255:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gV0()},
 $isEH:true},
 e256:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e257:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e258:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NV(a,b)},
 $isEH:true},
 e259:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e260:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e261:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e262:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e263:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e264:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e265:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e266:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e267:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e268:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e269:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e270:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Jl(a,b)},
 $isEH:true},
 e271:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.TP(a,b)},
 $isEH:true},
 e272:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e273:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.au(a,b)},
 $isEH:true},
 e274:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e275:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e276:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sej(b)},
 $isEH:true},
 e277:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sw2(b)},
 $isEH:true},
 e278:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e279:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e280:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e281:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e282:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e283:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e284:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e285:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e286:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e287:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e288:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e289:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e290:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e291:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e292:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e293:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e294:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.OE(a,b)},
 $isEH:true},
 e295:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e296:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e297:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.siq(b)},
 $isEH:true},
 e298:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e299:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e300:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sKt(b)},
 $isEH:true},
 e301:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e302:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e303:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e304:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e305:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e306:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e307:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e308:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.shX(b)},
 $isEH:true},
 e309:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e310:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ql(a,b)},
 $isEH:true},
 e311:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e312:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e313:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e314:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e315:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e316:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e317:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e318:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.svK(b)},
 $isEH:true},
 e319:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e320:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sL1(b)},
 $isEH:true},
 e321:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sEl(b)},
 $isEH:true},
 e322:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sxH(b)},
 $isEH:true},
 e323:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e324:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.A1(a,b)},
 $isEH:true},
 e325:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e326:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e327:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e328:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e329:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e330:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e331:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e332:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e333:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e334:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e335:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e336:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e337:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e338:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e339:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e340:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e341:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e342:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e343:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e344:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e345:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sVc(b)},
 $isEH:true},
 e346:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.By(a,b)},
 $isEH:true},
 e347:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e348:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uH(a,b)},
 $isEH:true},
 e349:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e350:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e351:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e352:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sV8(b)},
 $isEH:true},
 e353:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e354:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e355:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wu(a,b)},
 $isEH:true},
 e356:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e357:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sDo(b)},
 $isEH:true},
 e358:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.suj(b)},
 $isEH:true},
 e359:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e360:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e361:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e362:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.my(a,b)},
 $isEH:true},
 e363:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sVF(b)},
 $isEH:true},
 e364:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e365:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e366:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sjW(b)},
 $isEH:true},
 e367:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e368:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e369:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e370:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e371:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e372:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e373:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e374:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e375:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e376:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e377:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e378:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e379:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e380:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e381:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e382:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e383:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e384:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e385:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e386:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e387:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":"pv;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,98],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4512,7 +4450,7 @@
 C.Mw.ZL(a)
 C.Mw.XI(a)
 return a}}},
-pv:{
+tu:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
@@ -4555,10 +4493,10 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.iY(z,null,null)
+a.Hm=new G.xK(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,13,57],
+GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4575,11 +4513,11 @@
 w.push(s)
 a.Hm.mA(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.XO(q,null)
+x=new H.oP(q,null)
 N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,100,101],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,100,101],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4589,8 +4527,8 @@
 if(typeof v!=="number")return v.W()
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,102,1,103,104],
+x=new H.oP(u,null)
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4607,8 +4545,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
-"^":"TpZ:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,105,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
 $isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 ak:{
@@ -4619,13 +4557,13 @@
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,106,107],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,108,109],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,108,110],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,107,108],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
 SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,99],
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,98],
 static:{lW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4642,23 +4580,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,93,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 SS:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,93,"call"],
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 VY:{
 "^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gtT:function(a){return a.tY},
 aV:[function(a,b){Q.xI.prototype.aV.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
 static:{On:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4682,7 +4620,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,98],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4692,10 +4630,10 @@
 return x},
 YI:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,112,1,103,104],
+J.Uf(z).h(0,"highlight")},"$3","gff",6,0,111,2,102,103],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,112,1,103,104],
+J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,111,2,102,103],
 static:{fm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4712,8 +4650,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"TpZ:113;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:112;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
 $isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
@@ -4729,15 +4667,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,20,57],
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
 WM:[function(a){var z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,17],
 cb:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,83,46,47,84],
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,49,50,83],
 static:{oS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4807,7 +4745,7 @@
 H.qG(a,b+y,x,a,b)
 for(z=z.gA(c);z.G();b=w){w=b+1
 C.Nm.u(a,b,z.gl())}},
-na:function(a,b,c){var z,y
+h8:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
@@ -4972,7 +4910,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5074,14 +5012,14 @@
 "^":"i1;l6,T6",
 $isyN:true},
 MH:{
-"^":"Dk;lo,OI,T6",
+"^":"Anv;lo,OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},
 gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
+$asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.$1(a)},
@@ -5093,11 +5031,11 @@
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
+gA:function(a){var z=new H.vG(J.mY(this.l6),this.T6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
-"^":"Dk;OI,T6",
+vG:{
+"^":"Anv;OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
@@ -5130,20 +5068,20 @@
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-JJ:{
+Zl:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5159,7 +5097,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+Zl;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5181,7 +5119,7 @@
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,72],
+bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
 $istx:true,
 $isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
@@ -5191,17 +5129,17 @@
 z.fixed$length=init
 return z}}],["dart.async","dart:async",,P,{
 "^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
+xg:function(){if(self.scheduleImmediate!=null)return P.vd()
 return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
+Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
+P.rT(C.ny,new P.Vq(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5229,20 +5167,10 @@
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.yK())
 $.S6=$.S6.gaw()
-throw z}},"$0","yK",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.yK())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-HT:function(a,b,c,d,e,f){return e?H.VM(new P.Mv(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+throw z}},"$0","yK",0,0,17],
+rb:function(a){var z=$.X3
+if(C.NU===z){P.Tk(null,null,C.NU,a)
+return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5255,15 +5183,15 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","C7",2,0,20,21],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,22,23,24,25],
-dL:[function(){},"$0","v3",0,0,18],
-FE:function(a,b,c){var z,y,x,w
+HC:[function(a){},"$1","C7",2,0,19,20],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,21,22,23,24],
+dL:[function(){},"$0","v3",0,0,17],
+zE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){var z=a.ed()
 if(!!J.x(z).$isb8)z.YM(new P.dR(b,c,d))
@@ -5276,40 +5204,58 @@
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
+YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
+dp:function(a,b){var z=a.gVs()
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
+HM:function(a){if(a.geT(a)==null)return
+return a.geT(a).gQc()},
+CK:[function(a,b,c,d,e){P.Tk(null,null,C.NU,new P.FO(d,e))},"$5","wLZ",10,0,25,26,27,28,23,24],
 T8:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
+return y}finally{$.X3=z}},"$4","lw",8,0,29,26,27,28,30],
 V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-w6:[function(a,b,c,d){return d},"$4","l9",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","Lm",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","oQ",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-E1:[function(a,b,c,d,e){var z
+return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
+nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
+bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
+Tk:[function(a,b,c,d){var z,y
+if(C.NU!==c)d=c.ce(d)
+z=$.k8
+if(z==null){z=new P.OM(d,null)
+$.k8=z
+$.S6=z
+$.ej().$1(P.yK())}else{y=new P.OM(d,null)
+z.aw=y
+$.k8=y}},"$4","G2",8,0,37,26,27,28,30],
+PB:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","vRP",10,0,38,26,27,28,39,40],
+PD:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.UG(e):e)},"$5","oo",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,42,26,27,28,43],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Ak",10,0,44],
+if(d==null)d=C.Kk
+else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
+else{z=P.YM(null,null,null,null,null)
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.UE(c,d,z)
+return y},"$5","H2",10,0,45,26,27,28,46,47],
 C6:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5319,7 +5265,7 @@
 Ik:{
 "^":"u2;ly"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,ly,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"Bx;Ae@,iE@,SJ@,ly,dB,o7,Bd,Lj,Gv,lz,Ri",
 gly:function(){return this.ly},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -5336,8 +5282,8 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+uO:[function(){},"$0","gp4",0,0,17],
+LP:[function(){},"$0","gZ9",0,0,17],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
@@ -5354,14 +5300,16 @@
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.v3())
+oD:function(a,b,c,d){var z,y,x
+if((this.Gv&4)!==0){if(c==null)c=P.v3()
+z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.yc()
 return z}z=$.X3
-y=a?1:0
+y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
+x.aA(a,b,c,d,H.Oq(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5375,15 +5323,15 @@
 j0:function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
+if((this.Gv&2)===0&&this.iE===this)this.Of()}return},
 mO:function(a){},
 m4:function(a){},
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},114],
-js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,115,23,24,25],
+this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
+ld:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,114,22,23,24],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5437,17 +5385,17 @@
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
 $1:function(a){a.Qj()},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
@@ -5462,16 +5410,16 @@
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
-"^":"TpZ:72;a,b",
+Vq:{
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 mQ:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5479,10 +5427,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,116,117,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
 $isEH:true},
 Tw:{
-"^":"TpZ:118;a,c,d",
+"^":"TpZ:117;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5492,7 +5440,7 @@
 x[w]=a
 if(y===0){z=z.a.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
+z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 A5:{
 "^":"a;",
@@ -5504,14 +5452,14 @@
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,119,23,21],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,115,23,24,25]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,22,23,24]},
 Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
+"^":"a;Gv,Lj<,jk,BQ@,OY?,As?,qV?,o4?",
 gcg:function(){return this.Gv>=4},
 gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
@@ -5566,7 +5514,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,22,23,24,25],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Qp","$2","$1","gaq",2,2,21,22,23,24],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
@@ -5619,6 +5567,10 @@
 if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
 if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
 if(s!=null)$.X3=s
+b.sOY(null)
+b.sAs(null)
+b.sqV(null)
+b.so4(null)
 if(x.d)return
 if(x.b===!0){y=x.c
 y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
@@ -5635,41 +5587,41 @@
 y=b
 b=q}}}},
 da:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
-"^":"TpZ:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 vr:{
-"^":"TpZ:120;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+"^":"TpZ:119;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"TpZ:72;c,d",
+"^":"TpZ:74;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"TpZ:121;b,d,e,f",
+"^":"TpZ:120;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"TpZ:18;c,b,UI,bK",
+"^":"TpZ:17;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
@@ -5677,7 +5629,7 @@
 x=!0
 if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(q,null)
 r=J.w8(z)
 p=w
 o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
@@ -5693,7 +5645,7 @@
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(q,null)
 r=J.w8(z)
 p=t
 o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
@@ -5705,13 +5657,13 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"TpZ:18;c,b,Gq,Rm,w3",
+"^":"TpZ:17;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 if(this.Gq){v=J.w8(this.c.e.gcG())
 u=y
 u=v==null?u==null:v===u
@@ -5725,24 +5677,24 @@
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"TpZ:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,122,"call"],
+"^":"TpZ:12;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 FZ:{
-"^":"TpZ:120;a,mG",
+"^":"TpZ:119;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},123],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},123],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},122],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5759,7 +5711,7 @@
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
@@ -5778,12 +5730,6 @@
 y=P.Dt([P.xu,H.ip(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
 return y},
-gTw:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"wS",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5797,239 +5743,130 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,124,"call"],
+P.zE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-LB:{
-"^":"TpZ:72;e,f",
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+Oh:{
+"^":"TpZ:74;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
-Oh:{
-"^":"TpZ:125;a,UI",
+jvH:{
+"^":"TpZ:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
-"^":"TpZ:72;bK",
+"^":"TpZ:74;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,124,"call"],
+$1:[function(a){P.zE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"TpZ:72;e,f",
+"^":"TpZ:74;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 Jb:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"TpZ:72;UI",
+"^":"TpZ:74;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,124,"call"],
+P.zE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
-"^":"TpZ:72;e,f",
+"^":"TpZ:74;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"TpZ:125;a,UI",
+"^":"TpZ:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
-"^":"TpZ:72;bK",
+Ia:{
+"^":"TpZ:74;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"TpZ:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 uO:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
-"^":"TpZ:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Wd:{
-"^":"TpZ:72;c",
+"^":"TpZ:74;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 oY:{
 "^":"TpZ;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,114,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
-"^":"TpZ:72;c,d",
+"^":"TpZ:74;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xp:{
-"^":"TpZ;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-OC:{
-"^":"TpZ:72;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
 UH:{
 "^":"TpZ;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
+z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"TpZ:72;a,c",
-$0:[function(){var z=this.a
-if(z.b){this.c.rX(z.a)
-return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
+"^":"TpZ:74;a,c",
+$0:[function(){var z,y,x,w
+x=this.a
+if(x.b){this.c.rX(x.a)
+return}try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.c.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 yX:{
 "^":"a;",
 $isyX:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.Qk(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-SL:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-xO:function(a){var z=this.Gv
-if((z&4)!==0)return this.SL()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.SY()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.SL()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.Dn(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gQC()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.YM(this.gQC())
-v=new P.Bc(this)
-if(z!=null)z=z.YM(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"TpZ:72;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"TpZ:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-SY:function(){this.gEe().Qj()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.Dn(a,b,null))},
-SY:function(){this.gEe().w6(C.ZB)}},
-q1:{
-"^":"ZzD;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Mv:{
-"^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-MFI:{
-"^":"nR+TT;"},
 u2:{
-"^":"aN;ly",
-w4:function(a){return this.ly.ET(a)},
+"^":"ezY;",
+ht:function(a,b,c,d){return this.ly.oD(a,b,c,d)},
 giO:function(a){return(H.eQ(this.ly)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isu2)return!1
 return b.ly===this.ly},
 $isu2:true},
-yU:{
-"^":"KA;ly<,pN,o7,Bd,Lj,Gv,lz,Ri",
+Bx:{
+"^":"KA;ly<",
 tA:function(){return this.gly().j0(this)},
-uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,18]},
+uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,17],
+LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-ps:function(a){this.pN=this.Lj.wY(a)},
+"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
 fm:function(a,b){if(b==null)b=P.Xq()
 this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
 Fv:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -6039,15 +5876,14 @@
 if(z)this.Ri.t2(this)
 else{z=(this.Gv&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
+if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,17],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
-this.tk()
+this.rk()
 return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
 gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
+rk:function(){var z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0)this.Ri.IO()
 if((this.Gv&32)===0)this.Ri=null
@@ -6066,9 +5902,9 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
+uO:[function(){},"$0","gp4",0,0,17],
+LP:[function(){},"$0","gZ9",0,0,17],
+tA:function(){return},
 w6:function(a){var z,y
 z=this.Ri
 if(z==null){z=new P.Qk(null,null,0)
@@ -6079,21 +5915,21 @@
 if(y<128)this.Ri.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
-this.Lj.m1(this.pN,a)
+this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.ut((z&4)!==0)},
 pb:function(a,b){var z,y
 z=this.Gv
 y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
+this.rk()
 z=this.lz
 if(!!J.x(z).$isb8)z.YM(y)
 else y.$0()}else{y.$0()
 this.ut((z&4)!==0)}},
 SY:function(){var z,y
 z=new P.qB(this)
-this.tk()
+this.rk()
 this.Gv=(this.Gv|16)>>>0
 y=this.lz
 if(!!J.x(y).$isb8)y.YM(z)
@@ -6120,10 +5956,19 @@
 else this.LP()
 this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
 if((z&64)!==0&&z<128)this.Ri.t2(this)},
+aA:function(a,b,c,d,e){var z=this.Lj
+this.dB=z.wY(a)
+this.fm(0,b)
+this.Bd=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,bG,Q9e,Ir9,nav,Dr,JAK,vo,Pj"}},
+static:{"^":"Xx,kMJ,nS,Ir9,nav,Dr,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
+z=$.X3
+y=d?1:0
+y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
+y.aA(a,b,c,d,e)
+return y}}},
 x1:{
-"^":"TpZ:18;a,b,c",
+"^":"TpZ:17;a,b,c",
 $0:[function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
@@ -6140,7 +5985,7 @@
 else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6149,21 +5994,12 @@
 z.Lj.bH(z.Bd)
 z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-aN:{
+ezY:{
 "^":"wS;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.ps(a)
-z.fm(0,d)
-z.y5(c)
-return z},
+KR:function(a,b,c,d){return this.ht(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
+ht:function(a,b,c,d){return P.T6(a,b,c,d,H.Oq(this,0))}},
 ti:{
 "^":"a;aw@"},
 fZ:{
@@ -6186,7 +6022,7 @@
 this.Gv=1},
 IO:function(){if(this.Gv===1)this.Gv=3}},
 CR:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6216,73 +6052,69 @@
 yc:function(){if((this.Gv&2)!==0)return
 this.Lj.wr(this.gXm())
 this.Gv=(this.Gv|2)>>>0},
-ps:function(a){},
 fm:function(a,b){},
-y5:function(a){this.Bd=a},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
+if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,17],
 ed:function(){return},
 SY:[function(){var z=(this.Gv&4294967293)>>>0
 this.Gv=z
 if(z>=4)return
 this.Gv=(z|1)>>>0
 z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
+if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 dR:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"TpZ:128;a,b",
+"^":"TpZ:127;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
 "^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.ip(this,"og",0)
 y=H.ip(this,"og",1)
 x=$.X3
 w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.ps(a)
-v.fm(0,d)
-v.y5(c)
-return v},
+w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w.aA(a,d,c,b,y)
+w.Xa(this,a,d,c,b,z,y)
+return w},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 kM:function(a,b){b.Rg(0,a)},
 $aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;KQ,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 oJ:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.oJ.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
+z.yy(0)},"$0","gp4",0,0,17],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
+z.QE(0)},"$0","gZ9",0,0,17],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},114],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,129,24,25],
-Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,23,24],
+TE:[function(){this.Qj()},"$0","gH1",0,0,17],
+Xa:function(a,b,c,d,e,f,g){var z,y
 z=this.gOa()
 y=this.gve()
 this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
@@ -6295,7 +6127,7 @@
 z=null
 try{z=this.Dr(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.oJ(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
@@ -6307,7 +6139,7 @@
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.oJ(y,x)
 return}J.wx(b,z)}},
 AE:{
@@ -6317,215 +6149,290 @@
 try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 b.oJ(y,x)}}},
 Xa:{
 "^":"a;"},
-aYy:{
+fM:{
+"^":"a;M5,ig>"},
+n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,hY<,Ot<,jH<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,xk<",
+"^":"a;E2,hY,U1,jH,Ka,Xp,at,rb,Zq,NW,mp,xk",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.hY.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$1(a)},
+O8:function(a){return this.at.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zq.$2(a,b)},
 Ch:function(a,b){return this.mp.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)}},
+qp:function(a){return this.xk.$1$specification(a)},
+$isyQ:true},
 e4y:{
 "^":"a;"},
 dl:{
 "^":"a;"},
 Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-c1:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().ghY()==null;)z=z.geT(z)
-return z.gtp().ghY().$4(z,new P.Id(z.geT(z)),a,b)},
-Eo:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().gjH()==null;)z=z.geT(z)
-return z.gtp().gjH().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+"^":"a;Fu",
 RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gxk()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gxk().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+z=this.Fu.gwe()
+y=z.M5
+z.ig.$4(y,P.HM(y),a,b)}},
+m0:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
+fC:function(a){return this.gF7()===a.gF7()},
+$ism0:true},
+FQ:{
+"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,Pf<,Zo<,l5,eT>,Se<",
+gQc:function(){var z=this.l5
+if(z!=null)return z
+z=new P.Id(this)
+this.l5=z
+return z},
+gF7:function(){return this.Zo.M5},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
+if(b)return new P.OJ(this,z)
+else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
+UG:function(a){return this.rO(a,!0)},
 cl:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.cZ(this,z)}},
-TF:{
-"^":"TpZ:72;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"TpZ:72;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"TpZ:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"TpZ:80;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-cZ:{
-"^":"TpZ:80;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
+if(b)return new P.N9(this,z)
+else return new P.ap(this,z)},
+t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
 if(y!=null||z.x4(0,b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
+x=this.eT
+if(x!=null){w=J.UQ(x,b)
+if(w!=null)z.u(0,b,w)
+return w}return},
+hk:function(a,b){var z,y,x
+z=this.Zo
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+uI:function(a,b){var z,y,x
+z=this.Pf
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
 qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).Eo(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).V6(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
-Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
-FO:{
-"^":"TpZ:72;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+Gr:function(a){var z,y,x
+z=this.X2
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+FI:function(a,b){var z,y,x
+z=this.rA
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+mg:function(a,b,c){var z,y,x
+z=this.n8
+y=z.M5
+x=P.HM(y)
+return z.ig.$6(y,x,this,a,b,c)},
+Al:function(a){var z,y,x
+z=this.z0
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+wY:function(a){var z,y,x
+z=this.MQ
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+O8:function(a){var z,y,x
+z=this.CK
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+wr:function(a){var z,y,x
+z=this.we
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+uN:function(a,b){var z,y,x
+z=this.PN
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+Ch:function(a,b){var z,y,x
+z=this.TL
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,b)},
+UE:function(a,b,c){var z
+this.X2=this.eT.gX2()
+this.rA=this.eT.grA()
+this.n8=this.eT.gn8()
+z=b.Ka
+this.z0=z!=null?new P.fM(this,z):this.eT.gz0()
+z=b.Xp
+this.MQ=z!=null?new P.fM(this,z):this.eT.gMQ()
+this.CK=this.eT.gCK()
+this.we=this.eT.gwe()
+this.PN=this.eT.gPN()
+this.WB=this.eT.gWB()
+this.TL=this.eT.gTL()
+this.Pf=this.eT.gPf()
+this.Zo=this.eT.gZo()}},
+OJ:{
+"^":"TpZ:74;a,b",
+$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eM:{
-"^":"TpZ:72;c,d",
+Yn:{
+"^":"TpZ:74;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+eP:{
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+aQ:{
+"^":"TpZ:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+N9:{
+"^":"TpZ:79;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+ap:{
+"^":"TpZ:79;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+FO:{
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y
-z=this.c
+z=this.a
 P.FL("Uncaught Error: "+H.d(z))
-y=this.d
+y=this.b
 if(y==null&&!!J.x(z).$isXS)y=z.gI4()
 if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Uez:{
-"^":"TpZ:80;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-ghY:function(){return P.lw()},
-Gr:function(a){return this.ghY().$1(a)},
-gOt:function(){return P.MM()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-gjH:function(){return P.iy()},
-mg:function(a,b,c){return this.gjH().$3(a,b,c)},
-gKa:function(){return P.EU()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.l9()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.Lm()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gmp:function(a){return P.oQ()},
-Ch:function(a,b){return this.gmp(this).$1(b)},
-gxk:function(){return P.Ak()},
-qp:function(a){return this.gxk().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"m0;",
+gX2:function(){return C.F2},
+grA:function(){return C.Yl},
+gn8:function(){return C.Gu},
+gz0:function(){return C.pj},
+gMQ:function(){return C.F6},
+gCK:function(){return C.Xk},
+gwe:function(){return C.Zc},
+gPN:function(){return C.Sq},
+gWB:function(){return C.NA},
+gTL:function(){return C.uo},
+gPf:function(){return C.mc},
+gZo:function(){return C.Rt},
 geT:function(a){return},
-gtp:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
+gSe:function(){return $.wb()},
+gQc:function(){var z=$.Sk
+if(z!=null)return z
+z=new P.Id(this)
+$.Sk=z
+return z},
+gF7:function(){return this},
+bH:function(a){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$0()
+return x}x=P.T8(null,null,this,a)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+m1:function(a,b){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$1(b)
+return x}x=P.V7(null,null,this,a,b)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+z8:function(a,b,c){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$2(b,c)
+return x}x=P.Mu(null,null,this,a,b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+xi:function(a,b){if(b)return new P.hj(this,a)
+else return new P.MK(this,a)},
+ce:function(a){return this.xi(a,!0)},
+rO:function(a,b){if(b)return new P.pQ(this,a)
+else return new P.XW(this,a)},
+UG:function(a){return this.rO(a,!0)},
+cl:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.E1(this,null,this,a,b)},
+hk:function(a,b){return P.CK(null,null,this,a,b)},
+uI:function(a,b){return P.E1(null,null,this,a,b)},
 qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.T8(this,null,this,a)},
-FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
+Gr:function(a){if($.X3===C.NU)return a.$0()
+return P.T8(null,null,this,a)},
+FI:function(a,b){if($.X3===C.NU)return a.$1(b)
+return P.V7(null,null,this,a,b)},
+mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
+return P.Mu(null,null,this,a,b,c)},
 Al:function(a){return a},
 wY:function(a){return a},
 O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
+wr:function(a){P.Tk(null,null,this,a)},
+uN:function(a,b){return P.YF(a,b)},
+Ch:function(a,b){H.qw(b)},
+static:{"^":"ln,Sk"}},
+hj:{
+"^":"TpZ:74;a,b",
+$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+MK:{
+"^":"TpZ:74;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+pQ:{
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+XW:{
+"^":"TpZ:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+Ze:{
+"^":"TpZ:79;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+dM:{
+"^":"TpZ:79;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true}}],["dart.collection","dart:collection",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou:[function(a,b){return J.xC(a,b)},"$2","Hr",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
+Ou:[function(a,b){return J.xC(a,b)},"$2","Hr",4,0,48,49,50],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -6622,7 +6529,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -6715,14 +6622,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,130,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 DJ:{
 "^":"TpZ;a",
-$2:function(a,b){this.a.u(0,a,b)},
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
 PL:{
 "^":"bA;X5,vv,OX,OB,wV",
 nm:function(a){return H.CU(a)&0x3ffffff},
@@ -6749,11 +6656,11 @@
 z=a.length
 for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -6894,7 +6801,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.up(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 $isFo:true,
 $isZ0:true,
 $asZ0:null,
@@ -6903,14 +6810,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,130,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 pk:{
 "^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
 "^":"a;kh>,cA@,DG@,zQ@"},
 i5:{
@@ -7219,9 +7126,9 @@
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},31],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7263,7 +7170,7 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,69],
+bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,71],
 $isQV:true,
 $asQV:null},
 ark:{
@@ -7301,8 +7208,8 @@
 z.We(a,b)
 return z.vM},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"MQ",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -7381,7 +7288,7 @@
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
 this.u(a,b,c)},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.x(c)
 if(!!z.$isyN)c=z.br(c)
@@ -7394,21 +7301,21 @@
 if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,131,64,"call"],
+z.KF(b)},"$2",null,4,0,null,130,66,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7485,7 +7392,7 @@
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 AR:function(){var z,y,x,w
 z=this.av
 if(z===this.eZ)throw H.b(H.DU());++this.qT
@@ -7553,7 +7460,7 @@
 y=this.v5
 H.qG(a,v,v+z,y,0)
 return this.eZ+v}},
-Pt:function(a,b){var z=Array(8)
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
@@ -7600,12 +7507,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,69],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -7735,7 +7642,7 @@
 gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
 $asZ0:null,
@@ -7745,7 +7652,7 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -7753,7 +7660,7 @@
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
@@ -7813,51 +7720,130 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
+VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
+KH:function(a){var z
+if(a==null)return
+if(typeof a!="object")return a
+if(Object.getPrototypeOf(a)!==Array.prototype)return new P.r4(a,Object.create(null),null)
+for(z=0;z<a.length;++z)a[z]=P.KH(a[z])
+return a},
 jc:function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-tp:[function(a){return a.Lt()},"$1","Jn",2,0,49,50],
-JC:{
-"^":"TpZ:80;",
-$2:function(a,b){return b},
-$isEH:true},
+throw H.b(P.cD(String(y)))}if(b==null)return P.KH(z)
+else return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){z=a
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+return a}z=Object.create(null)
+x=new P.r4(a,z,null)
+w=x.KN()
+for(v=J.U6(w),u=this.a,y=0;y<v.gB(w);++y){t=v.t(w,y)
+z[t]=u.$2(t,this.$1(a[t]))}x.rm=z
+return x},
 $isEH:true},
-Ukr:{
+r4:{
+"^":"a;rm,tk,zK",
+t:function(a,b){var z,y
+z=this.tk
+if(z==null)return J.UQ(this.zK,b)
+else if(typeof b!=="string")return
+else{y=z[b]
+return typeof y=="undefined"?this.KH(b):y}},
+gB:function(a){return this.tk==null?J.q8(this.zK):J.q8(this.KN())},
+gl0:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))===0},
+gor:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))>0},
+gvc:function(a){if(this.tk==null)return J.iY(this.zK)
+return J.Ld(this.KN(),0)},
+gUQ:function(a){if(this.tk==null)return J.U8(this.zK)
+return H.K1(this.KN(),new P.FE(this),null,null)},
+u:function(a,b,c){var z,y
+if(this.tk==null)J.kW(this.zK,b,c)
+else if(this.x4(0,b)){z=this.tk
+z[b]=c
+y=this.rm
+if(y==null?z!=null:y!==z)y[b]=null}else J.kW(this.Ad(),b,c)},
+FV:function(a,b){H.bQ(b,new P.E5(this))},
+x4:function(a,b){if(this.tk==null)return J.w4(this.zK,b)
+if(typeof b!=="string")return!1
+return Object.prototype.hasOwnProperty.call(this.rm,b)},
+to:function(a,b,c){var z
+if(this.x4(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
+Rz:function(a,b){if(this.tk!=null&&!this.x4(0,b))return
+return J.V1(this.Ad(),b)},
+V1:function(a){var z
+if(this.tk==null)J.Z8(this.zK)
+else{z=this.zK
+if(z!=null)J.Z8(z)
+this.tk=null
+this.rm=null
+this.zK=P.Fl(null,null)}},
+aN:function(a,b){var z,y,x,w,v
+if(this.tk==null)return J.Me(this.zK,b)
+z=this.KN()
+for(y=J.U6(z),x=0;x<y.gB(z);++x){w=y.t(z,x)
+v=this.tk[w]
+if(typeof v=="undefined"){v=P.KH(this.rm[w])
+this.tk[w]=v}b.$2(w,v)
+if(z!==this.zK)throw H.b(P.a4(this))}},
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+KN:function(){var z=this.zK
+if(z==null){z=Object.keys(this.rm)
+this.zK=z}return z},
+Ad:function(){var z,y,x,w,v
+if(this.tk==null)return this.zK
+z=P.Fl(null,null)
+y=this.KN()
+for(x=J.U6(y),w=0;w<x.gB(y);++w){v=x.t(y,w)
+z.u(0,v,this.t(0,v))}if(x.gl0(y))x.h(y,null)
+else x.V1(y)
+this.tk=null
+this.rm=null
+this.zK=z
+return z},
+KH:function(a){var z
+if(!Object.prototype.hasOwnProperty.call(this.rm,a))return
+z=P.KH(this.rm[a])
+return this.tk[a]=z},
+$isFo:true,
+$asFo:function(){return[null,null]},
+$isZ0:true,
+$asZ0:function(){return[null,null]}},
+FE:{
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$isEH:true},
+E5:{
+"^":"TpZ:79;a",
+$2:function(a,b){this.a.u(0,a,b)},
+$isEH:true},
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
 AJ:{
 "^":"XS;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"$0","gAY",0,0,69],
+else return"Converting object did not return an encodable object."},"$0","gAY",0,0,71],
 static:{Gy:function(a,b){return new P.AJ(a,b)}}},
 K8:{
 "^":"AJ;Pc,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,69],
+bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;qa<,N9",
+"^":"Uk;qa<,ma",
 pW:function(a,b){return P.jc(a,this.gP1().qa)},
 kV:function(a){return this.pW(a,null)},
 Q0:function(a,b){var z=this.gZE()
@@ -7865,7 +7851,7 @@
 KP:function(a){return this.Q0(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,SI",
 $aswIe:function(){return[P.a,P.qU]}},
@@ -7873,8 +7859,8 @@
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;N9,cP,ol",
-iY:function(a){return this.N9.$1(a)},
+"^":"a;ma,cP,ol",
+iY:function(a){return this.ma.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -7920,9 +7906,8 @@
 t=H.mx(92)
 x.vM+=t
 t=H.mx(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
+x.vM+=t}}if(w===0)x.KF(a)
+else if(w<y)x.KF(z.Nj(a,w,y))},
 WD:function(a){var z,y,x,w
 for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
@@ -7935,7 +7920,8 @@
 x.pop()}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.Gy(a,y))}}},
-Jc:function(a){var z,y,x,w,v,u
+Jc:function(a){var z,y,x,w
+z={}
 if(typeof a==="number"){if(!C.CD.gzr(a))return!1
 this.cP.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.cP.KF("true")
@@ -7945,34 +7931,44 @@
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.cP
-y.KF("[")
-if(z.gB(a)>0){this.C7(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.C7(z.t(a,x))}}y.KF("]")
+return!0}else{y=J.x(a)
+if(!!y.$isWO){this.WD(a)
+z=this.cP
+z.KF("[")
+if(y.gB(a)>0){this.C7(y.t(a,0))
+for(x=1;x<y.gB(a);++x){z.vM+=","
+this.C7(y.t(a,x))}}z.KF("]")
 this.pg(a)
-return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.cP
-y.KF("{")
-for(w=J.mY(z.gvc(a)),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
+return!0}else if(!!y.$isZ0){this.WD(a)
+w=this.cP
+w.KF("{")
+z.a="\""
+y.aN(a,new P.tF(z,this))
+w.KF("}")
 this.pg(a)
 return!0}else return!1}},
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,ATf,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).C7(a)
 return z.vM}}},
+tF:{
+"^":"TpZ:80;a,b",
+$2:[function(a,b){var z,y,x
+z=this.b
+y=z.cP
+x=this.a
+y.KF(x.a)
+x.a=",\""
+z.Ip(a)
+y.KF("\":")
+z.C7(b)},"$2",null,4,0,null,77,20,"call"],
+$isEH:true},
 u5F:{
-"^":"Ziv;IE",
+"^":"Ziv;IW",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -8058,18 +8054,18 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;IE",
+"^":"wIe;IW",
 WJ:function(a){var z,y
 z=P.p9("")
-y=new P.tz(this.IE,z,!0,0,0,0)
+y=new P.tz(this.IW,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
 return z.vM},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 tz:{
-"^":"a;IE,ZB,AX,FU,kN,NY",
+"^":"a;IW,ZB,AX,FU,kN,NY",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IE!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
+fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
 this.ZB.KF(H.mx(65533))
 this.FU=0
 this.kN=0
@@ -8083,8 +8079,8 @@
 this.FU=0
 this.kN=0
 this.NY=0
-v=new P.zC(z,this,a)
-$loop$0:for(u=this.ZB,t=this.IE!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
+v=new P.zC(z,this,a,b,c)
+$loop$0:for(u=this.ZB,t=this.IW!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
 if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
@@ -8131,7 +8127,7 @@
 this.NY=w}},
 static:{"^":"ADi"}},
 zC:{
-"^":"TpZ:132;a,b,c",
+"^":"TpZ:131;a,b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
@@ -8142,7 +8138,7 @@
 $isEH:true}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,51,46,47],
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -8162,12 +8158,8 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-NS:[function(a){return H.CU(a)},"$1","nI",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,54],
+NS:[function(a){return H.CU(a)},"$1","cEg",2,0,55],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -8181,11 +8173,11 @@
 else y.$1(z)},
 Qe:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"TpZ:133;a",
+"^":"TpZ:132;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -8215,12 +8207,12 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,69],
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,71],
 h:function(a,b){return P.Wu(J.ew(this.y3,b.gVs()),this.aL)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -8267,12 +8259,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"TpZ:134;",
+"^":"TpZ:133;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"TpZ:135;",
+"^":"TpZ:134;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8306,11 +8298,11 @@
 x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
 w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
 v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gAY",0,0,69],
+return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gAY",0,0,71],
 $isa6:true,
 static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"TpZ:15;",
+"^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -8319,26 +8311,26 @@
 return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"TpZ:15;",
+"^":"TpZ:14;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gAY",0,0,69]},
+bu:[function(a){return"Throw of null."},"$0","gAY",0,0,71]},
 OY:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gAY",0,0,69],
+return"Illegal argument(s)"},"$0","gAY",0,0,71],
 static:{u:function(a){return new P.OY(a)}}},
 Sn:{
 "^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,69],
+bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
 static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
@@ -8354,59 +8346,59 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,69],
+return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,71],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,71],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,69],
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,71],
 $isXS:true,
 static:{SY:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,71],
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"XS;YA",
 bu:[function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,69],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
 static:{a4:function(a){return new P.UV(a)}}},
 qn:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,69],
+bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,69],
+bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,71],
 gI4:function(){return},
 $isXS:true},
 t7:{
 "^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,69],
+bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,71],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
 bu:[function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gAY",0,0,69]},
+return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
 oe:{
 "^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,69],
+bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
 static:{cD:function(a){return new P.oe(a)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,69],
+bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
 static:{ts:function(){return new P.eV()}}},
 qo:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,69],
+bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
 t:function(a,b){var z=H.of(b,"expando$values")
 return z==null?null:H.of(z,this.J4())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
@@ -8430,7 +8422,7 @@
 "^":"a;",
 $isQV:true,
 $asQV:null},
-Dk:{
+Anv:{
 "^":"a;"},
 WO:{
 "^":"a;",
@@ -8446,7 +8438,7 @@
 $asZ0:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gAY",0,0,69]},
+bu:[function(a){return"null"},"$0","gAY",0,0,71]},
 "+Null":0,
 FK:{
 "^":"a;",
@@ -8456,7 +8448,7 @@
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"$0","gAY",0,0,69],
+bu:[function(a){return H.a5(this)},"$0","gAY",0,0,71],
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.wO(this),null)},
 $isa:true},
@@ -8470,23 +8462,20 @@
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
+"^":"a;yz,wj",
+wE:function(a){var z,y
 z=this.yz==null
 if(!z&&this.wj==null)return
-if(z)this.yz=H.Ao()
-else{z=H.Ao()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
+y=$.lEO
+if(z)this.yz=y.$0()
+else{this.yz=J.Hn(y.$0(),J.Hn(this.wj,this.yz))
+this.wj=null}},
+static:{"^":"xj"}},
 qU:{
 "^":"a;",
 $isqU:true},
 "+String":0,
-WU:{
+Kg:{
 "^":"a;Cb,R7,C3,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
@@ -8519,7 +8508,7 @@
 y=z.gl()
 this.vM+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.vM=""},
-bu:[function(a){return this.vM},"$0","gAY",0,0,69],
+bu:[function(a){return this.vM},"$0","gAY",0,0,71],
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -8532,26 +8521,19 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,mn,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.mn,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.mn},
+"^":"a;Bo,IE,pO,Fi,ux,Ev,bM,hO,lH",
+gJf:function(a){var z=this.Bo
+if(z==null)return""
+if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+return z},
+gtp:function(a){var z=this.IE
+if(z==null)return P.bG(this.Fi)
+return z},
 gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.bm()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-yM:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.et(a,"/.")!==-1},
+yM:function(a,b){if(a==="")return"/"+b
+return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
+K2:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
+return C.xB.kJ(a,"/.")!==-1},
 KO:function(a){var z,y,x,w,v
 if(!this.K2(a))return a
 z=[]
@@ -8565,217 +8547,329 @@
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y
+bu:[function(a){var z,y,x,w
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.mn,0)){z.KF(":")
-z.KF(J.AG(this.mn))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"$0","gAY",0,0,69],
-n:function(a,b){var z,y,x
+z.KF(":")}x=this.Bo
+w=x==null
+if(!w||C.xB.nC(this.pO,"//")||y==="file"){z.KF("//")
+y=this.ux
+if(C.xB.gor(y)){z.KF(y)
+z.KF("@")}if(!w)z.KF(x)
+y=this.IE
+if(y!=null){z.KF(":")
+z.KF(y)}}z.KF(this.pO)
+y=this.Ev
+if(y!=null){z.KF("?")
+z.KF(y)}y=this.bM
+if(y!=null){z.KF("#")
+z.KF(y)}return z.vM},"$0","gAY",0,0,71],
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
+if(this.Fi===b.Fi)if(this.Bo!=null===(b.Bo!=null))if(this.ux===b.ux){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
+z=z.gtp(b)
+if(y==null?z==null:y===z)if(this.pO===b.pO){z=this.Ev
+y=z==null
+x=b.Ev
+w=x==null
+if(!y===!w){if(y)z=""
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.bM
+y=z==null
+x=b.bM
+w=x==null
+if(!y===!w){if(y)z=""
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
-giO:function(a){var z=new P.Wf()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.mn=0
-else if(h==="https"&&J.xC(e,443))this.mn=0
-else this.mn=e
-this.pO=this.x6(c,d)},
+giO:function(a){var z,y,x,w,v
+z=new P.Wf()
+y=this.gJf(this)
+x=this.gtp(this)
+w=this.Ev
+if(w==null)w=""
+v=this.bM
+return z.$2(this.Fi,z.$2(this.ux,z.$2(y,z.$2(x,z.$2(this.pO,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,rU,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,fC,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,yw1,SQU,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.mKy,q)
-q=(C.mKy[q]&C.jn.KI(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.KU(h)
-z=new P.q5(P.L7(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},KU:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.mKy,u)
-u=(C.mKy[u]&C.jn.KI(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+if(a==="https")return 443
+return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z={}
+z.a=""
+z.b=""
+z.c=null
+z.d=null
+z.e=0
+z.f=-1
+w=a.length
+v=0
+while(!0){if(!(v<w)){y=0
+x=0
+break}if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35){y=0
+x=0
+break}if(u===47){x=v===0?2:1
+y=0
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+z.a=P.iv(a,v);++v
+if(v===w){z.f=-1
+x=0}else{if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35)x=0
+else x=u===47?2:1}y=v
+break}++v
+z.f=-1}z.e=v
+if(x===2){t=v+1
+z.e=t
+if(t===w){z.f=-1
+x=0}else{u=C.xB.j(a,t)
+z.f=u
+if(u===47){++z.e
+new P.BH(z,a,-1).$0()
+y=z.e}s=z.f
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+u=a.charCodeAt(s)
+z.f=u
+if(u===63||u===35)break
+z.f=-1}r=z.c!=null||z.a==="file"
+q=P.qd(a,y,z.e,null,r)
+s=z.f
+if(s===63){p=C.xB.XU(a,"#",z.e+1)
+s=z.e+1
+if(p<0){o=P.LE(a,s,w,null)
+n=null}else{o=P.LE(a,s,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+o=null}w=z.a
+s=z.b
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){var z,y,x,w,v
+z=a.length
+if(b===z)c+=" at end of input."
+else{c+=" at position "+b+".\n"
+if(z>78){y=b-10
+if(y<0)y=0
+x=y+72
+if(x>z){y=z-72
+x=z}w=y!==0?"...":""
+v=x!==z?"...":""}else{y=0
+w=""
+v=""}c=c+w+J.Nj(a,y,z)+v+"\n"+C.xB.U(" ",w.length+b-y)+"^"}throw H.b(P.cD(c))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return a},L7:function(a,b,c,d){var z,y
+if(a==null)return
+if(b===c)return""
+if(C.xB.j(a,b)===91){z=c-1
+if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+P.Uw(a,b+1,z)
+return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+if(a.charCodeAt(y)===58){P.Uw(a,b,c)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.vM=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.vM=x.vM+s
+if(v){t=C.xB.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.vM+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.KI(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.vM=""}if(y<z){v=C.xB.Nj(a,y,z)
+x.toString
+x.vM=x.vM+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.KI(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
+if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.vM=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.vM=x.vM+s
+v=P.mC(u)
+x.vM+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iv:function(a,b){var z,y,x,w,v,u,t,s
+if(b===0)return""
+a.toString
+z=a.length
+if(0>=z)H.vh(P.N(0))
+y=a.charCodeAt(0)
+x=y>=97
+if(!(x&&y<=122))w=y>=65&&y<=90
+else w=!0
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
+t=a.charCodeAt(u)
+if(t<128){s=t>>>4
+if(s>=8)return H.e(C.mKy,s)
+s=(C.mKy[s]&C.jn.KI(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
+if(w&&v)x=!1}a=J.Nj(a,0,b)
+return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
+return P.Xc(a,b,c,C.to)},qd:function(a,b,c,d,e){var z,y
+z=a==null
+if(z&&!0)return""
+z=!z
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(e&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+return y},LE:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
-if(y&&!0)return""
+if(y&&!0)return
 y=!y
-if(y);if(y)return P.Xc(a)
+if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(b,new P.Ue(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).kJ(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.QB()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.mx(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.mx(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.mx(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.b)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+C.jN.aN(d,new P.Ue(z,x))
+return x.vM},o6:function(a,b,c){if(a==null)return
+return P.Xc(a,b,c,C.o5)},wW:function(a){if(57>=a)return 48<=a
+a|=32
+return 97<=a&&102>=a},NJ:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+z=b+2
+y=a.length
+if(z>=y)return"%"
+x=b+1
+a.toString
+if(x<0)H.vh(P.N(x))
+if(x>=y)H.vh(P.N(x))
+w=a.charCodeAt(x)
+if(z<0)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(!P.wW(w)||!P.wW(v))return"%"
+u=P.NJ(w)*16+P.NJ(v)
+if(u<127){z=C.jn.GG(u,4)
+if(z>=8)return H.e(C.B2,z)
+z=(C.B2[z]&C.jn.KI(1,u&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
+if(a<128){z=Array(3)
+z.fixed$length=init
+z[0]=37
+y=a>>>4
+if(y>=16)H.vh(P.N(y))
+z[1]="0123456789ABCDEF".charCodeAt(y)
+z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
+w=4}else{x=224
+w=3}else{x=192
+w=2}y=3*w
+z=Array(y)
+z.fixed$length=init
+for(v=0;--w,w>=0;x=128){u=C.jn.ib(a,6*w)&63|x
+if(v>=y)return H.e(z,v)
+z[v]=37
+t=v+1
+s=u>>>4
+if(s>=16)H.vh(P.N(s))
+s="0123456789ABCDEF".charCodeAt(s)
+if(t>=y)return H.e(z,t)
+z[t]=s
+s=v+2
+t="0123456789ABCDEF".charCodeAt(u&15)
+if(s>=y)return H.e(z,s)
+z[s]=t
+v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(v<127){u=v>>>4
+if(u>=8)return H.e(d,u)
+u=(d[u]&C.jn.KI(1,v&15))!==0}else u=!1
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
+continue}if("%"===t){t="%25"
+s=1}else s=3}else{if(v<=93){u=v>>>4
+if(u>=8)return H.e(C.rz,u)
+u=(C.rz[u]&C.jn.KI(1,v&15))!==0}else u=!1
+if(u){P.iV(a,z,"Invalid character")
+t=null
+s=null}else{if((v&64512)===55296){u=z+1
+if(u<c){if(u<0)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
+r=a.charCodeAt(u)
+if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
+s=2}else s=1}else s=1}else s=1
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.vM=""}w=C.xB.Nj(a,y,z)
+x.toString
+x.vM=x.vM+w
+x.vM+=typeof t==="string"?t:H.d(t)
+if(typeof s!=="number")return H.s(s)
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+if(c==null)c=J.q8(a)
 z=new P.x8()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
+w=b
+u=b
+t=!1
+while(!0){s=c
 if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
+if(!(u<s))break
 s=a
+s.toString
+if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
+if(u>=r)H.vh(P.N(u))
+if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
+s.toString
+if(u<0)H.vh(P.N(u))
+if(u>=J.q8(s))H.vh(P.N(u))
+if(s.charCodeAt(u)!==58)z.$1("invalid start colon.")
+w=u}if(u===w){if(t)z.$1("only one wildcard `::` is allowed")
 J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
+t=!0}else J.bi(x,y.$2(w,u))
+w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
+q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
 if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+try{v=P.Dy(J.Nj(a,w,c))
 s=J.lf(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
@@ -8784,10 +8878,30 @@
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.oA(x,new P.EY(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+z.$1("invalid end of IPv6 address.")}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
+n=Array(16)
+n.$builtinTypeInfo=[P.KN]
+u=0
+m=0
+while(!0){s=J.q8(x)
+if(typeof s!=="number")return H.s(s)
+if(!(u<s))break
+l=J.UQ(x,u)
+s=J.x(l)
+if(s.n(l,-1)){k=9-J.q8(x)
+for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
+n[m]=0
+s=m+1
+if(s>=16)return H.e(n,s)
+n[s]=0
+m+=2}}else{r=s.m(l,8)
+if(m<0||m>=16)return H.e(n,m)
+n[m]=r
+r=m+1
+s=s.i(l,255)
+if(r>=16)return H.e(n,r)
+n[r]=s
+m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -8827,36 +8941,53 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.oh(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.IE
+else u.push(v);++x}}t=b.IW
 return new P.GY(t).WJ(u)}}},
-jY:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
+hP2:{
+"^":"TpZ:135;",
+$1:function(a){a.C(0,128)
+return!1},
 $isEH:true},
-Uo:{
-"^":"TpZ:137;a",
-$1:function(a){a=J.DP(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+BH:{
+"^":"TpZ:17;a,b,c",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=this.a
+y=z.e
+x=this.b
+w=x.length
+if(y===w){z.f=this.c
+return}z.f=J.Pp(x,y)
+for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+r=x.charCodeAt(s)
+z.f=r
+if(r===47||r===63||r===35)break
+if(r===64){t=z.e
+u=-1}else if(r===58)u=z.e
+else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+if(q===-1){z.e=w
+z.f=v
+u=-1
+break}else z.e=q
+u=-1}++z.e
+z.f=v}p=z.e
+if(t>=0){z.b=P.ua(x,y,t)
+y=t+1}if(u>=0){o=u+1
+if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
+m=x.charCodeAt(o)
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
+n=n*10+(m-48)}else n=null
+z.d=P.JF(n,z.a)
+p=u}z.c=P.L7(x,y,p,!0)
+s=z.e
+if(s<w)z.f=C.xB.j(x,s)},
 $isEH:true},
-QU:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.JH,z)
-z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-bm:{
-"^":"TpZ:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
+UU:{
+"^":"TpZ:12;",
+$1:function(a){return P.jW(C.jr,a,C.xM,!1)},
 $isEH:true},
 Ue:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -8866,62 +8997,12 @@
 z.KF("=")
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
-Al:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"TpZ:136;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-QB:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"TpZ:137;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"TpZ:137;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"TpZ:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
 Wf:{
-"^":"TpZ:138;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+"^":"TpZ:136;",
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.kJ(b,"=")
@@ -8931,38 +9012,32 @@
 J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
-"^":"TpZ:43;",
+"^":"TpZ:44;",
 $1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
 $isEH:true},
 Nw:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,139,"call"],
+return z},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 x8:{
-"^":"TpZ:43;",
+"^":"TpZ:44;",
 $1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"TpZ:97;a,b",
+"^":"TpZ:96;a,b",
 $2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
+z=H.BU(J.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
 return z},
 $isEH:true},
-EY:{
-"^":"TpZ:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
 rI:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
@@ -9018,26 +9093,26 @@
 ju:function(a){return a},
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Gi:function(a,b){return new W.zZ(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,13,54],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,13,54],
-Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,55,54,56,57,58],
+v8:function(a,b){return new W.zZ(a,b)},
+w6:[function(a){return J.N1(a)},"$1","l9",2,0,12,56],
+Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,12,56],
+Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.l9(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
@@ -9052,7 +9127,7 @@
 return $.X3.cl(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|pv|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9063,11 +9138,11 @@
 "%":"EntryArray"},
 Ps:{
 "^":"Bo;N:target%,t5:type%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"HTMLAnchorElement"},
 fY:{
 "^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"HTMLAreaElement"},
 rZg:{
 "^":"Bo;mH:href%,N:target%",
@@ -9143,7 +9218,7 @@
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rz:{
+rv:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 BK:{
@@ -9152,7 +9227,7 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 $isBK:true,
 "%":"DOMException"},
 h4:{
@@ -9167,7 +9242,7 @@
 wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
-bu:[function(a){return a.localName},"$0","gAY",0,0,69],
+bu:[function(a){return a.localName},"$0","gAY",0,0,71],
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
@@ -9183,16 +9258,16 @@
 GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
-gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
+gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
 $ish4:true,
 $isPZ:true,
 "%":";Element"},
-Kk:{
+fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type%,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
@@ -9204,7 +9279,7 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event|InputEvent"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.kd(a)},
@@ -9213,15 +9288,15 @@
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
-asg:{
+Ao:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-nS:{
-"^":"rz;tT:code=",
+QU:{
+"^":"rv;tT:code=",
 "%":"FileError"},
 jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
@@ -9255,14 +9330,14 @@
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
 fJ:{
-"^":"waV;il:responseText=,pf:status=",
+"^":"rk;il:responseText=,pf:status=",
 gbA:function(a){return W.Pd(a.response)},
 R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
-waV:{
+rk:{
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
@@ -9284,10 +9359,10 @@
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
+HLy:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
-ttH:{
+In:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 Gx:{
@@ -9305,15 +9380,15 @@
 u8r:{
 "^":"Gv;mH:href=,aB:protocol=",
 RE:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"Location"},
 jJ:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-eL:{
+TF:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+yy:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
@@ -9342,14 +9417,14 @@
 QbE:{
 "^":"Bo;P:value%",
 "%":"HTMLMeterElement"},
-PG:{
+PGY:{
 "^":"ea;",
-$isPG:true,
+$isPGY:true,
 "%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-yt:{
+bnE:{
 "^":"Imr;",
 EZ:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
@@ -9390,7 +9465,7 @@
 Vv:{
 "^":"Gv;N:target=,t5:type=",
 "%":"MutationRecord"},
-qT:{
+FO8:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
@@ -9409,14 +9484,14 @@
 pj:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
 bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,69],
+return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,71],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
 mK:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
+yk:{
 "^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -9478,9 +9553,9 @@
 j24:{
 "^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
-zk:{
+lpR:{
 "^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$iszk:true,
+$islpR:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -9493,7 +9568,7 @@
 Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
@@ -9528,7 +9603,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]},
 "%":"Storage"},
-KL:{
+Tp:{
 "^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
 fqq:{
@@ -9555,9 +9630,9 @@
 "^":"Bo;jb:content=",
 $isOH:true,
 "%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
+bm:{
 "^":"nx;",
-$ismw:true,
+$isbm:true,
 "%":"CDATASection|Text"},
 HR:{
 "^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
@@ -9576,7 +9651,7 @@
 "^":"ea;",
 "%":"FocusEvent|SVGZoomEvent;UIEvent"},
 SW:{
-"^":"eL;fg:height%,R:width}",
+"^":"TF;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
 "^":"PZ;aB:protocol=,O3:url=",
@@ -9597,18 +9672,18 @@
 kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
 X6:function(a,b,c){return this.kr(a,b,c,null)},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
-Bn:{
+UM:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-o5:{
+YC2:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,69],
+bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
@@ -9705,7 +9780,7 @@
 z=this.MW
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
@@ -9721,7 +9796,7 @@
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
 Yj:function(a,b,c){throw H.b(P.SY(null))},
-V1:function(a){J.r4(this.MW)},
+V1:function(a){J.qv(this.MW)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)this.MW.removeChild(z)
 return z},
@@ -9733,7 +9808,7 @@
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 tN:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 TS:{
@@ -9750,7 +9825,7 @@
 gDD:function(a){return W.or(this.Sc)},
 gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
 gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
-Un:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
+S8:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -9758,10 +9833,10 @@
 $isQV:true,
 $asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.Un(a,b)
+z.S8(a,b)
 return z}}},
 pN:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 QI:{
@@ -9774,8 +9849,8 @@
 t:function(a,b){var z,y
 z=$.nn()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.JF(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.JF(this.YO,b,!1),[null])},
+if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.mw(this.YO,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.mw(this.YO,b,!1),[null])},
 static:{"^":"fDX"}},
 RAp:{
 "^":"Gv+lD;",
@@ -9792,15 +9867,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"TpZ:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,140,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 bU2:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"TpZ:13;b,c",
+"^":"TpZ:12;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -9809,10 +9884,10 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 QR:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
@@ -9831,7 +9906,7 @@
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
@@ -9849,7 +9924,7 @@
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
 Nk:function(a,b){this.Jl(b,!0)},
-V1:function(a){J.r4(this.NL)},
+V1:function(a){J.qv(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
@@ -9885,15 +9960,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -9926,7 +10001,7 @@
 $asQV:function(){return[W.vKL]}},
 cf:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
+FV:function(a,b){J.Me(b,new W.JO(this))},
 V1:function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
@@ -9948,8 +10023,8 @@
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"TpZ:80;a",
+JO:{
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -9965,38 +10040,38 @@
 gB:function(a){return this.gvc(this).length},
 FJ:function(a){return a.namespaceURI==null}},
 hZ:{
-"^":"As3;n8,Kd",
+"^":"As3;N9,Kd",
 lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.qm(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
+for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.Jt(a))},
 Rz:function(a,b){return this.Q6(new W.ma(b))},
 Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
+yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.N9,!0,null),new W.Xw()),[null,null])},
 static:{or:function(a){var z=new W.hZ(a,null)
 z.yJ(a)
 return z}}},
 Xw:{
-"^":"TpZ:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 qm:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 Jt:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 ma:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
@@ -10019,24 +10094,24 @@
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-JF:{
+mw:{
 "^":"RO;DK,Ph,Sg",
 WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"wS",0),null])},
+return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"wS",0),null])},
 $iswS:true},
 ie:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.So(J.l2(a),this.a)},
 $isEH:true},
-rg:{
-"^":"TpZ:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+tS:{
+"^":"TpZ:12;b",
+$1:[function(a){J.ogJ(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Uc:{
 "^":"wS;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.Hb(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.iND(b),z),[H.ip(z,"wS",0),null])},
+WO:function(a,b){var z=H.VM(new P.nO(new W.Al(b),this),[H.ip(this,"wS",0)])
+return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"wS",0),null])},
 KR:function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.wS,null],[P.yX,null])),[null])
 z.xd(null)
@@ -10048,14 +10123,14 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 $iswS:true},
-Hb:{
-"^":"TpZ:13;a",
+Al:{
+"^":"TpZ:12;a",
 $1:function(a){return J.So(J.l2(a),this.a)},
 $isEH:true},
-iND:{
-"^":"TpZ:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+Hb:{
+"^":"TpZ:12;b",
+$1:[function(a){J.ogJ(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
 "^":"yX;VP,DK,Ph,u7,Sg",
@@ -10066,10 +10141,10 @@
 return},
 Fv:[function(a,b){if(this.DK==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 gUF:function(){return this.VP>0},
 QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
+this.Zz()},"$0","gDQ",0,0,17],
 Zz:function(){var z=this.u7
 if(z!=null&&this.VP<=0)J.V5(this.DK,this.Ph,z,this.Sg)},
 Ns:function(){var z=this.u7
@@ -10080,16 +10155,16 @@
 z=this.uZ
 if(z.x4(0,b))return
 y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rW(this,b),this.pY.gGj()))},
+z.u(0,b,b.zC(y.gL0(y),new W.rW(this,b),this.pY.gGj()))},
 Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
 xO:[function(a){var z,y
 for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.pY.xO(0)},"$0","gQF",0,0,18],
+this.pY.xO(0)},"$0","gQF",0,0,17],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
 rW:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -10100,7 +10175,7 @@
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -10152,11 +10227,11 @@
 return!1},
 gl:function(){return this.QZ}},
 zZ:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
+return this.a(a)},"$1",null,2,0,null,56,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -10232,7 +10307,7 @@
 bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
 HX:{
@@ -10244,7 +10319,7 @@
 OE5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
+l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
 en:{
@@ -10262,7 +10337,7 @@
 Gr5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-fQ:{
+MU:{
 "^":"en;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
@@ -10277,11 +10352,11 @@
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
-gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
+gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SH<"}},
@@ -10319,26 +10394,16 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-at:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
 hq:{
 "^":"a;",
 $ishq:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
 xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,40,61,26,62],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -10352,7 +10417,7 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -10363,7 +10428,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,52,63],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},
@@ -10383,7 +10448,7 @@
 bu:[function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,69],
+return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,71],
 V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
@@ -10400,7 +10465,7 @@
 return P.ND(new x())},XY:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(0,a))return z.t(0,a)
@@ -10411,7 +10476,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,61,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -10465,25 +10530,25 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return H.VM(new P.GD(a),[null])},
 $isEH:true},
 QS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -10516,26 +10581,26 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;Nd,ii",
-hv:function(){var z,y,x,w,v,u
-z=this.Nd
+"^":"a;Pd,Ak",
+X9:function(){var z,y,x,w,v,u
+z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.ii
+u=v+x+this.Ak
 z=(u&4294967295)>>>0
-this.Nd=z
-this.ii=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Pd=z
+this.Ak=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hv()
-return(this.Nd&z)>>>0}do{this.hv()
-y=this.Nd
+if((a&z)===0){this.X9()
+return(this.Pd&z)>>>0}do{this.X9()
+y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mf:function(a){var z,y,x,w,v,u,t,s
+qR:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
@@ -10557,24 +10622,24 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.Nd*1037
+v=this.Pd*1037
 t=(v&4294967295)>>>0
-this.Nd=t
-s=(this.ii*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.ii=s
-this.Nd=(t^u)>>>0
-this.ii=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.ii===0&&this.Nd===0)this.Nd=23063
-this.hv()
-this.hv()
-this.hv()
-this.hv()},
+this.Pd=t
+s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Ak=s
+this.Pd=(t^u)>>>0
+this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.Ak===0&&this.Pd===0)this.Pd=23063
+this.X9()
+this.X9()
+this.X9()
+this.X9()},
 static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
-z.mf(a)
+z.qR(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
@@ -10629,7 +10694,7 @@
 "^":"a;",
 gT8:function(a){return this.gBb(this)+this.R},
 gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,69],
+bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,71],
 n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -10682,7 +10747,7 @@
 Rz:function(a,b){return this.Rp.Rz(0,b)},
 gUQ:function(a){var z=this.Rp
 return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
 $isZ0:true,
 $asZ0:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
@@ -10705,7 +10770,7 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|Ui|GVy|Dg|ObS|Ipv|Pg"},
 dfL:{
 "^":"eH;",
 gbx:function(a){return C.dP},
@@ -10714,12 +10779,6 @@
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10727,15 +10786,9 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
 gbx:function(a){return C.G0},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10743,15 +10796,12 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float64Array"},
-PS:{
+xja:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10765,9 +10815,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10781,9 +10828,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10797,9 +10841,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10813,9 +10854,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10830,9 +10868,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10847,9 +10882,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10857,7 +10889,7 @@
 $asQV:function(){return[P.KN]},
 $isAS:true,
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
 oZ:function(a,b,c,d,e){var z,y,x
@@ -10874,6 +10906,12 @@
 $isXj:true},
 Dg:{
 "^":"GVy;",
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -10884,7 +10922,7 @@
 $isQV:true,
 $asQV:function(){return[P.CP]}},
 Ui:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10894,6 +10932,9 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"Ipv;",
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -10904,7 +10945,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 ObS:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10955,7 +10996,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,112,1,103,104],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,2,102,103],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -10964,9 +11005,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,112,1,103,104],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,2,102,103],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,141,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,2],
 static:{Rp:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -10986,8 +11027,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"TpZ:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -11008,7 +11049,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,83,46,47,84],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,82,49,50,83],
 static:{Ola:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11030,12 +11071,12 @@
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"TpZ:143;a",
+"^":"TpZ:141;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,93,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 uv:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
@@ -11060,7 +11101,7 @@
 "^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,98],
 static:{cYO:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11081,7 +11122,7 @@
 "^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,98],
 static:{TsF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11143,7 +11184,8 @@
 "^":"V9;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,98],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11153,8 +11195,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
+C.p0.ZL(a)
+C.p0.XI(a)
 return a}}},
 V9:{
 "^":"uL+Pi;",
@@ -11162,7 +11204,7 @@
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,144],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11250,9 +11292,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,141,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,143],
 X7:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,141,2],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,143],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11272,8 +11314,8 @@
 a.An=w
 J.No(a.hi,J.DO(w))
 J.OE(a.hi,J.OB(a.An))
-this.Fc(a,0)},
-Fc:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+this.ps(a,0)},
+ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -11323,8 +11365,8 @@
 P.Iw(new O.R5(a,b),null)},
 SK:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,99],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,98],
+YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
 static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -11347,29 +11389,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"TpZ:72;a,b",
-$0:function(){J.MU(this.a,this.b+1)},
+"^":"TpZ:74;a,b",
+$0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,145,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 z4:{
-"^":"TpZ:80;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,146,"call"],
+"^":"TpZ:79;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,145,"call"],
 $isEH:true},
 oc:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 UC:{
-"^":"lg;oH,vp,zz,pT,jV,AP,fn",
+"^":"Vz;oH,vp,zz,pT,jV,AP,fn",
 eE:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.lg.prototype.eE.call(this,a,b)}},
+return J.O6(J.UQ(J.U8(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
 Ly:{
 "^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gYt:function(a){return a.MF},
@@ -11464,17 +11506,17 @@
 if(z==null?y!=null:z!==y){x.sxp(y)
 a.nc.sT3(!0)}else x.sT3(!x.gT3())
 J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,102,1,103,104],
+this.Jh(a)}},"$3","gQq",6,0,101,2,102,103],
 SK:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,99],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,98],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,99],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,98],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,99],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,147,148],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,98],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,146,147],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11534,23 +11576,23 @@
 a.GM.W2(a.Oc)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,149,150],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,148,149],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,149,150],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,148,149],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,149,150],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,148,149],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
@@ -11560,7 +11602,7 @@
 z.V7("addColumn",["string","Type"])
 a.Oc.KJ.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.p0()),new G.Kt("Accumulated Instances",G.xK()),new G.Kt("Current Size",G.p0()),new G.Kt("Current Instances",G.xK()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.p0()),new G.Kt("Accumulator Instances",G.xK()),new G.Kt("Current Size",G.p0()),new G.Kt("Current Instances",G.xK())],z,[],0,!0,null,null))
+z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH())],z,[],0,!0,null,null))
 a.nc=z
 z.sxp(2)},
 static:{Ut:function(a){var z,y
@@ -11602,7 +11644,7 @@
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 OW:{
-"^":"TpZ:48;b,c",
+"^":"TpZ:51;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -11612,23 +11654,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"TpZ:151;d",
+"^":"TpZ:150;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"TpZ:152;e",
+"^":"TpZ:151;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 uS:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){},
 $isEH:true},
 Tm:{
-"^":"TpZ:13;f,UI,bK",
+"^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -11637,7 +11679,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -11662,11 +11704,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"TpZ:80;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,78,21,"call"],
+"^":"TpZ:79;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true},
 CA:{
-"^":"TpZ:48;a,b",
+"^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -11676,19 +11718,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"TpZ:151;c",
+"^":"TpZ:150;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"TpZ:152;d",
+"^":"TpZ:151;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"TpZ:13;e,f,UI,bK",
+"^":"TpZ:12;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -11721,7 +11763,7 @@
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,69],
+bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,71],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
@@ -11729,11 +11771,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,153,31],
+return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,152,30],
 ad:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.Oq(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,154,31],
+return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,153,30],
 ou:function(a,b){return this.lF().ou(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -11771,20 +11813,20 @@
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 rl:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 PR:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 uQ:{
-"^":"TpZ:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11807,12 +11849,12 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
+V1:function(a){J.qv(this.iz.NL)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)J.Mp(z)
 return z},
 xe:function(a,b,c){this.iz.xe(0,b,c)},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
@@ -11831,11 +11873,11 @@
 gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])}},
 hT:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -11848,14 +11890,14 @@
 else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,72],
+Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,156,157,99],
+c.$0()}},"$2","gus",4,0,155,156,98],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11870,14 +11912,14 @@
 C.hM.XI(a)
 return a}}},
 Ng:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.sTX(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,142,"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
@@ -11888,10 +11930,10 @@
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,108,110],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,108,33],
-SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,99],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,32],
+SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,98],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11909,23 +11951,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,93,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 cL:{
-"^":"TpZ:143;a",
+"^":"TpZ:141;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,93,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
 "^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,98],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11960,7 +12002,7 @@
 "^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11995,8 +12037,8 @@
 "^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,99],
-Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
+SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,98],
+Lg:[function(a){J.cI(a.yR).YM(new E.XB(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
@@ -12004,7 +12046,7 @@
 z=a.mZ
 if(z!=null){z.ed()
 a.mZ=null}},
-static:{TiU:function(a){var z,y
+static:{hm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12019,8 +12061,8 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-Kv:{
-"^":"TpZ:72;a",
+XB:{
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12028,8 +12070,8 @@
 "^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,99],
-Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
+SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,98],
+Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
@@ -12053,7 +12095,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12074,7 +12116,7 @@
 return a}}},
 qh:{
 "^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{Sc:function(a){var z,y
+static:{va:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12091,7 +12133,7 @@
 "^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12111,7 +12153,7 @@
 "^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,98],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12121,8 +12163,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
+C.rU.ZL(a)
+C.rU.XI(a)
 return a}}},
 V18:{
 "^":"uL+Pi;",
@@ -12146,7 +12188,7 @@
 "^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{kf:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12166,7 +12208,7 @@
 "^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,98],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12186,8 +12228,8 @@
 "^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
-static:{Ii1:function(a){var z,y
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12214,15 +12256,15 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
 "^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,99],
-nK:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
+SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,98],
+nK:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
@@ -12245,8 +12287,8 @@
 V22:{
 "^":"uL+Pi;",
 $isd3:true},
-mj:{
-"^":"TpZ:72;a",
+As:{
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12254,7 +12296,7 @@
 "^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12285,8 +12327,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.OkI.ZL(a)
-C.OkI.XI(a)
+C.Wa.ZL(a)
+C.Wa.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
@@ -12296,8 +12338,8 @@
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,99],
-nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
+SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,98],
+nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
@@ -12321,7 +12363,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
@@ -12406,15 +12448,15 @@
 a.fE=this.ct(a,C.aH,a.fE,v)
 J.aT(a.oi).N3(a.oi)
 J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.iY(z,null,null)
+a.Hm=new G.xK(z,null,null)
 this.Zb(a)},
-m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,57],
+m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,19,59],
 SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,99],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,98],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12422,11 +12464,11 @@
 if(z==null)return
 try{a.Hm.mA(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,100,101],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,100,101],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12436,8 +12478,8 @@
 if(typeof v!=="number")return v.W()
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,102,1,103,104],
+x=new H.oP(u,null)
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12463,9 +12505,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,158,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,157,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -12507,8 +12549,8 @@
 "^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,159,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,159,14],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,158,13],
+kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,158,13],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12518,21 +12560,21 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
+C.lk8.ZL(a)
+C.lk8.XI(a)
 return a}}},
 V27:{
 "^":"uL+Pi;",
 $isd3:true},
 rf:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 r8:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 $.Kh.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,142,"call"],
+return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Qh:{
 "^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
@@ -12547,8 +12589,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Vi.ZL(a)
-C.Vi.XI(a)
+C.rCJ.ZL(a)
+C.rCJ.XI(a)
 return a}}},
 V28:{
 "^":"uL+Pi;",
@@ -12557,7 +12599,7 @@
 "^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{RP:function(a){var z,y
+static:{TSH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12601,7 +12643,7 @@
 x=z.WL
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,19,59],
 static:{Oll:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12618,7 +12660,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-p69:{
+EN:{
 "^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.Yi.KJ
@@ -12661,8 +12703,8 @@
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,18],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
 dQ:function(a){var z
@@ -12670,16 +12712,16 @@
 z=a.Cn
 if(z!=null){z.ed()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,20,99],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,159,14],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,159,14],
+SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,98],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,158,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.QY(a))},"$1","gDQ",2,0,158,13],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.Fs=new L.p69(new G.Kf(z),null)
+a.Fs=new L.EN(new G.Kf(z),null)
 a.Cc=[]
 a.q1=!1
 a.oG=!1
@@ -12692,7 +12734,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.Fs
@@ -12704,15 +12746,15 @@
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,160,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,159,"call"],
 $isEH:true},
 CV:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-Vq:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,142,"call"],
+QY:{
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -12781,8 +12823,8 @@
 new Z.xh(z,y).LE(x,0)
 z.KF("}\n")
 z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,19,59],
+static:{lL:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12818,10 +12860,10 @@
 "^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,99],
-static:{as:function(a){var z,y
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,98],
+static:{SP:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12862,16 +12904,16 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){v.cB(w)
 v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.D8,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
+Z8:function(a,b,c){return this.Y6(C.D8,a,b,c)},
+kS:function(a){return this.Z8(a,null,null)},
 dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
 Ny:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
 wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.wF(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
+Ah:function(a,b,c){return this.Y6(C.cd,a,b,c)},
+YX:function(a){return this.Ah(a,null,null)},
 tQ:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
@@ -12884,7 +12926,7 @@
 $isTJ:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
@@ -12916,12 +12958,12 @@
 if(typeof z!=="number")return H.s(z)
 return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gAY",0,0,69],
+bu:[function(a){return this.oc},"$0","gAY",0,0,71],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,69],
+"^":"a;OR<,G1>,iJ,Fl<,fi,kc>,I4<",
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,71],
 $isHV:true,
 static:{"^":"xO"}}}],["","main.dart",,F,{
 "^":"",
@@ -12935,21 +12977,21 @@
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
 $.Ib().MM.ml(G.vN()).ml(new F.e448())},
 e447:{
-"^":"TpZ:162;",
+"^":"TpZ:161;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,161,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 e448:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,14,"call"],
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
@@ -12980,7 +13022,7 @@
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJm:function(a){var z,y
+static:{yU:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13034,8 +13076,8 @@
 Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,112,1,103,104],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,2,102,103],
+wY6:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13081,8 +13123,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
+C.lx.ZL(a)
+C.lx.XI(a)
 return a}}},
 V38:{
 "^":"uL+Pi;",
@@ -13093,7 +13135,7 @@
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,57],
+GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13183,7 +13225,7 @@
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,163,1,103,104],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,162,2,102,103],
 static:{Ow:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13211,7 +13253,7 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.ut("targetManager"),Q.ch(null,null),null,null,null,null)
-x.Ff()
+x.XA()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,null,a,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
@@ -13225,8 +13267,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
+C.YpE.ZL(a)
+C.YpE.XI(a)
 return a}}},
 V44:{
 "^":"uL+Pi;",
@@ -13246,7 +13288,7 @@
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 Lq:[function(a,b){if(a.tB!=null)this.Tt(a)
-else this.Q4(a)},"$1","gj8",2,0,20,57],
+else this.Q4(a)},"$1","gj8",2,0,19,59],
 Tt:function(a){var z
 if(a.tB==null)return
 z=a.kR
@@ -13259,25 +13301,25 @@
 this.yY(a)
 z=a.tB
 if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,18],
-cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,163,2,103,104],
-KN:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,164,165],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,166,167],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,134,21],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,168,169],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,168,169],
+return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,17],
+cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,162,143,102,103],
+If:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gn0",2,0,163,164],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,165,166],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,133,20],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,167,168],
+MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,167,168],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,168,169],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,168,169],
-Oj:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,168,169],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,168,169],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,168,169],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,167,168],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,167,168],
+KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,167,168],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,167,168],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,167,168],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,168,169],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,168,169],
-Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,168,169],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,167,168],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,167,168],
+Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,167,168],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13287,17 +13329,17 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
 $isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
-Yj:{
+OC:{
 "^":"a;",
 sP:function(a,b){},
-$isYj:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isOC:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -13306,8 +13348,8 @@
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,18],
-dt:[function(a){a.AP=null},"$0","gym",0,0,18],
+k0:[function(a){},"$0","gqw",0,0,17],
+Yd:[function(a){a.AP=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -13315,7 +13357,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,121],
+return!0}return!1},"$0","gDx",0,0,120],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13332,7 +13374,7 @@
 $isyj:true},
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,69],
+bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
 $isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 N0:function(){var z,y,x,w,v,u,t,s,r,q
@@ -13362,36 +13404,36 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"TpZ:170;a",
+"^":"TpZ:169;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.aR(z))},
 $isEH:true},
 aR:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){this.a.a=!1
 O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"TpZ:30;b",
+"^":"TpZ:29;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 HF:{
-"^":"TpZ:72;c,d,e,f",
+"^":"TpZ:74;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"TpZ:171;UI",
+"^":"TpZ:170;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 iu:{
-"^":"TpZ:13;bK,Gq,Rm,w3",
+"^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,67,"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -13410,26 +13452,26 @@
 if(t>=u.length)return H.e(u,t)
 u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
 p=J.xC(d[q],s.t(a,J.Hn(u.g(b,t),1)))
-o=x[v]
-n=x[r]
+o=x[r]
+n=x[v]
 m=t-1
 if(p){if(v>=w)return H.e(x,v)
 if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
+if(m>=o.length)return H.e(o,m)
+p=o[m]
 if(t>=n.length)return H.e(n,t)
-p=n[t]
+n[t]=p}else{if(r>=w)return H.e(x,r)
+if(t>=o.length)return H.e(o,t)
+p=o[t]
 if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
+o=n.length
+if(m>=o)return H.e(n,m)
+m=n[m]
 if(typeof m!=="number")return m.g()
 m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
+if(t>=o)return H.e(n,t)
+n[t]=m}}return x},
 kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -13604,7 +13646,7 @@
 bu:[function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
 y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,69],
+return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,71],
 $isDA:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -13618,12 +13660,12 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
+kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,V2:dUC%,me:pt%",
+"^":"a;R9:ro%,V2:fb%,me:pt%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
@@ -13640,11 +13682,11 @@
 $.Oo=z}z.push(a)
 $.ax=$.ax+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
 w=$.cp().eA.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
+y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,17],
+L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.gV2(a)==null||!this.gnz(a))return!1
@@ -13662,7 +13704,7 @@
 this.gme(a).push(b)},
 $isd3:true},
 X6:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -13672,17 +13714,17 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
+J.iy(z).u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
-Sk:{
+xhq:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.ls,this.DA,b)},
-bu:[function(a){return"#<"+new H.cu(H.wO(this),null).bu(0)+" value: "+H.d(this.DA)+">"},"$0","gAY",0,0,69]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:function(a){return this.ra},
+sP:function(a,b){this.ra=F.Wi(this,C.ls,this.ra,b)},
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
+"^":"er;b3@,iT,ao,AP,fn",
 gQV:function(){var z=this.iT
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
 this.iT=z}z.toString
@@ -13740,7 +13782,7 @@
 z=x==null?z!=null:x!==z}else z=!1
 if(z&&y>0){z=this.ao
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.na(this.ao,b,c)},
+this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
 z=this.ao
 y=z.length
@@ -13791,7 +13833,7 @@
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
+oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
@@ -13801,7 +13843,7 @@
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.na(z,b,c)
+H.h8(z,b,c)
 this.On(x,z.length)
 z=this.iT
 if(z!=null){w=z.iE
@@ -13847,7 +13889,7 @@
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,121],
+return!0}return!1},"$0","gL6",0,0,120],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13880,11 +13922,11 @@
 C.Nm.sB(a,l)
 H.qG(a,n,l,a,u)
 H.qG(a,w,n,t,0)}}}}},
-uFU:{
+er:{
 "^":"ark+Pi;",
 $isd3:true},
 xb:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -13893,7 +13935,7 @@
 bu:[function(a){var z
 if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,69],
+return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
 $isya:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
@@ -13943,7 +13985,7 @@
 F.Wi(this,C.Wn,y,0)
 this.G8()}z.V1(0)},
 aN:function(a,b){return this.Zp.aN(0,b)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
 $isqC:true,
@@ -13956,39 +13998,39 @@
 return y}}},
 zT:{
 "^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
 "^":"",
 Qw:{
-"^":"Yj;pQ,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
+"^":"OC;BS,Or,HM,cS,h5",
+Jy:function(a){return this.Or.$1(a)},
+Kv:function(a){return this.cS.$1(a)},
 TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.pQ,this.gNV()))
-this.Cg=z
+this.cS=b
+z=this.Jy(J.mu(this.BS,this.gjr()))
+this.h5=z
 return z},
-rJm:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gNV",2,0,13,58],
-xO:function(a){var z=this.pQ
+EJ:[function(a){var z=this.Jy(a)
+if(J.xC(z,this.h5))return
+this.h5=z
+return this.Kv(z)},"$1","gjr",2,0,12,60],
+xO:function(a){var z=this.BS
 if(z!=null)J.yd(z)
-this.pQ=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.pQ))
-this.Cg=z
+this.BS=null
+this.Or=null
+this.HM=null
+this.cS=null
+this.h5=null},
+gP:function(a){var z=this.Jy(J.Vm(this.BS))
+this.h5=z
 return z},
-sP:function(a,b){J.ta(this.pQ,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.BS,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Hj:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -13997,14 +14039,14 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
 if(z)return J.UQ(a,$.Mg().ep.t(0,b))
 try{z=a
 y=b
 x=$.cp().eA.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Jk(a)
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
 v=$.mX().F1(z,C.OV)
 if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.Nd()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
@@ -14017,10 +14059,10 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
 if(z){J.kW(a,$.Mg().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Jk(a)
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
 if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
 if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
@@ -14051,14 +14093,14 @@
 this.zc(this.Wf,z)
 return!0},
 tF:function(){return this.hQ(!1)},
-$isYj:true},
+$isOC:true},
 Tv:{
 "^":"a;OK",
 gB:function(a){return this.OK.length},
 gl0:function(a){return this.OK.length===0},
 gPu:function(){return!0},
 bu:[function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},"$0","gAY",0,0,69],
+return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
@@ -14130,19 +14172,19 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 f7:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 TV:{
 "^":"Tv;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 DOe:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
@@ -14190,7 +14232,7 @@
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
-if(s===C.dV){H.Go(t,"$isYj")
+if(s===C.dV){H.Go(t,"$isOC")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
 if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
 continue}w=this.Wf
@@ -14204,23 +14246,23 @@
 this.Aw(this.Wf,y,w)
 return!0},
 tF:function(){return this.hQ(!1)},
-$isYj:true},
+$isOC:true},
 Zu:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.GX!=null&&z.SG()},"$1",null,2,0,null,14,"call"],
+return z.GX!=null&&z.SG()},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Yj;cX<",
+"^":"OC;cX<",
 CC:function(){return this.GX.$0()},
 K0:function(a){return this.GX.$1(a)},
 cF:function(a,b){return this.GX.$2(a,b)},
 Mm:function(a,b,c){return this.GX.$3(a,b,c)},
 ga8:function(){return this.GX!=null},
 TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
+if(X.fy(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
 this.GX=b
 this.vA=P.J(this.gIn(),X.RI(b))
 this.NJ(0)
@@ -14243,17 +14285,17 @@
 case 3:this.Mm(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
 zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
 "^":"a;kTd,JD,rS,HN,op",
 TR:function(a,b){this.JD.u(0,b.gcX(),b)
 b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.kl(b.gQV())
-if(!!z.$isd3)this.kl(z.gqh(b))},"$1","gTT",2,0,172,93],
-kl:function(a){var z,y
+dt:[function(a,b){var z=J.x(b)
+if(!!z.$iswn)this.wq(b.gQV())
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,171,92],
+wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
 y=z!=null?z.Rz(0,a):null
@@ -14267,11 +14309,11 @@
 this.rS=z
 for(y=this.JD,y=H.VM(new P.ro(y),[H.Oq(y,0),H.Oq(y,1)]),x=y.Fb,w=H.Oq(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Oq(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
 if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
-this.HN=null},"$0","gTh",0,0,18],
-t9:[function(a){var z,y
+this.HN=null},"$0","gTh",0,0,17],
+F5:[function(a){var z,y
 for(z=this.JD,z=H.VM(new P.ro(z),[H.Oq(z,0),H.Oq(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,173],
+P.rb(this.gTh(this))},"$1","gCP",2,0,19,172],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
@@ -14288,10 +14330,10 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
+return x}return a},"$1","Ft",2,0,12,20],
 yx:{
-"^":"TpZ:80;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,131,64,"call"],
+"^":"TpZ:79;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,66,"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 YG:function(a,b,c){if(a==null||$.AM()==null)return
@@ -14308,14 +14350,14 @@
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 $.QJ().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
 z=$.Mg().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
 x9:function(a,b){var z,y,x,w
@@ -14356,7 +14398,7 @@
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
 J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
 XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,kX,t4",
+"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,Ve,t4",
 gZf:function(){var z,y
 z=J.Eh(this.FL,"template")
 if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
@@ -14379,7 +14421,7 @@
 this.Bj=y}}z=this.t5
 this.pI(z)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
 u=$.Mg().Nz.t(0,v)
 t=L.hk([u])
@@ -14416,7 +14458,7 @@
 this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
+this.q5=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
 OL:function(){var z,y,x,w,v,u,t,s
 z=this.Qk
@@ -14424,25 +14466,25 @@
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
 z.mK(x,s,z.gPZ(x))}}},
 oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.oP(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
+z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=w+"\n\n"}return z.vM},
 J3:function(a,b){var z
@@ -14471,19 +14513,19 @@
 $isXP:true,
 static:{"^":"Kb"}},
 Zd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ishG},
 $isEH:true},
 Da:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvn()},
 $isEH:true},
 eY:{
-"^":"TpZ:80;a",
-$2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
+"^":"TpZ:79;a",
+$2:function(a,b){if(C.pv.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
@@ -14491,19 +14533,19 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ua:{
-"^":"TpZ:13;a",
+Vi:{
+"^":"TpZ:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
 XUG:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"TpZ:174;a",
+"^":"TpZ:173;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
@@ -14526,11 +14568,11 @@
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.fE.t(0,x)
+w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
-return new A.liz(z,this,a)}},
+return new A.na(z,this,a)}},
 l5:{
-"^":"TpZ:13;a,b,c,d",
+"^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
@@ -14541,10 +14583,10 @@
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
 y=y.gSd(a)
 z=z.a
-J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
+J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-liz:{
-"^":"TpZ:178;a,b,c",
+na:{
+"^":"TpZ:177;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
@@ -14552,10 +14594,10 @@
 w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Oq(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,175,176,177,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
 d6:{
-"^":"Yj;Jq,ED",
+"^":"OC;Jq,ED",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
 xO:function(a){var z=this.Jq
@@ -14579,7 +14621,7 @@
 C.Ki.ZL(a)
 C.Ki.XI(a)
 return a}}},
-jpR:{
+re:{
 "^":"Bo+zs;XG:SD=",
 $iszs:true,
 $isvy:true,
@@ -14588,7 +14630,7 @@
 $isPZ:true,
 $isKV:true},
 TR0:{
-"^":"jpR+Pi;",
+"^":"re+Pi;",
 $isd3:true},
 zs:{
 "^":"a;XG:SD=",
@@ -14657,7 +14699,7 @@
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
 y.u(0,J.eS(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
@@ -14673,9 +14715,9 @@
 w=$.cp().jD(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Jk(w):v)
+u=Z.Zh(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,179],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,178],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14704,16 +14746,16 @@
 w=J.mu(c,v.gap())
 v.dY=w
 $.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.SB(a))==null){x=P.Fl(null,null)
-J.nC(M.SB(a),x)}J.kW(J.C5(M.SB(a)),b,v)}u=a.IX.gBj()
+if($.rK&&!0){if(J.QE(M.SB(a))==null){x=P.Fl(null,null)
+J.nC(M.SB(a),x)}J.kW(J.QE(M.SB(a)),b,v)}u=a.IX.gBj()
 y=y.goc(z)
 t=$.Mg().ep.t(0,y)
 if(u!=null&&u.tg(0,t))this.JY(a,t)
 return v}},
 Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.SB(a))},
+gCd:function(a){return J.QE(M.SB(a))},
 sCd:function(a,b){J.nC(M.SB(a),b)},
-gmSA:function(a){return J.qb(M.SB(a))},
+gmSA:function(a){return J.Zz(M.SB(a))},
 d9:function(a){var z,y
 if(a.Uk===!0)return
 $.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
@@ -14726,7 +14768,7 @@
 H.bQ(a.Cc,this.ghb(a))
 a.Cc=[]
 this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
+a.Uk=!0},"$0","gJg",0,0,17],
 oW:function(a){var z
 if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
 return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
@@ -14744,34 +14786,31 @@
 for(y=H.VM(new P.fG(z),[H.Oq(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Oq(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,180],
+FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,179],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,181,173],
+if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,180,172],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.dnO()
+if(!!J.x(d).$iswn){x=$.mj()
 if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dnO()
+this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.mj()
 if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.ps(new A.Y0(a,d,y))
-w.fm(0,null)
-w.y5(null)
+w=c.gQV().ht(new A.Y0(a,d,y),null,null,!1)
 x=H.d(b)+"__array"
 v=a.q9
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
 a.q9=v}v.u(0,x,w)}},
 dvq:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,182],
+if(y!=null)J.yd(y)}},"$1","ghb",2,0,181],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14815,21 +14854,21 @@
 $isPZ:true,
 $isKV:true},
 bl:{
-"^":"TpZ:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Sv:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:function(){return this.b},
 $isEH:true},
 N4:{
-"^":"TpZ:80;a,b,c,d,e,f",
+"^":"TpZ:79;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -14845,25 +14884,25 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,94,57,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,59,"call"],
 $isEH:true},
 Y0:{
-"^":"TpZ:13;a,b,c",
+"^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,183,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 SX:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
 H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.Oq(y,0)]).Zz()},
 $isEH:true},
 lK:{
-"^":"Yj;I6,iU,q0,Jq,dY",
+"^":"OC;I6,iU,q0,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,19,60],
 HX:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
@@ -14872,7 +14911,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,181,173],
+return}}},"$1","gXQ",2,0,180,172],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14898,36 +14937,36 @@
 if(z!=null){z.ed()
 this.ih=null}}},
 K3:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 if(z.ih!=null||z.lS!=null){z.nY(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
+z.Ws()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){var z=$.iF().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"TpZ:186;a,b",
+"^":"TpZ:185;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,184,56,185,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,183,58,184,"call"],
 $isEH:true},
 zR:{
-"^":"TpZ:72;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+"^":"TpZ:74;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
 y=this.d
 x=this.e
 w=this.f
-v=$.rk()
+v=$.Ak()
 u=P.Fl(null,null)
 t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
 $.vE().u(0,y,t)
@@ -14938,7 +14977,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.NA(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.vc(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -14951,23 +14990,28 @@
 p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
 o=z.Fi
-if(o!==""){n=z.ku
+if(o.length!==0){if(z.Bo!=null){n=z.ux
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
+l=z.IE!=null?z.gtp(z):null}else{n=""
+m=null
+l=null}k=p.KO(z.pO)
+j=z.Ev
+if(j!=null);else j=null}else{o=p.Fi
+if(z.Bo!=null){n=z.ux
 m=z.gJf(z)
-l=z.gkb(z)
+l=P.JF(z.IE!=null?z.gtp(z):null,o)
 k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
+j=z.Ev
+if(j!=null);else j=null}else{v=z.pO
 if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.yM(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
+j=z.Ev
+if(j!=null);else j=p.Ev}else{k=C.xB.nC(v,"/")?p.KO(v):p.KO(p.yM(p.pO,v))
+j=z.Ev
+if(j!=null);else j=null}n=p.ux
+m=p.Bo
+l=p.IE}}i=z.bM
+if(i!=null);else i=null
+t.t4=new P.q5(m,l,k,o,n,j,i,null,null)
 z=t.gZf()
 A.YG(z,y,w!=null?J.O6(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
@@ -14975,16 +15019,16 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
 "^":"",
 q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"wc;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
 gG5:function(a){return J.fx(a.Hf)},
-sG5:function(a,b){J.NA(a.Hf,b)},
+sG5:function(a,b){J.vc(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
 gUj:function(a){return J.fx(a.Hf)},
 ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
@@ -14993,11 +15037,11 @@
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.NA(a.Hf,new Y.zp(a,z,null))
+J.vc(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
-static:{zE:function(a){var z,y
+static:{Ifw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -15018,21 +15062,21 @@
 $isPZ:true,
 $isKV:true},
 wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
+"^":"GLL+d3;R9:ro%,V2:fb%,me:pt%",
 $isd3:true},
 lkK:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,14,"call"],
+J.mI(z,new Y.dv(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-Mrx:{
-"^":"TpZ:13;b",
+dv:{
+"^":"TpZ:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
+y.Tj(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
 "^":"Li;dq,Mn,cJ",
@@ -15045,63 +15089,63 @@
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Ra:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return a},
 $isEH:true},
 wJY:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 zOQ:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 W6o:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
 MdQ:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
-dA:[function(a){var z=J.x(a)
+Rj:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
+return z},"$1","PG",2,0,52,66],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(z.gvc(a),new T.k9(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","kR",2,0,13,65],
+return z},"$1","Bn",2,0,52,66],
+Fm:[function(a){return a},"$1","kR",2,0,12,67],
 IK:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.xC(J.UQ(this.a,a),!0)},
 $isEH:true},
 k9:{
-"^":"TpZ:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,131,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
-cP:{
+QB:{
 "^":"VE;VA,jw,iX,WK,cJ",
 US:function(a,b,c){var z,y,x,w
 z={}
-y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
+y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.Kg(a,0,0,null),null)
 x=new U.Fs()
 x=new T.FX(x,y,null,null)
 y=y.zl()
@@ -15112,12 +15156,12 @@
 if(M.CF(c)){y=J.x(b)
 y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
 if(y){z=J.x(w)
-if(!!z.$isDI)return new T.Xyb(this,w.gF5(),z.gkZ(w))
-else return new T.Ddj(this,w)}z.a=null
+if(!!z.$isb4)return new T.qb(this,w.gxG(),z.gkZ(w))
+else return new T.Xyb(this,w)}z.a=null
 y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.H1B(z,this,w)},
+if(y&&J.xC(b,"class"))z.a=T.PG()
+else if(y&&J.xC(b,"style"))z.a=T.Bn()
+return new T.Ddj(z,this,w)},
 CE:function(a){var z=this.WK.t(0,a)
 if(z==null)return new T.r6(this,a)
 return new T.Wb(this,a,z)},
@@ -15147,131 +15191,131 @@
 return this.iX.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.iX.t(0,a)
 return x!=null?x:K.dZ(b,this.jw)}else return this.Wg(y.gBy(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+static:{"^":"DI",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.cP(b,x,z,y,null)}}},
-Xyb:{
-"^":"TpZ:187;b,c,d",
+x.FV(0,C.c7o)
+return new T.QB(b,x,z,y,null)}}},
+qb:{
+"^":"TpZ:186;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
 z.WK.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
-Ddj:{
-"^":"TpZ:187;e,f",
+Xyb:{
+"^":"TpZ:186;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
-H1B:{
-"^":"TpZ:187;a,UI,bK",
+Ddj:{
+"^":"TpZ:186;a,UI,bK",
 $3:[function(a,b,c){var z,y
 z=this.UI.ey(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
 r6:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
 x=z.iX.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,175,"call"],
+return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,174,"call"],
 $isEH:true},
 Wb:{
-"^":"TpZ:13;c,d,e",
+"^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
 x=z.iX.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,175,"call"],
+else return z.fO(y).t1(w,a)},"$1",null,2,0,null,174,"call"],
 $isEH:true},
 tI:{
-"^":"Yj;IM,eI,kG,Tu,T7,z0,IZ",
+"^":"OC;IM,eI,kG,Tu,T7,zh,IZ",
 bh:function(a){return this.eI.$1(a)},
 tC:function(a){return this.Tu.$1(a)},
 b9:[function(a,b){var z,y
 z=this.IZ
 y=this.bh(a)
 this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,188,189,64,190],
+if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,187,188,66,189],
 gP:function(a){if(this.Tu!=null)return this.IZ
 return T.jF(this.kG,this.IM,this.eI)},
 sP:function(a,b){var z,y,x,w,v
 try{z=K.FH(this.kG,b,this.IM,!1)
 this.b9(z,!0)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.kG)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v
 if(this.Tu!=null)throw H.b(P.w("already open"))
 this.Tu=b
 x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Pt(null,null)
+x.Eo(null,null)
 w=this.kG.RR(0,new K.Oy(x))
-this.z0=w
+this.zh=w
 x=w.gUO().yI(this.gNB())
 x.fm(0,new T.pI(this))
 this.T7=x
-try{x=this.z0
+try{x=this.zh
 J.okV(x,new K.Edh(this.IM))
 x.gK3()
-this.b9(this.z0.gK3(),!0)}catch(v){x=H.Ru(v)
+this.b9(this.zh.gK3(),!0)}catch(v){x=H.Ru(v)
 z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.z0)+"': "+H.d(z),y)}return this.IZ},
+y=new H.oP(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zh)+"': "+H.d(z),y)}return this.IZ},
 xO:function(a){var z,y
 if(this.Tu==null)return
 this.T7.ed()
 this.T7=null
 this.Tu=null
-z=$.wb()
-y=this.z0
+z=$.At()
+y=this.zh
 z.toString
 J.okV(y,z)
-this.z0=null},
+this.zh=null},
 static:{jF:function(a,b,c){var z,y,x,w,v
 try{z=J.okV(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
-"^":"TpZ:80;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,155,"call"],
+"^":"TpZ:79;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zh)+"': "+H.d(a),b)},"$2",null,4,0,null,2,154,"call"],
 $isEH:true},
 yy:{
 "^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
-"^":"Sk;vq,DA,AP,fn",
+"^":"xhq;vq,ra,AP,fn",
 vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
+$asxhq:function(a){return[null]},
 static:{pe:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 fg:{
 "^":"TpZ;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,94,"call"],
+z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 FH:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
@@ -15282,10 +15326,10 @@
 v=!1}else if(!!y.$iszX){w=a.gTf()
 x=a.gJn()
 v=!0}else{if(!!y.$isrX){w=a.gTf()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
+x=y.goc(a)}else{if(d)throw H.b(K.xn("Expression is not assignable: "+H.d(a)))
 return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);y.G();){u=y.lo
 J.okV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
+if(d)throw H.b(K.xn("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
 if(t==null)return
 if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
@@ -15297,91 +15341,91 @@
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
 x=new K.Ph(z,y)
-if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+if(y.x4(0,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
-w11:{
-"^":"TpZ:80;",
+w12:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
-w12:{
-"^":"TpZ:80;",
+w13:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
-w13:{
-"^":"TpZ:80;",
+w14:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w14:{
-"^":"TpZ:80;",
+w15:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.X9(a,b)},
 $isEH:true},
-w15:{
-"^":"TpZ:80;",
+w16:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.hh(a,b)},
 $isEH:true},
-w16:{
-"^":"TpZ:80;",
+w17:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
-w17:{
-"^":"TpZ:80;",
+w18:{
+"^":"TpZ:79;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
-w18:{
-"^":"TpZ:80;",
+w19:{
+"^":"TpZ:79;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
-w19:{
-"^":"TpZ:80;",
+w20:{
+"^":"TpZ:79;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
-w20:{
-"^":"TpZ:80;",
+w21:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
-w21:{
-"^":"TpZ:80;",
+w22:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
-w22:{
-"^":"TpZ:80;",
+w23:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
-w23:{
-"^":"TpZ:80;",
+w24:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
-w24:{
-"^":"TpZ:80;",
+w25:{
+"^":"TpZ:79;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
-w25:{
-"^":"TpZ:80;",
+w26:{
+"^":"TpZ:79;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
-w26:{
-"^":"TpZ:80;",
+w27:{
+"^":"TpZ:79;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
-$isEH:true},
-w0:{
-"^":"TpZ:13;",
-$1:function(a){return a},
+throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w5:{
-"^":"TpZ:13;",
-$1:function(a){return J.jzo(a)},
+"^":"TpZ:12;",
+$1:function(a){return a},
 $isEH:true},
 w10:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
+$1:function(a){return J.jzo(a)},
+$isEH:true},
+w11:{
+"^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 GK:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 return new K.PO(this,a,b)},
 $isGK:true,
 $isCo:true,
@@ -15392,11 +15436,11 @@
 if(J.xC(b,"this"))return this.k8
 z=$.Mg().Nz.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
 return!!J.x(y).$iswS?B.pe(y,null):y},
 AC:function(a){return!J.xC(a,"this")},
-bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,69]},
+bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,71]},
 PO:{
 "^":"GK;eT>,Z0,P>",
 gk8:function(a){var z=this.eT
@@ -15407,7 +15451,7 @@
 return!!J.x(z).$iswS?B.pe(z,null):z}return this.eT.t(0,b)},
 AC:function(a){if(J.xC(this.Z0,a))return!1
 return this.eT.AC(a)},
-bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,69]},
+bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,71]},
 Ph:{
 "^":"GK;eT>,Z3<",
 gk8:function(a){return this.eT.k8},
@@ -15417,7 +15461,7 @@
 AC:function(a){if(this.Z3.x4(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,69]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
 Ay0:{
 "^":"a;bO?,Xl<",
 gUO:function(){var z=this.k6
@@ -15439,7 +15483,7 @@
 if(y==null?z!=null:y!==z){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(y)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,69],
+bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,71],
 $isIp:true},
 Edh:{
 "^":"cfS;qu",
@@ -15447,7 +15491,7 @@
 me:{
 "^":"cfS;",
 xn:function(a){a.pu()},
-static:{"^":"ln"}},
+static:{"^":"b3"}},
 GQ:{
 "^":"P55;qu",
 W9:function(a){return J.ZH(this.qu)},
@@ -15461,19 +15505,19 @@
 CU:function(a){var z=J.okV(a.gTf(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gSf(a)
 v=$.Mg().Nz.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
+tx:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
 for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=y.lo
@@ -15484,7 +15528,7 @@
 z=a.gkp(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.Rab().t(0,z)
+w=$.YP().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
@@ -15492,11 +15536,11 @@
 return w.$2(y,x)},
 xN:function(a){var z,y
 z=J.okV(a.gwz(),this)
-y=$.Ii().t(0,a.gkp(a))
+y=$.EU().t(0,a.gkp(a))
 if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
 RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+e5:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
 xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZGj",
@@ -15514,24 +15558,24 @@
 z.sbO(x)
 y.sbO(x)
 return x},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
-oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+tx:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
@@ -15546,7 +15590,7 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.UW(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -15564,22 +15608,22 @@
 y.sbO(w)
 x.sbO(w)
 return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+e5:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
 xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 XV:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 Xs:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
@@ -15588,8 +15632,8 @@
 "^":"Ay0;KL,bO,tj,Xl,k6",
 Qh:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
+$asAy0:function(){return[U.WH]},
+$isWH:true,
 $isIp:true},
 z0:{
 "^":"Ay0;KL,bO,tj,Xl,k6",
@@ -15597,7 +15641,7 @@
 return z.gP(z)},
 Qh:function(a){var z=this.KL
 this.Xl=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
+RR:function(a,b){return b.tx(this)},
 $asAy0:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
@@ -15610,18 +15654,18 @@
 $isc0:true,
 $isIp:true},
 Hv:{
-"^":"TpZ:13;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,94,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ev:{
 "^":"Ay0;Rl>,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
-Ku:{
-"^":"TpZ:80;",
+Kv:{
+"^":"TpZ:79;",
 $2:function(a,b){J.kW(a,J.A6(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
@@ -15651,12 +15695,12 @@
 $isfp:true,
 $isIp:true},
 V8:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 GC:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,KL,bO,tj,Xl,k6",
@@ -15664,7 +15708,7 @@
 return z.gkp(z)},
 Qh:function(a){var z,y
 z=this.KL
-y=$.Ii().t(0,z.gkp(z))
+y=$.EU().t(0,z.gkp(z))
 if(J.xC(z.gkp(z),"!")){z=this.wz.gXl()
 this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
 this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
@@ -15672,13 +15716,13 @@
 $asAy0:function(){return[U.cJ]},
 $iscJ:true,
 $isIp:true},
-kyp:{
+UW:{
 "^":"Ay0;Bb>,T8>,KL,bO,tj,Xl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.Rab().t(0,z.gkp(z))
+y=$.YP().t(0,z.gkp(z))
 if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
 x=this.T8.gXl()
@@ -15692,16 +15736,16 @@
 $isuku:true,
 $isIp:true},
 P8:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
 "^":"Ay0;dc<,Sl<,ru<,KL,bO,tj,Xl,k6",
 Qh:function(a){var z=this.dc.gXl()
 this.Xl=(z==null?!1:z)===!0?this.Sl.gXl():this.ru.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
 $isIp:true},
 vl:{
 "^":"Ay0;Tf<,KL,bO,tj,Xl,k6",
@@ -15721,12 +15765,12 @@
 $isrX:true,
 $isIp:true},
 fk:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 WKb:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;Tf<,Jn<,KL,bO,tj,Xl,k6",
@@ -15737,26 +15781,26 @@
 x=J.U6(z)
 this.Xl=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.zX]},
 $iszX:true,
 $isIp:true},
 tE:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.zw(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
-zw:{
-"^":"TpZ:13;d",
-$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,84,"call"],
+Ku:{
+"^":"TpZ:12;d",
+$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
-jai:{
-"^":"TpZ:13;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,183,"call"],
+z5:{
+"^":"TpZ:12;e,f,UI",
+$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 ey:{
-"^":"TpZ:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;bK",
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
 "^":"Ay0;Tf<,re<,KL,bO,tj,Xl,k6",
@@ -15775,26 +15819,26 @@
 this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
 if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Sr(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
+RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.Nb]},
 $isNb:true,
 $isIp:true},
 vQ:{
-"^":"TpZ:13;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,46,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
 Sr:{
-"^":"TpZ:191;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:190;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 ho:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 B03:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,69],
-static:{zq:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
+static:{xn:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -15816,19 +15860,19 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,192,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,191,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
-EO:{
+WH:{
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
-$isEO:true},
+$isWH:true},
 no:{
 "^":"Ip;P>",
-RR:function(a,b){return b.oD(this)},
+RR:function(a,b){return b.tx(this)},
 bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,69],
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Oq(this,0)],"$asno")
@@ -15838,7 +15882,7 @@
 c0:{
 "^":"Ip;hL<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
 giO:function(a){return U.pz(this.hL)},
@@ -15846,7 +15890,7 @@
 Mm:{
 "^":"Ip;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,69],
+bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15856,7 +15900,7 @@
 ae:{
 "^":"Ip;G3>,v4<",
 RR:function(a,b){return b.YV(this)},
-bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,69],
+bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15869,7 +15913,7 @@
 XC:{
 "^":"Ip;wz",
 RR:function(a,b){return b.LT(this)},
-bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
@@ -15877,7 +15921,7 @@
 fp:{
 "^":"Ip;P>",
 RR:function(a,b){return b.qs(this)},
-bu:[function(a){return this.P},"$0","gAY",0,0,69],
+bu:[function(a){return this.P},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15887,7 +15931,7 @@
 cJ:{
 "^":"Ip;kp>,wz<",
 RR:function(a,b){return b.xN(this)},
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15900,7 +15944,7 @@
 uku:{
 "^":"Ip;kp>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15911,25 +15955,25 @@
 x=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-mc:{
+Dc:{
 "^":"Ip;dc<,Sl<,ru<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
 x=J.v1(this.ru)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
+$isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5:function(){var z=this.Bb
+RR:function(a,b){return b.e5(this)},
+gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
 giO:function(a){var z,y
@@ -15938,14 +15982,14 @@
 y=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
-$isDI:true},
+$isb4:true},
 px:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.xt(this)},
-gF5:function(){var z=this.T8
+gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
-bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
@@ -15954,11 +15998,11 @@
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
-$isDI:true},
+$isb4:true},
 zX:{
 "^":"Ip;Tf<,Jn<",
 RR:function(a,b){return b.CU(this)},
-bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
@@ -15969,7 +16013,7 @@
 rX:{
 "^":"Ip;Tf<,oc>",
 RR:function(a,b){return b.fV(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15981,8 +16025,8 @@
 $isrX:true},
 Nb:{
 "^":"Ip;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,69],
+RR:function(a,b){return b.Y7(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15994,7 +16038,7 @@
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isNb:true},
 lc:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
@@ -16039,7 +16083,7 @@
 this.GI(5)
 u=this.Te()
 this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
+a=new U.Dc(a,v,u)}else a=this.T1(a)
 else break}return a},
 j6:function(a,b){var z,y
 z=J.x(b)
@@ -16092,9 +16136,9 @@
 switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
 if(J.xC(z,"this")){this.Bp()
 this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
+case 2:return this.qK()
 case 1:return this.ef()
 case 6:return this.DS()
 case 7:return this.xJ()
@@ -16129,7 +16173,7 @@
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"}")
 return new U.Mm(z)},
-jf:function(){var z,y,x
+qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
 this.rp.toString
 return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
@@ -16180,13 +16224,13 @@
 return y},
 xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,66,67],
+eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","BQ",2,0,68,69],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,71],
 $isAep:true},
 Bt:{
 "^":"mW;YR",
@@ -16204,13 +16248,13 @@
 $asmW:function(a){return[[K.Aep,a]]},
 $asQV:function(a){return[[K.Aep,a]]}},
 vR:{
-"^":"Dk;WS,wX,CD",
+"^":"Anv;WS,wX,CD",
 gl:function(){return this.CD},
 G:function(){var z=this.WS
 if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
 return!0}this.CD=null
 return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16220,10 +16264,10 @@
 default:return a}},
 qS:{
 "^":"a;fY>,P>,nS<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
 $isqS:true},
 xv:{
-"^":"a;MV,zy,jI,x0",
+"^":"a;MV,H4,jI,x0",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.jI
 this.x0=z.G()?z.Wn:null
@@ -16251,15 +16295,15 @@
 else x=!1
 if(x){t=u+"="
 this.x0=z.G()?z.Wn:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.lx.t(0,s)))
+y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
+y.push(new Y.qS(9,s,C.w0.t(0,s)))
 this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
 WG:function(){var z,y,x,w
 z=this.x0
 y=this.jI
 x=y.G()?y.Wn:null
 this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+for(w=this.H4;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
@@ -16271,7 +16315,7 @@
 this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
-y=this.zy
+y=this.H4
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16282,12 +16326,12 @@
 y.vM+=x
 this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
 else z.push(new Y.qS(2,v,0))
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
-y=this.zy
+y=this.H4
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
@@ -16301,7 +16345,7 @@
 else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
 qv:function(){var z,y,x,w
-z=this.zy
+z=this.H4
 z.KF(H.mx(46))
 y=this.jI
 while(!0){x=this.x0
@@ -16314,12 +16358,12 @@
 z.vM=""}},
 hA:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gay",2,0,193,155]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,192,154]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
@@ -16331,11 +16375,11 @@
 CU:function(a){J.okV(a.gTf(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
-ZR:function(a){var z
+Y7:function(a){var z
 J.okV(a.gTf(),this)
 if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-oD:function(a){this.xn(a)},
+tx:function(a){this.xn(a)},
 Zh:function(a){var z
 for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
@@ -16355,7 +16399,7 @@
 J.okV(a.gSl(),this)
 J.okV(a.gru(),this)
 this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
+e5:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
 xt:function(a){a.Bb.RR(0,this)
@@ -16382,12 +16426,12 @@
 siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,15,194],
-ib:[function(a,b,c){var z,y
+Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+mJ5:[function(a,b,c){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
-else z.scrollIntoView()}},"$2","gFG",4,0,195,196,197],
+else z.scrollIntoView()}},"$2","gFG",4,0,193,194,195],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
@@ -16397,10 +16441,10 @@
 dQ:function(a){var z=a.nu
 if(z!=null){z.disconnect()
 a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)},"$1","goL",2,0,20,57],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
-ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,20,57],
+GA:[function(a,b){this.mC(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
+Ti:[function(a,b){this.mC(a)},"$1","gRq",2,0,19,59],
+ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,19,59],
 mC:function(a){var z,y,x
 if(a.Oq!=null)return
 z=a.oX
@@ -16437,10 +16481,10 @@
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
+J.TG(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
@@ -16450,10 +16494,10 @@
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gTX()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
+fX:[function(a,b){this.r6(a,null)},"$1","glD",2,0,19,59],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,19,13],
 goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -16475,8 +16519,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
+C.Yj.ZL(a)
+C.Yj.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
@@ -16491,8 +16535,8 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,99],
+SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,98],
 static:{UF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -16509,7 +16553,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,68],
+Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -16624,7 +16668,7 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -16683,10 +16727,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
 $isaf:true},
 Bf:{
-"^":"TpZ:200;a",
+"^":"TpZ:198;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16694,25 +16738,25 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 n1:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5())},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,201]},
+O5:function(a){J.Me(a,new D.P5(this))},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,199]},
 P5:{
-"^":"TpZ:13;",
+"^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,202,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 Rv:{
-"^":"TpZ:200;a",
+"^":"TpZ:198;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,199,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16723,7 +16767,7 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return H.d(a)},"$1","gLc",2,0,163,196],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -16770,7 +16814,7 @@
 return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
 if(x!=null)return J.cI(x)
 return this.jU(a).ml(new D.lb(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,80],
+Nw:[function(a,b){return b},"$2","gcO",4,0,79],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.c5(this.gcO())
@@ -16823,74 +16867,74 @@
 "^":"xm+Pi;",
 $isd3:true},
 jy:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z,y
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,203,"call"],
+y.Iv(z)},"$1",null,2,0,null,201,"call"],
 $isEH:true},
 MZ:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,142,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 it:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
 z=this.b
 if(z==null)return J.cI(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
 lb:{
-"^":"TpZ:200;c,d",
+"^":"TpZ:198;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 QZ:{
-"^":"TpZ:72;e",
+"^":"TpZ:74;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,145,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 tm:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 bp:{
-"^":"TpZ:13;c",
+"^":"TpZ:12;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,87,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
 hc:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Yu:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cI(b)},
 $isEH:true},
 ER:{
 "^":"a;SP,XE>,OQ",
 eK:function(a){var z,y,x,w,v
 z=this.XE
-H.na(z,0,a)
+H.h8(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.OQ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
@@ -16927,14 +16971,16 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.lI,w=0;w<z;++w){v=this.QS
+if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
+x.push(u)}z=this.QS
+if(typeof z!=="number")return H.s(z)
+z=Array(z)
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.Hx=z
@@ -16982,7 +17028,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -17004,7 +17050,7 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,204,205],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,202,203],
 Nze:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
@@ -17014,7 +17060,7 @@
 if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,206,207],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,204,205],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -17116,7 +17162,7 @@
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
-m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
 aU:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
@@ -17159,7 +17205,7 @@
 "^":"PKX+Pi;",
 $isd3:true},
 iz:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
@@ -17170,36 +17216,36 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"TpZ:200;a,b",
+"^":"TpZ:198;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 Ea:{
-"^":"TpZ:72;c",
+"^":"TpZ:74;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,208,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
-AP:{
-"^":"TpZ:200;a",
+O5:{
+"^":"TpZ:198;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,158,"call"],
+return y},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
 gM8:function(){return!1},
-bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,71],
 bF:function(a,b,c){var z,y,x
 this.kT=!c
 z=this.RF
@@ -17230,13 +17276,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,121],
+return z.HC(z)},"$0","gDx",0,0,120],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,18],
-dt:[function(a){this.RF.AP=null
-return},"$0","gym",0,0,18],
+k0:[function(a){return},"$0","gqw",0,0,17],
+Yd:[function(a){this.RF.AP=null
+return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
 gnz:function(a){var z,y
@@ -17409,7 +17455,7 @@
 x.wf=F.Wi(x,C.yB,x.wf,z)
 y=J.ew(y.t(a,3),y.t(a,5))
 x.rT=F.Wi(x,C.hN,x.rT,y)},
-static:{"^":"jZx,xxx,Yn,SP7,S1,wXu,WVi,JQ"}},
+static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
 dy:{
 "^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gHt:function(a){return this.Gz},
@@ -17439,7 +17485,7 @@
 return z},
 gUm:function(){return!0},
 gM8:function(){return!1},
-bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,69],
+bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,71],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"user_name")
@@ -17501,9 +17547,9 @@
 $isd3:true},
 Hk:{
 "^":"a;zt",
-bu:[function(a){return this.zt},"$0","gAY",0,0,72],
+bu:[function(a){return this.zt},"$0","gAY",0,0,74],
 Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.YF()
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.is()
 case"kClosureFunction":return $.xq()
 case"kGetterFunction":return $.GG()
 case"kSetterFunction":return $.Kw()
@@ -17519,7 +17565,7 @@
 case"Tag":return $.zx()
 case"Reused":return $.MQ()}return $.lC()}}},
 Kp:{
-"^":"Zqa;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"S6L;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gEl:function(){return this.MD},
 sEl:function(a){this.MD=F.Wi(this,C.YV,this.MD,a)},
 gxH:function(){return this.EG},
@@ -17592,8 +17638,10 @@
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
-Zqa:{
-"^":"af+Pi;",
+wvY:{
+"^":"af+boh;"},
+S6L:{
+"^":"wvY+Pi;",
 $isd3:true},
 c2:{
 "^":"Pi;Rd<,a4>,x9,AP,fn",
@@ -17601,8 +17649,10 @@
 su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 $isc2:true},
 vx:{
-"^":"S6L;Gd>,d6,I0,U9,nE,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
+gxH:function(){return this.EG},
+sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){var z,y
@@ -17612,6 +17662,7 @@
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.P3))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -17625,8 +17676,11 @@
 this.bN=this.ct(this,C.YS,this.bN,w)
 w=this.wA
 this.GR=this.ct(this,C.Tc,this.GR,w)
+if(c)return
 this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))},
+this.PT(z.t(b,"tokenPosTable"))
+z=z.t(b,"owning_library")
+this.EG=F.Wi(this,C.If,this.EG,z)},
 PT:function(a){var z,y,x,w,v,u,t,s,r,q,p
 if(a==null)return
 z=this.y6
@@ -17692,10 +17746,10 @@
 for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
 x.su9(y.t(0,x.gRd()))}},
 $isvx:true},
-wvY:{
+Vlh:{
 "^":"af+boh;"},
-S6L:{
-"^":"wvY+Pi;",
+vix:{
+"^":"Vlh+Pi;",
 $isd3:true},
 Db:{
 "^":"a;Yu<,Du<,fF<",
@@ -17709,7 +17763,7 @@
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,69],
+return y.bu(z)},"$0","gkA",0,0,71],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -17729,18 +17783,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,69],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,71],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,209,74],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,207,76],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,209,74],
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,207,76],
 eQ:function(){var z,y,x,w
 y=J.It(this.L4," ")
 x=y.length
@@ -17767,7 +17821,7 @@
 static:{dJ:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,69],
+bu:[function(a){return this.uX},"$0","gAY",0,0,71],
 static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
@@ -17783,7 +17837,7 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $isD5:true},
 kx:{
-"^":"D3i;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -17797,9 +17851,9 @@
 gYG:function(){return this.MH},
 gUm:function(){return!0},
 gM8:function(){return!0},
-tx:[function(a){var z,y
+p7:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,210,211],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,208,209],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17902,24 +17956,24 @@
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
 static:{RA:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
-D3i:{
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.zH(z.MO)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,212,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,210,"call"],
 $isEH:true},
 Cq:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 l8R:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,69],
+bu:[function(a){return this.uX},"$0","gAY",0,0,71],
 static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
@@ -17928,7 +17982,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"Pqb;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"D3i;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -17941,7 +17995,7 @@
 giP:function(){return this.tO},
 gmd:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.EC},
+gVI:function(){return this.EC},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
@@ -17974,11 +18028,11 @@
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
 this.V8=z.t(b,"owner")}},
-Pqb:{
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -18081,9 +18135,9 @@
 else this.JS.u(0,y,x)
 return z.MM},
 W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,213,2],
+this.t3()},"$1","gxb",2,0,211,143],
 Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,20,214],
+this.t3()},"$1","gpU",2,0,19,212],
 MLC:[function(a){var z,y
 z=this.N
 y=Date.now()
@@ -18093,7 +18147,7 @@
 y=this.eG.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,20,214],
+y.OH(this)}},"$1","gqM",2,0,19,212],
 SS:[function(a){var z,y,x,w,v
 z=C.xr.kV(J.Qd(a))
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
@@ -18107,7 +18161,7 @@
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,215,2],
+y.OH(w)},"$1","ga9",2,0,213,143],
 z1:function(a){a.aN(0,new U.Fw(this))
 a.V1(0)},
 CS:function(){var z=this.S3
@@ -18125,10 +18179,10 @@
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
 this.S3.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,216],
+this.bs.send(y)},"$2","gkB",4,0,214],
 $isKM:true},
 Fw:{
-"^":"TpZ:217;a",
+"^":"TpZ:215;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
@@ -18150,7 +18204,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,75],
+J.KD(v,w)},"$1","gVx",2,0,19,216],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18267,7 +18321,7 @@
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
 return z}},
-rm:[function(a,b){var z,y,x
+ws:[function(a,b){var z,y,x
 this.pj(a)
 z=a.Ll
 if(z==null){N.QM("").To("Viewing null object.")
@@ -18275,7 +18329,7 @@
 x=this.Xq(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,13,57],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
 $isTi:true,
 static:{Gvt:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -18302,7 +18356,7 @@
 aV:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,20,57],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -18315,7 +18369,7 @@
 if(z==null)return"NULL REF"
 return J.O6(z)},
 gWw:function(a){return J.FN(this.goc(a))},
-static:{lKH:function(a){var z,y
+static:{Jv:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -18341,7 +18395,7 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,112,1,218,104],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,2,217,103],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18359,19 +18413,19 @@
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;wq,IW,Mg,nN,ER,Ja,WI,tu",
+"^":"a;c1,BH,Mg,nN,ER,Ja,MR,tu",
 WO:function(a,b){return this.tu.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.wq?"fields ":"")
-z.KF(this.IW?"properties ":"")
+z.KF(this.c1?"fields ":"")
+z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
 z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
+z.KF("annotations: "+H.d(this.MR))
 z.KF(this.tu!=null?"with matcher":"")
 z.KF(")")
-return z.vM},"$0","gAY",0,0,69]},
+return z.vM},"$0","gAY",0,0,71]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
@@ -18389,7 +18443,7 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.vM},"$0","gAY",0,0,69],
+return z.vM},"$0","gAY",0,0,71],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
@@ -18416,7 +18470,7 @@
 if(!!J.x(v).$isuq){u=w.gbx(y)
 u=$.mX().dM(u,v)}else u=!1
 if(u)return!0}}return!1},
-Cz:function(a){var z,y
+fy:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -18451,9 +18505,9 @@
 kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
 "^":"",
 Oj:{
-"^":"a;h2,AH,ZGj,YKH,Yp,af<,yQ"},
+"^":"a;LH,AH,ZGj,BJ,Yp,af<,yQ"},
 fH:{
-"^":"a;eA,vk,X9",
+"^":"a;eA,vk,Si",
 jD:function(a,b){var z=this.eA.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
@@ -18462,11 +18516,11 @@
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t
 z=null
-if(!!J.x(a).$isuq){this.X9.t(0,a)
+if(!!J.x(a).$isuq){this.Si.t(0,a)
 z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.Cz(z)
+if(d){w=X.fy(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
 c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
 u=v>=0?v:J.q8(c)
@@ -18475,13 +18529,12 @@
 throw t}else throw t}}},
 bY:{
 "^":"a;TB,WF,AZ",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
-x=J.x(y)
-if(x.n(y,b))return!0
+dM:function(a,b){var z,y
+if(a.n(0,b)||b.n(0,C.AP))return!0
+for(z=this.TB;!J.xC(a,C.AP);a=y){y=z.t(0,a)
+if(J.xC(y,b))return!0
 if(y==null){if(!this.AZ)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(y)+")"))}}return!1},
 UK:function(a,b){var z=this.F1(a,b)
 return z!=null&&z.fY===C.hU&&!z.Fo},
 n6:function(a,b){var z,y
@@ -18498,16 +18551,16 @@
 if(y==null){if(this.AZ)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
 if(x==null){if(!this.AZ)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.wq&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(!c.c1&&v.gZI())continue
+if(!c.BH&&v.gUd())continue
+if(c.ER&&J.dA(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
 if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
+u=c.MR
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 F1:function(a,b){var z,y,x,w,v
-for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+for(z=this.TB,y=this.WF;!J.xC(a,C.AP);a=v){x=y.t(0,a)
 if(x!=null){w=x.t(0,b)
 if(w!=null)return w}v=z.t(0,a)
 if(v==null){if(!this.AZ)return
@@ -18519,12 +18572,12 @@
 z.Ut(a)
 return z}}},
 m8:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
 "^":"a;GB",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,69],
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
@@ -18551,8 +18604,8 @@
 "^":"V51;ju,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,99],
-static:{HI:function(a){var z,y
+SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,19,98],
+static:{lt2:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -18561,8 +18614,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.uC.ZL(a)
-C.uC.XI(a)
+C.wB.ZL(a)
+C.wB.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
@@ -18592,7 +18645,7 @@
 z=b.appendChild(J.Ha(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
 if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.NA(M.SB(z),f)}M.mV(z,d,e,g)
+if(f!=null)J.vc(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18611,21 +18664,21 @@
 if(y)return
 a=w.gCi()
 if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
+H4o:function(a,b,c){if(c==null)return
 return new M.hg(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.j9(a.textContent,M.fX("text",a,b))
+if(!!z.$isbm){y=S.j9(a.textContent,M.H4o("text",a,b))
 if(y!=null)return new M.PW(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.fX(b,a,c))},
+return S.j9(z,M.H4o(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
 y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
+new W.E9(a).aN(0,new M.fE(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
@@ -18636,11 +18689,11 @@
 x=M.rJ(a,"bind",b)
 v.fu=x
 u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.fX("bind",a,b))
+v.zy=u
+if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
+fX:function(a,b,c,d){var z,y,x,w,v,u,t
 if(b.gqz()){z=b.HH(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
@@ -18658,7 +18711,7 @@
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
 oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.KH(a,b,c,d)
+if(b.gwD())return M.fX(a,b,c,d)
 if(b.gqz()){z=b.HH(0)
 if(z!=null)y=z.$3(d,c,!1)
 else{x=b.Pn(0)
@@ -18703,16 +18756,16 @@
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isMi)x=new M.L1(a,null,null)
-else if(!!w.$iszk)x=new M.ug(a,null,null)
+else if(!!w.$islpR)x=new M.ug(a,null,null)
 else if(!!w.$isHR)x=new M.VT(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isbm?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
@@ -18740,13 +18793,13 @@
 z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
 x=new M.BL(z,this,u)
 x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Bz(z,c):c},
+return $.rK?this.Un(z,c):c},
 Dt:[function(a){var z,y,x,w,v,u,t,s
 z=this.grF()
 y=J.RE(z)
 x=y.gBy(z)
 w=J.x(x)
-if(!!w.$iszk){v=J.C5(M.SB(x))
+if(!!w.$islpR){v=J.QE(M.SB(x))
 if(v!=null){u=J.UQ(v,"value")
 if(!!J.x(u).$isb2){t=x.value
 s=u}else{t=null
@@ -18754,15 +18807,15 @@
 s=null}}else{t=null
 s=null}y.sP(z,a==null?"":H.d(a))
 if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
+J.ta(s.gvt(),y)}},"$1","ge2",2,0,19,60]},
 BL:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
 $isEH:true},
 b2:{
-"^":"Yj;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
+"^":"OC;rF<,E3,vt<,jS",
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,19,60],
+Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.ta(this.vt,z)
 break
@@ -18771,11 +18824,11 @@
 x=y.gd4(z)
 J.ta(this.vt,x)
 if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.SB(w)),"checked")
+v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.SB(w)),"checked")
 if(v!=null)J.ta(v,!1)}break
 case"selectedIndex":z=J.Lr(this.rF)
 J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
+break}O.N0()},"$1","gCL",2,0,19,2],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.ta(this.vt,b)
@@ -18792,7 +18845,7 @@
 return
 case"value":J.ta(a,b==null?"":H.d(b))
 return}},IPt:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.JF(a,C.i3.Ph,!1),[null])
+if(!!z.$isQlt)return H.VM(new W.mw(a,C.i3.Ph,!1),[null])
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gEr(a)
 case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.v4("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
@@ -18803,11 +18856,11 @@
 z=new W.wi(z)
 return z.ad(z,new M.qx(a))}else{y=M.y9(a)
 if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
+x=J.Vj(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
 return x.ad(x,new M.y4(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Raa:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -18824,15 +18877,15 @@
 return x.length===1?C.U3:C.Nm.gTw(x)},
 $isEH:true},
 pp:{
-"^":"TpZ:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 LfS:{
-"^":"TpZ:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;b",
+$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 qx:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -18844,12 +18897,12 @@
 return z},
 $isEH:true},
 y4:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 LG:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return 0},
 $isEH:true},
 L1:{
@@ -18865,7 +18918,7 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return this.Bz(b,y)}},
+return this.Un(b,y)}},
 PW:{
 "^":"a;Cd>,ks>,jb>",
 ghK:function(){return!1},
@@ -18874,7 +18927,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
+"^":"PW;qd,fu,zy,Cd,ks,jb",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
@@ -18887,9 +18940,9 @@
 Vz:function(a){},
 gmSA:function(a){var z=this.Vw
 if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.qb(!!J.x(z).$isvy?z:M.SB(z))}else z=null
+z=J.Zz(!!J.x(z).$isvy?z:M.SB(z))}else z=null
 return z},
-Bz:function(a,b){var z,y
+Un:function(a,b){var z,y
 z=this.Cd
 if(z==null){z=P.Fl(null,null)
 this.Cd=z}y=z.t(0,a)
@@ -18913,9 +18966,9 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return this.Bz(b,y)}},
+return this.Un(b,y)}},
 DT:{
-"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,M5?,le,VZ,q8,rF,Cd,Vw",
+"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,ZV?,le,VZ,q8,rF,Cd,Vw",
 grF:function(){return this.rF},
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
@@ -18923,10 +18976,10 @@
 J.Vs(this.rF).MW.setAttribute("ref",z)
 this.aX()
 if(d)return
-return this.Bz("ref",c)},
+return this.Un("ref",c)},
 ZZ:function(a){var z=this.os
 if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
+if(a.qd==null&&a.fu==null&&a.zy==null){z=this.os
 if(z!=null){z.xO(0)
 this.os=null}return}z=this.os
 if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
@@ -18940,14 +18993,14 @@
 z=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
 this.q8=z}y=J.RE(z)
 if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.DH():c
+x=c==null?$.HT():c
 w=x.cJ
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.cJ=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
 x.cJ.u(0,z,v)}w=this.le
 if(w==null){u=J.Do(this.rF)
-w=$.tF()
+w=$.we()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
@@ -19013,18 +19066,18 @@
 z=this.Bx
 return z!=null?z:H.Go(this.rF,"$isOH").content},
 bt:function(a){var z,y,x,w,v,u,t
-if(this.M5===!0)return!1
+if(this.ZV===!0)return!1
 M.oR()
 M.hb()
-this.M5=!0
+this.ZV=!0
 z=!!J.x(this.rF).$isOH
 y=!z
 if(y){x=this.rF
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.rF)
 v=!!J.x(v).$isvy?v:M.SB(v)
-v.sM5(!0)
+v.sZV(!0)
 z=!!J.x(v.grF()).$isOH
 u=!0}else{x=this.rF
 w=J.RE(x)
@@ -19037,13 +19090,13 @@
 w.gQg(x).V1(0)
 w.wg(x)
 v=!!J.x(t).$isvy?t:M.SB(t)
-v.sM5(!0)
+v.sZV(!0)
 z=!!J.x(v.grF()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
 u=!1}if(!z)v.sBx(J.bs(M.TA(v.grF())))
 if(a!=null)v.sq4(a)
 else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
+else M.Af(J.NQ(v))
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
@@ -19070,14 +19123,14 @@
 break}}return y},O1:function(a,b,c){var z,y,x,w
 z=J.NQ(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.yi()
-y=J.MK(a,$.Ze())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
 if($.xV===!0)return
 $.xV=!0
@@ -19085,29 +19138,29 @@
 if(!!J.x(z).$isOH){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
+J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,219,"call"],
+z.aX()},"$1",null,2,0,null,218,"call"],
 $isEH:true},
 yi:{
-"^":"TpZ:20;",
-$1:function(a){if(!M.SB(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
+"^":"TpZ:19;",
+$1:function(a){if(!M.SB(a).bt(null))M.Af(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
 $isEH:true},
 YJG:{
-"^":"TpZ:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,131,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 lPa:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,173,14,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,172,13,"call"],
 $isEH:true},
 Ufa:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z=document.createDocumentFragment()
 $.vH().u(0,z,new M.Fi([],null,null,null))
 return z},
@@ -19115,17 +19168,17 @@
 Fi:{
 "^":"a;u2<,Qo<,Ci<,C0<"},
 hg:{
-"^":"TpZ:13;a,b,c",
+"^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.US(a,this.a,this.b)},
 $isEH:true},
-Uk:{
-"^":"TpZ:80;a,b,c,d",
+fE:{
+"^":"TpZ:79;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.fX(a,this.b,this.c))
+y=S.j9(b,M.H4o(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -19135,17 +19188,17 @@
 z.push(y)}},
 $isEH:true},
 aY:{
-"^":"Yj;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
+"^":"OC;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.wC},
 NC:function(){var z,y
 z=this.vL
 y=J.x(z)
-if(!!y.$isYj){y.xO(z)
+if(!!y.$isOC){y.xO(z)
 this.vL=null}z=this.wC
 y=J.x(z)
-if(!!y.$isYj){y.xO(z)
+if(!!y.$isOC){y.xO(z)
 this.wC=null}},
 dE:function(a,b){var z,y,x
 this.NC()
@@ -19153,12 +19206,12 @@
 y=a.qd
 x=y!=null
 this.D2=x
-this.ts=a.cw!=null
+this.ts=a.zy!=null
 if(x){this.qe=y.wD
 y=M.oO("if",y,z,b)
 this.vL=y
 if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isYj").TR(0,this.gNt())}if(this.ts===!0){y=a.cw
+return}}else H.Go(y,"$isOC").TR(0,this.gNt())}if(this.ts===!0){y=a.zy
 this.ur=y.wD
 y=M.oO("repeat",y,z,b)
 this.wC=y}else{y=a.fu
@@ -19168,11 +19221,11 @@
 this.vr(null)},
 vr:[function(a){var z,y
 if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isYj")
+if(this.qe!==!0){H.Go(z,"$isOC")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isYj")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,20,14],
+if(this.ur!==!0){H.Go(y,"$isOC")
+y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,19,13],
 Io:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
@@ -19230,7 +19283,7 @@
 if(y==null)x=$.zl()
 else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
 w=l
-v=new H.XO(g,null)
+v=new H.oP(g,null)
 l=new P.Gc(0,$.X3,null,null,null,null,null,null)
 l.$builtinTypeInfo=[null]
 new P.Zf(l).$builtinTypeInfo=[null]
@@ -19242,7 +19295,7 @@
 f=this.xS(h-1)
 e=J.TmB(u.rF)
 C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,220,221],
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,219,220],
 Ep:[function(a){var z,y,x
 z=$.vH()
 z.toString
@@ -19250,7 +19303,7 @@
 x=(y==null?null:H.of(y,z.J4())).gu2()
 z=new H.a7(x,x.length,0,null)
 z.$builtinTypeInfo=[H.Oq(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,222],
+for(;z.G();)J.yd(z.lo)},"$1","gV6",2,0,221],
 Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
@@ -19259,7 +19312,7 @@
 if(this.ky)return
 this.Ke()
 z=this.Rj
-H.bQ(z,this.gMR())
+H.bQ(z,this.gV6())
 C.Nm.sB(z,0)
 this.NC()
 this.YS.os=null
@@ -19272,9 +19325,9 @@
 J.t3(this.rF,z)
 return}z=this.gmt()
 z.$1(J.mu(c,z))
-return $.rK?this.Bz(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
+return $.rK?this.Un(b,c):c},
+lrv:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.rF,z)},"$1","gmt",2,0,12,20]},
 VT:{
 "^":"V2;rF,Cd,Vw",
 grF:function(){return this.rF},
@@ -19287,7 +19340,7 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Bz(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
 "^":"",
 jb:{
 "^":"a;iB,wD<,UV",
@@ -19325,7 +19378,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,223,21],
+return y+H.d(z[w])},"$1","geb",2,0,222,20],
 Xb:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
@@ -19336,7 +19389,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,224,225],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,223,224],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19387,7 +19440,7 @@
 y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,163,2,103,176],
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,162,143,102,175],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
 y=a.P5
@@ -19396,7 +19449,7 @@
 z.XT()
 z.XT()
 w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,163,2,103,176],
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,162,143,102,175],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19431,9 +19484,9 @@
 x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,112,1,103,104],
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,2,102,103],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,112,1,103,104],
+this.Vf(a)},"$3","gzG",6,0,111,2,102,103],
 Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
@@ -19450,15 +19503,15 @@
 a.oG=!1
 a.ZM=y
 a.ZQ=x
-C.hj.ZL(a)
-C.hj.XI(a)
-C.hj.Kq(a)
+C.aXh.ZL(a)
+C.aXh.XI(a)
+C.aXh.Kq(a)
 return a}}},
 V53:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
 J.Z8(z.lr)
@@ -19469,11 +19522,11 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,226,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,225,"call"],
 $isEH:true},
 oU:{
-"^":"TpZ:13;b",
-$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;b",
+$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
@@ -19498,7 +19551,7 @@
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,98],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19516,230 +19569,313 @@
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-W.QI.$isa=true
-P.FK.$isRz=true
-P.FK.$asRz=[P.FK]
-P.FK.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$isIp=true
-U.mc.$isa=true
-U.cJ.$isIp=true
-U.cJ.$isa=true
-U.uku.$isIp=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$isIp=true
-U.fp.$isa=true
-U.ae.$isIp=true
-U.ae.$isa=true
-U.Mm.$isIp=true
-U.Mm.$isa=true
-U.c0.$isIp=true
-U.c0.$isa=true
-U.no.$isIp=true
-U.no.$isa=true
-U.Nb.$isIp=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$isIp=true
-U.zX.$isa=true
-U.rX.$isIp=true
-U.rX.$isa=true
-U.EO.$isEO=true
-U.EO.$isIp=true
-U.EO.$isa=true
-P.IN.$isIN=true
-P.IN.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.TJ.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-U.U2.$isU2=true
-U.U2.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.Kp.$isaf=true
-D.Kp.$isa=true
-D.Q4.$isa=true
-D.Db.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-D.Z9.$isa=true
-W.BI.$isBI=true
-W.BI.$isea=true
-W.BI.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-W.Hy.$isHy=true
-W.Hy.$isea=true
-W.Hy.$isa=true
-P.xu.$isQV=true
-P.xu.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-W.fJ.$isa=true
-W.ew7.$isea=true
-W.ew7.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.D5.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-G.OS.$isa=true
-D.Mk.$isaf=true
-D.Mk.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-P.A5.$isa=true
-W.PG.$isea=true
-W.PG.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$ishsw=true
-W.I0.$isKV=true
-W.I0.$isa=true
-P.wS.$iswS=true
-P.wS.$isa=true
-P.yX.$isyX=true
-P.yX.$isa=true
-Y.qS.$isa=true
-U.Ip.$isIp=true
-U.Ip.$isa=true
-U.Z5.$isZ5=true
-U.Z5.$isa=true
-G.Ni.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.BpP.$isBpP=true
-P.BpP.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isyX=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isyX=true
-P.LR.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.aYy.$isaYy=true
-P.aYy.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.Xa.$isXa=true
-P.Xa.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-A.Yj.$isYj=true
-A.Yj.$isa=true
-D.wv.$iswv=true
-D.wv.$isaf=true
-D.wv.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.AR.$isAR=true
-L.AR.$isYj=true
-L.AR.$isa=true
-W.hsw.$ishsw=true
-W.hsw.$isKV=true
-W.hsw.$isa=true
+;(function(){var z=!0,y
+y=P.KN
+y.$isKN=z
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=W.KV
+y.$isKV=z
+y.$isa=z
+W.vKL.$isa=z
+y=P.qU
+y.$isqU=z
+y.$isRz=z
+y.$asRz=[P.qU]
+y.$isa=z
+W.QI.$isa=z
+y=P.FK
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=N.qV
+y.$isRz=z
+y.$asRz=[N.qV]
+y.$isa=z
+y=P.a6
+y.$isa6=z
+y.$isRz=z
+y.$asRz=[P.a6]
+y.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.ns.$isa=z
+y=K.Aep
+y.$isAep=z
+y.$isa=z
+y=U.Dc
+y.$isIp=z
+y.$isa=z
+y=U.cJ
+y.$isIp=z
+y.$isa=z
+y=U.uku
+y.$isIp=z
+y.$isa=z
+y=U.fp
+y.$isfp=z
+y.$isIp=z
+y.$isa=z
+y=U.ae
+y.$isIp=z
+y.$isa=z
+y=U.Mm
+y.$isIp=z
+y.$isa=z
+y=U.c0
+y.$isIp=z
+y.$isa=z
+y=U.no
+y.$isIp=z
+y.$isa=z
+y=U.Nb
+y.$isIp=z
+y.$isa=z
+y=U.zX
+y.$iszX=z
+y.$isIp=z
+y.$isa=z
+y=U.rX
+y.$isIp=z
+y.$isa=z
+y=U.WH
+y.$isWH=z
+y.$isIp=z
+y.$isa=z
+y=P.IN
+y.$isIN=z
+y.$isa=z
+y=P.uq
+y.$isuq=z
+y.$isa=z
+N.TJ.$isa=z
+y=T.yj
+y.$isyj=z
+y.$isa=z
+y=W.tV
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=U.U2
+y.$isU2=z
+y.$isa=z
+y=D.af
+y.$isaf=z
+y.$isa=z
+y=D.bv
+y.$isaf=z
+y.$isa=z
+D.Fc.$isa=z
+D.ER.$isa=z
+y=D.dy
+y.$isdy=z
+y.$isaf=z
+y.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isZ0=z
+y.$asZ0=[null,null]
+y.$isa=z
+y=D.Kp
+y.$isaf=z
+y.$isa=z
+D.Q4.$isa=z
+D.Db.$isa=z
+y=D.U4
+y.$isaf=z
+y.$isa=z
+y=D.vx
+y.$isvx=z
+y.$isaf=z
+y.$isa=z
+D.c2.$isa=z
+y=G.DA
+y.$isDA=z
+y.$isa=z
+D.Z9.$isa=z
+y=W.BI
+y.$isBI=z
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.Hy
+y.$isHy=z
+y.$isea=z
+y.$isa=z
+y=P.xu
+y.$isQV=z
+y.$isa=z
+y=P.a2
+y.$isa2=z
+y.$isa=z
+W.fJ.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+y=G.Y2
+y.$isY2=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.XP.$isa=z
+y=W.AjY
+y.$isAjY=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isaf=z
+y.$isa=z
+y=W.f5
+y.$isf5=z
+y.$isea=z
+y.$isa=z
+P.A5.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Tv
+y.$isTv=z
+y.$isa=z
+K.GK.$isa=z
+y=N.HV
+y.$isHV=z
+y.$isa=z
+H.yo.$isa=z
+H.IY.$isa=z
+H.aX.$isa=z
+y=W.I0
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z
+y=P.wS
+y.$iswS=z
+y.$isa=z
+y=P.yX
+y.$isyX=z
+y.$isa=z
+Y.qS.$isa=z
+y=U.Ip
+y.$isIp=z
+y.$isa=z
+y=U.Z5
+y.$isZ5=z
+y.$isa=z
+G.Ni.$isa=z
+y=V.qC
+y.$isqC=z
+y.$isZ0=z
+y.$isa=z
+y=P.BpP
+y.$isBpP=z
+y.$isa=z
+y=P.KA
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.LR
+y.$isLR=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.dl
+y.$isdl=z
+y.$isa=z
+y=P.Rz
+y.$isRz=z
+y.$isa=z
+y=P.n7
+y.$isn7=z
+y.$isa=z
+y=P.Z0
+y.$isZ0=z
+y.$isa=z
+y=P.Xa
+y.$isXa=z
+y.$isa=z
+y=P.QV
+y.$isQV=z
+y.$isa=z
+y=P.EH
+y.$isEH=z
+y.$isa=z
+y=P.b8
+y.$isb8=z
+y.$isa=z
+y=P.NOT
+y.$isNOT=z
+y.$isa=z
+y=P.ti
+y.$isti=z
+y.$isa=z
+y=P.iP
+y.$isiP=z
+y.$isRz=z
+y.$asRz=[null]
+y.$isa=z
+y=O.Hz
+y.$isHz=z
+y.$isa=z
+y=A.OC
+y.$isOC=z
+y.$isa=z
+y=D.wv
+y.$iswv=z
+y.$isaf=z
+y.$isa=z
+y=D.N7
+y.$isN7=z
+y.$isaf=z
+y.$isa=z
+y=D.EP
+y.$isEP=z
+y.$isaf=z
+y.$isa=z
+y=A.ES
+y.$isES=z
+y.$isa=z
+y=A.Wq
+y.$isWq=z
+y.$isa=z
+y=L.AR
+y.$isAR=z
+y.$isOC=z
+y.$isa=z
+y=W.hsw
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z})()
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -19748,13 +19884,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -19767,7 +19903,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.Xh.prototype
 return J.VA.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -19775,7 +19911,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
 J.A6=function(a){return J.RE(a).gG3(a)}
@@ -19795,12 +19931,13 @@
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
 J.C8=function(a){return J.RE(a).gSO(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
+J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
 J.Cm=function(a){return J.RE(a).gvC(a)}
+J.Cr=function(a){return J.RE(a).gEQ(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
@@ -19839,6 +19976,7 @@
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.IA=function(a){return J.RE(a).gjT(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
 J.IR=function(a){return J.RE(a).gYt(a)}
@@ -19854,7 +19992,6 @@
 J.JR=function(a){return J.RE(a).gcK(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a){return J.RE(a).gWA(a)}
-J.Jk=function(a){return J.x(a).gbx(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
 J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a){return J.RE(a).gGV(a)}
@@ -19866,28 +20003,29 @@
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
+J.L6=function(a){return J.RE(a).glD(a)}
 J.L9=function(a,b){return J.RE(a).sdU(a,b)}
+J.LB=function(a){return J.RE(a).gX0(a)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a){return J.RE(a).gff(a)}
+J.Lm=function(a){return J.x(a).gbx(a)}
 J.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
 J.Lr=function(a){return J.RE(a).gMj(a)}
 J.MB=function(a){return J.RE(a).gzG(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MU=function(a,b){return J.RE(a).Fc(a,b)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
 J.Mh=function(a){return J.RE(a).gMt(a)}
+J.Mo=function(a){return J.RE(a).gx6(a)}
 J.Mp=function(a){return J.w1(a).wg(a)}
 J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NA=function(a,b){return J.RE(a).sG5(a,b)}
 J.NB=function(a){return J.RE(a).gHo(a)}
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
@@ -19901,16 +20039,13 @@
 J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.Nq=function(a){return J.RE(a).gGc(a)}
 J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P3=function(a){return J.RE(a).goL(a)}
 J.P4=function(a){return J.RE(a).gVr(a)}
-J.PB=function(a){return J.RE(a).gBV(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
 J.PY=function(a){return J.RE(a).goN(a)}
@@ -19922,6 +20057,7 @@
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QD=function(a,b){return J.RE(a).sM3(a,b)}
+J.QE=function(a){return J.RE(a).gCd(a)}
 J.QP=function(a){return J.RE(a).gWq(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
 J.Qa=function(a){return J.RE(a).gNN(a)}
@@ -19955,8 +20091,7 @@
 J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gEQ(a)}
-J.U8o=function(a){return J.RE(a).gUQ(a)}
+J.U8=function(a){return J.RE(a).gUQ(a)}
 J.UA=function(a){return J.RE(a).gP2(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
@@ -19965,7 +20100,6 @@
 return J.U6(a).t(a,b)}
 J.US=function(a){return J.RE(a).gWt(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
 J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
@@ -19973,6 +20107,7 @@
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vf=function(a){return J.RE(a).gVE(a)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.rY(a).C1(a,b)}
@@ -19997,7 +20132,6 @@
 J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
 J.Z8=function(a){return J.w1(a).V1(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -20009,6 +20143,7 @@
 J.Zq=function(a){return J.RE(a).glp(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
 J.Zv=function(a){return J.RE(a).grs(a)}
+J.Zz=function(a){return J.RE(a).gmSA(a)}
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
@@ -20036,8 +20171,10 @@
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
 J.d7=function(a){return J.RE(a).giG(a)}
+J.dA=function(a){return J.RE(a).gV5(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
@@ -20056,9 +20193,8 @@
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fi=function(a){return J.RE(a).gX0(a)}
+J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.fx=function(a){return J.RE(a).gG5(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
@@ -20071,16 +20207,17 @@
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
+J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
 J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
 J.ix=function(a){return J.RE(a).gnI(a)}
+J.iy=function(a){return J.RE(a).gV2(a)}
 J.j0=function(a){return J.RE(a).gO0(a)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jB=function(a){return J.RE(a).gpf(a)}
 J.jC=function(a){return J.RE(a).gSR(a)}
+J.jL=function(a){return J.RE(a).gBV(a)}
 J.jO=function(a){return J.RE(a).gkD(a)}
 J.jd=function(a,b){return J.RE(a).snZ(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
@@ -20096,7 +20233,6 @@
 return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.ks=function(a){return J.RE(a).gB1(a)}
 J.kv=function(a){return J.RE(a).gDf(a)}
@@ -20130,6 +20266,7 @@
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.ogJ=function(a,b){return J.RE(a).sIt(a,b)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
@@ -20144,12 +20281,10 @@
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
 J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qb=function(a){return J.RE(a).gmSA(a)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
 J.ql=function(a){return J.RE(a).gaB(a)}
 J.qq=function(a){return J.RE(a).dQ(a)}
+J.qv=function(a){return J.RE(a).pj(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
 J.rA=function(a,b){return J.w1(a).Nk(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
@@ -20169,7 +20304,6 @@
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
-J.uG=function(a,b){return J.w1(a).zV(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
 J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
@@ -20184,7 +20318,9 @@
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
+J.vc=function(a,b){return J.RE(a).sG5(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
+J.w4=function(a,b){return J.RE(a).x4(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
@@ -20207,6 +20343,7 @@
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
+J.xp=function(a,b){return J.w1(a).zV(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
 J.yI=function(a){return J.RE(a).gLf(a)}
@@ -20226,6 +20363,7 @@
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+J.zk=function(a){return J.RE(a).gZm(a)}
 C.Df=X.hV.prototype
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
@@ -20244,7 +20382,7 @@
 C.ls6=X.MJ.prototype
 C.MO0=X.J3.prototype
 C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
+C.p0=N.BS.prototype
 C.Cs=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
@@ -20254,15 +20392,15 @@
 C.Ig=E.DE.prototype
 C.x4=E.U1.prototype
 C.lX=E.qM.prototype
-C.OkI=E.av.prototype
+C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
+C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.Tl=E.oF.prototype
 C.wK=E.qh.prototype
-C.to=E.Q6.prototype
+C.rU=E.Q6.prototype
 C.wd=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Rr=E.uE.prototype
@@ -20270,11 +20408,11 @@
 C.hM=B.pR.prototype
 C.yKx=Z.hx.prototype
 C.aXP=D.Z4.prototype
-C.Vi=D.Qh.prototype
+C.rCJ=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
-C.F2=D.IW.prototype
+C.lk8=D.IW.prototype
 C.Ji=D.Oz.prototype
 C.OoF=D.St.prototype
 C.Xe=L.qk.prototype
@@ -20297,13 +20435,13 @@
 C.Mn=A.NK.prototype
 C.L8=A.Zx.prototype
 C.Y6=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.t5=W.yk.prototype
+C.YpE=V.F1.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iCW.prototype
 C.Ki=A.xc.prototype
 C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.Yj=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
@@ -20311,16 +20449,16 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.uC=X.uw.prototype
-C.OKl=A.G1.prototype
+C.wB=X.uw.prototype
+C.lx=A.G1.prototype
 C.vB=J.kdQ.prototype
-C.hj=V.D2.prototype
+C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.vA=X.I5.prototype
 C.dm=U.el.prototype
 C.ol=W.K5.prototype
 C.KZ=new H.hJ()
-C.OL=new U.EO()
+C.OL=new U.WH()
 C.MS=new H.FuS()
 C.Eq=new P.qn()
 C.qY=new T.yy()
@@ -20328,7 +20466,6 @@
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
@@ -20350,8 +20487,8 @@
 C.Jny=H.IL('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
 C.Zg=new H.tx("args")
-C.SXK=H.IL('qC')
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.UZ=H.IL('qC')
+C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
 C.MR1=H.IL('vO')
 C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
@@ -20494,7 +20631,7 @@
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
 C.bJ=new H.tx("counters")
-C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
 C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
 C.Ys=new H.tx("pad")
@@ -20502,8 +20639,8 @@
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
 C.YT=new H.tx("expr")
-C.eP=H.IL('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
+C.wG=H.IL('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
 C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
 C.xS=new H.tx("tagSelectorChanged")
@@ -20543,9 +20680,9 @@
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
 C.OO=new H.tx("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
+C.Cf=new A.ES(C.OO,C.BM,!1,C.UZ,!1,C.ucP)
 C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.eP,!1,C.esx)
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.esx)
 C.uk=new H.tx("last")
 C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
 C.am=new H.tx("chromeTargets")
@@ -20561,7 +20698,7 @@
 C.fn=new H.tx("instance")
 C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
 C.rE=new H.tx("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
+C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
 C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
 C.ngm=I.uL([C.J19])
@@ -20574,14 +20711,14 @@
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
 C.oqo=H.IL('pD')
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
+C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
 C.T1=H.VM(new W.FkO("click"),[W.AjY])
 C.i6=H.VM(new W.FkO("close"),[W.BI])
-C.iw=H.VM(new W.FkO("disconnect"),[W.PG])
+C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
 C.JN=H.VM(new W.FkO("error"),[W.ew7])
 C.MD=H.VM(new W.FkO("error"),[W.ea])
 C.i3=H.VM(new W.FkO("input"),[W.ea])
@@ -20642,39 +20779,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.MA=function() {
-  function typeNameInChrome(o) {
-    var name = o.constructor.name;
-    if (name) return name;
-    var s = Object.prototype.toString.call(o);
-    return s.substring(8, s.length - 1);
-  }
-  function getUnknownTag(object, tag) {
-    if (/^HTML[A-Z].*Element$/.test(tag)) {
-      var name = Object.prototype.toString.call(object);
-      if (name == "[object Object]") return null;
-      return "HTMLElement";
-    }
-  }
-  function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
-    return getUnknownTag(object, tag);
-  }
-  function prototypeForTag(tag) {
-    if (typeof window == "undefined") return null;
-    if (typeof window[tag] == "undefined") return null;
-    var constructor = window[tag];
-    if (typeof constructor != "function") return null;
-    return constructor.prototype;
-  }
-  function discriminator(tag) { return null; }
-  var isBrowser = typeof navigator == "object";
-  return {
-    getTag: typeNameInChrome,
-    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
-    prototypeForTag: prototypeForTag,
-    discriminator: discriminator };
-}
 C.M1=function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
@@ -20704,6 +20808,39 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
+C.GM=function() {
+  function typeNameInChrome(o) {
+    var name = o.constructor.name;
+    if (name) return name;
+    var s = Object.prototype.toString.call(o);
+    return s.substring(8, s.length - 1);
+  }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = Object.prototype.toString.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: typeNameInChrome,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+}
 C.hQ=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
@@ -20732,37 +20869,40 @@
 C.nT=new N.qV("WARNING",900)
 C.Gb=H.VM(I.uL([127,2047,65535,1114111]),[P.KN])
 C.NG=I.uL([1,6])
-C.JH=I.uL([0,0,26624,1023,0,0,65534,2047])
+C.rz=I.uL([0,0,32776,33792,1,10240,0,0])
 C.SV=new H.tx("keys")
 C.Uq=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
+C.WK=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
+C.o5=I.uL([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
 C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
 C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
 C.pzc=H.IL('nd')
 C.Cd=I.uL([C.pzc])
 C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
+C.jY=I.uL(["as","in","this"])
+C.to=I.uL([0,0,32722,12287,65534,34815,65534,18431])
 C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
+C.ZJ=I.uL([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uL([0,0,32722,12287,65535,34815,65534,18431])
 C.iq=I.uL([40,41,91,93,123,125])
 C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.lY=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
+C.yt=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
 C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
+C.w0=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.CM=new H.Px(0,{},C.dn)
 C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.UM()},C.MEG)
+C.c7o=new H.Px(1,{enumerate:K.BQ()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.uL([C.uwj])
@@ -20982,7 +21122,7 @@
 C.rR=H.IL('wN')
 C.yS=H.IL('G6')
 C.Sb=H.IL('kn')
-C.FQ=H.IL('a')
+C.AP=H.IL('a')
 C.Yc=H.IL('iP')
 C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
@@ -21036,12 +21176,12 @@
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
+C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
 C.pF=H.IL('WS')
 C.qZ=H.IL('DE')
 C.jw=H.IL('xc')
 C.NW=H.IL('ye')
-C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
 C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
@@ -21069,10 +21209,26 @@
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
 C.xM=new P.u5F(!1)
+C.NA=new P.fM(C.NU,P.oo())
+C.Xk=new P.fM(C.NU,P.Dk())
+C.F6=new P.fM(C.NU,P.zi())
+C.Rt=new P.fM(C.NU,P.wLZ())
+C.Sq=new P.fM(C.NU,P.vRP())
+C.mc=new P.fM(C.NU,P.H2())
+C.uo=new P.fM(C.NU,P.hI())
+C.pj=new P.fM(C.NU,P.W7())
+C.F2=new P.fM(C.NU,P.lw())
+C.Gu=new P.fM(C.NU,P.xd())
+C.Yl=new P.fM(C.NU,P.MM())
+C.Zc=new P.fM(C.NU,P.G2())
+C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
-$.Vz=1
+$.VzC=null
+$.kz=1
 $.z7="$cachedFunction"
 $.eb="$cachedInvocation"
+$.zIm=null
+$.lEO=null
 $.OK=0
 $.bf=null
 $.U9=null
@@ -21089,7 +21245,9 @@
 $.S6=null
 $.k8=null
 $.X3=C.NU
+$.Sk=null
 $.Km=0
+$.xj=null
 $.Qz=null
 $.R6=null
 $.RL=!1
@@ -21108,11 +21266,7 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.Sc},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.m6},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii1},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","Fv",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","WH","wB",function(){return $.jk().postMessage!==void 0})
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.SP},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.Ifw},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -21130,10 +21284,10 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
+I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["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"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
+I.$lazy($,"context","Lt","Si",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
@@ -21145,7 +21299,7 @@
 I.$lazy($,"_pathRegExp","Ub","B8",function(){return new L.DOe().$0()})
 I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","rk",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
@@ -21153,23 +21307,23 @@
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
 I.$lazy($,"_changedMethodQueryOptions","SC","Sz",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_ATTRIBUTES_REGEX","mD","wm",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","dnO",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_observeLog","DZ","mj",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","fo","ay",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
 I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Si(),"PolymerGestures")})
 I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
 I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Ra(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.pa,new Z.MdQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","prp","Ii",function(){return P.EF(["+",new K.w0(),"-",new K.w5(),"!",new K.w10()],null,null)})
-I.$lazy($,"_instance","ln","wb",function(){return new K.me()})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_instance","b3","At",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","YF",function(){return new D.Hk("function")})
+I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.Hk("function")})
 I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.Hk("closure function")})
 I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.Hk("getter function")})
 I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.Hk("setter function")})
@@ -21188,19 +21342,19 @@
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","DH",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.VE(null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Raa().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","tF",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(C.z5),new M.YJG()).zV(0,", ")})
+I.$lazy($,"_ownerStagingDocument","v2","we",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return"template, "+J.kl(C.lY.gvc(C.lY),new M.YJG()).zV(0,", ")})
 I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.lPa())})
 I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Ufa().$0()})
 I.$lazy($,"_instanceExtension","AH","vH",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:227}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"h9",void:true},{func:"n9",void:true,args:[{func:"h9",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"h9",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Ag",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"wT6",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.e4y,P.dl]},{func:"Zg",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"line",{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:226}
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"JX",void:true,args:[P.Xa]}]},{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"event","response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.e4y,P.dl]},{func:"h2",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"js",args:[P.qU,U.U2]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -21246,7 +21400,7 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index cca825c..1ee9434 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -930,7 +930,7 @@
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
+          {{ ref['closureFunc'].name }}
         </a>
       </template>
 
@@ -6564,6 +6564,7 @@
         <library-nav-menu library="{{ function.owningLibrary }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
@@ -15633,6 +15634,7 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
+    <nav-menu link="{{ script.owningLibrary.link }}" anchor="{{ script.owningLibrary.name }}"></nav-menu>
     <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 29d27cf..7ae4b6c 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -157,7 +157,7 @@
 "^":"",
 x:function(a){return void 0},
 Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0:function(a){var z,y,x,w
+aN:function(a){var z,y,x,w
 z=a[init.dispatchPropertyName]
 if(z==null)if($.Bv==null){H.XD()
 z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
@@ -193,23 +193,23 @@
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
-bu:[function(a){return H.a5(a)},"$0","gAY",0,0,69],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,70],
+bu:[function(a){return H.a5(a)},"$0","gAY",0,0,71],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,72],
 gbx:function(a){return new H.cu(H.wO(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
 "^":"Gv;",
-bu:[function(a){return String(a)},"$0","gAY",0,0,69],
+bu:[function(a){return String(a)},"$0","gAY",0,0,71],
 giO:function(a){return a?519018:218159},
 gbx:function(a){return C.HL},
 $isa2:true},
 CDU:{
 "^":"Gv;",
 n:function(a,b){return null==b},
-bu:[function(a){return"null"},"$0","gAY",0,0,69],
+bu:[function(a){return"null"},"$0","gAY",0,0,71],
 giO:function(a){return 0},
 gbx:function(a){return C.GX},
-T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,70]},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,72]},
 Ue1:{
 "^":"Gv;",
 giO:function(a){return 0},
@@ -230,7 +230,7 @@
 if(b<0||b>a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
 a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+oF:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
 H.IC(a,b,c)},
 Rz:function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
@@ -238,12 +238,12 @@
 return!0}return!1},
 Nk:function(a,b){H.Ap(a,b)},
 ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},30],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},30],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -285,7 +285,7 @@
 return!1},
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 tt:function(a,b){var z
 if(b)return H.VM(a.slice(),[H.Oq(a,0)])
 else{z=H.VM(a.slice(),[H.Oq(a,0)])
@@ -314,12 +314,7 @@
 $asWO:null,
 $isyN:true,
 $isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
+$asQV:null},
 P:{
 "^":"Gv;",
 iM:function(a,b){var z
@@ -349,11 +344,11 @@
 if(z.C(b,0)||z.D(b,20))throw H.b(P.KP(b))
 y=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+y
-return y},"$1","gKy",2,0,15,71],
+return y},"$1","gKy",2,0,14,73],
 WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
 return a.toString(b)},
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},"$0","gAY",0,0,69],
+else return""+a},"$0","gAY",0,0,71],
 giO:function(a){return a&0x1FFFFFFF},
 J:function(a){return-a},
 g:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -387,6 +382,8 @@
 if(a>0)z=b>31?0:a>>>b
 else{z=b>31?31:b
 z=a>>z>>>0}return z},
+ib:function(a,b){if(b<0)throw H.b(P.u(b))
+return b>31?0:a>>>b},
 i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return(a&b)>>>0},
 w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
@@ -506,7 +503,7 @@
 if(a===b)z=0
 else z=a<b?-1:1
 return z},
-bu:[function(a){return a},"$0","gAY",0,0,69],
+bu:[function(a){return a},"$0","gAY",0,0,71],
 giO:function(a){var z,y,x
 for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
 y=536870911&y+((524287&y)<<10>>>0)
@@ -549,7 +546,7 @@
 init.globalState.Xz.bL()
 return z},
 cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
+Ke:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -575,7 +572,7 @@
 x=H.KT(y,[y]).BD(a)
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
+if(y)u.vV(0,new H.Fx(z,a))
 else u.vV(0,a)}init.globalState.Xz.bL()},
 yl:function(){var z=init.currentScript
 if(z!=null)return String(z.src)
@@ -591,7 +588,7 @@
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
 throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
-uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+uK:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=H.b0(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.NO=y.t(z,"id")
@@ -613,9 +610,7 @@
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
+case"spawn-worker":break
 case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
@@ -623,56 +618,21 @@
 a.terminate()
 init.globalState.Xz.bL()
 break
-case"log":H.Vj(y.t(z,"msg"))
+case"log":H.yb(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.rj
 q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
 self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","dM",4,0,null,0,1],
-Vj:function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","XFc",4,0,null,1,2],
+yb:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.rj
 x=H.t0(P.EF(["command","log","msg",a],null,null))
 y.toString
-self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.XO(w,null)
+self.postMessage(x)}else try{self.console.log(a)}catch(w){H.Ru(w)
+z=new H.oP(w,null)
 throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.Vr(b,".dart"))b=J.ew(b,".js")
-z=P.at()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gTw(z).ml(new H.yk(y))
-x=new H.VU(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.WK(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.uK,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
 Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -685,35 +645,30 @@
 x=new H.vK(a,b,c,d,z)
 if(e===!0){z.oz(w,w)
 init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
 t0:function(a){var z
 if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.fL(new H.cx())
+return z.tf(a)}else{z=new H.fL(new H.cx())
 z.mR=new H.m3(null)
-return z.Zo(a)}},
+return z.tf(a)}},
 b0:function(a){if(init.globalState.ji===!0)return new H.BV(null).ug(a)
 else return a},
 vM:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 ZR:function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},
 PK:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
-JO:{
-"^":"TpZ:72;a,c",
+Fx:{
+"^":"TpZ:74;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 pq:{
-"^":"a;Hg,NO,Y7,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.My()==null
-y=$.Fv()
-x=z&&$.wB()===!0
+"^":"a;Hg,NO,hJ,N0,Nr,Xz,da,EF,ji,iR<,rj,XC,w2<",
+qi:function(a){var z,y,x
+z=self.window==null
+y=self.Worker
+x=z&&!!self.postMessage
 this.EF=x
 if(!x)y=y!=null&&$.Zt()!=null
 else y=!0
@@ -721,17 +676,17 @@
 this.da=z&&!x
 y=H.IY
 x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Pt(null,y)
+x.Eo(null,y)
 this.Xz=new H.cC(x,0)
 this.iR=P.L5(null,null,null,P.KN,H.aX)
 this.XC=P.L5(null,null,null,P.KN,null)
-if(this.EF===!0){z=new H.In()
+if(this.EF===!0){z=new H.JH()
 this.rj=z
-w=function(b,c){return function(d){b(c,d)}}(H.uK,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
+self.onmessage=function(b,c){return function(d){b(c,d)}}(H.uK,z)
+self.dartPrint=self.dartPrint||function(b){return function(c){if(self.console&&self.console.log){self.console.log(c)}else{self.postMessage(b(c))}}}(H.wI)}},
+static:{wI:[function(a){return H.t0(P.EF(["command","print","msg",a],null,null))},"$1","UB",2,0,null,0]}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,Ji,pa,ir",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 oz:function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
@@ -761,19 +716,19 @@
 this.pa=b},
 ZC:function(a,b){var z,y
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.Ji
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
 if(y){J.H4(a,null)
 return}y=new H.NY(a)
 if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
 return}z=this.M2
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 this.M2=z}z.NZ(0,y)},
 bc:function(a,b){var z,y
 if(!this.PX.n(0,a))return
 z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.Ji
+if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
 if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
@@ -781,13 +736,12 @@
 z.Rk.NZ(0,new H.IY(this,y,"kill"))
 return}z=this.M2
 if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Pt(null,null)
+z.Eo(null,null)
 this.M2=z}z.NZ(0,this.gIm())},
 hk:function(a,b){var z,y
 z=this.ir
 if(z.X5===0){if(this.pa===!0&&this===init.globalState.Nr)return
-z=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
+if(self.console&&self.console.error)self.console.error(a,b)
 else{P.FL(a)
 if(b!=null)P.FL(b)}return}y=Array(2)
 y.fixed$length=init
@@ -799,16 +753,16 @@
 init.globalState.N0=this
 $=this.En
 y=null
-this.Ji=!0
+this.mf=!0
 try{y=b.$0()}catch(v){u=H.Ru(v)
 x=u
-w=new H.XO(v,null)
+w=new H.oP(v,null)
 this.hk(x,w)
 if(this.pa===!0){this.Dm()
-if(this===init.globalState.Nr)throw v}}finally{this.Ji=!1
+if(this===init.globalState.Nr)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,73,74],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,75,76],
 Ds:function(a){var z=J.U6(a)
 switch(z.t(a,0)){case"pause":this.oz(z.t(a,1),z.t(a,2))
 break
@@ -844,10 +798,10 @@
 this.ir.V1(0)
 z=this.CN
 if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
+this.CN=null}},"$0","gIm",0,0,17],
 $isaX:true},
 NY:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -864,61 +818,35 @@
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-Wu:function(){if($.My()!=null)new H.Rm(this).$0()
+Wu:function(){if(self.window!=null)new H.Rm(this).$0()
 else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
 if(init.globalState.EF!==!0)this.Wu()
 else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.rj
 v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
 Rm:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){if(!this.a.xB())return
 P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,17],
 $isIY:true},
-In:{
+JH:{
 "^":"a;"},
 kb:{
-"^":"TpZ:72;a,b,c,d,e,f",
+"^":"TpZ:74;a,b,c,d,e,f",
 $0:[function(){H.Di(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xn:{
-"^":"TpZ:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-jl3:{
-"^":"TpZ:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,76,"call"],
-$isEH:true},
-yk:{
-"^":"TpZ:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-WK:{
-"^":"TpZ:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,77,"call"],
-$isEH:true},
-hI:{
-"^":"TpZ:72;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
 vK:{
-"^":"TpZ:18;a,b,c,d,e",
+"^":"TpZ:17;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
@@ -952,12 +880,12 @@
 y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isVU&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
+giO:function(a){return J.Mo(this.JE)},
 $isVU:true,
 $ispW:true,
 $ishq:true},
 Ua:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gKS()){if(this.c){y=this.a
@@ -982,7 +910,7 @@
 $ispW:true,
 $ishq:true},
 yo:{
-"^":"a;qK>,D1,KS<",
+"^":"a;x6>,D1,KS<",
 wy:function(a){return this.D1.$1(a)},
 pr:function(){this.KS=!0
 this.D1=null},
@@ -991,41 +919,27 @@
 this.KS=!0
 this.D1=null
 z=init.globalState.N0
-y=this.qK
+y=this.x6
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
 z.PC()},
 Rf:function(a,b){if(this.KS)return
 this.wy(b)},
 $isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"wS;vl,tU",
-KR:function(a,b,c,d){var z=this.tU
-z.toString
-return H.VM(new P.u2(z),[null]).KR(a,b,c,d)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-xO:[function(a){this.vl.xO(0)
-this.tU.xO(0)},"$0","gQF",0,0,18],
-TL:function(a){var z=P.HT(this.gQF(this),null,null,null,!0,null)
-this.tU=z
-this.vl.D1=z.ght(z)},
-$aswS:function(){return[null]},
-$iswS:true},
+static:{"^":"kz"}},
 RS:{
 "^":"hz;Ao,mR",
-DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.ki(a.JE)]
+DE:function(a){if(!!a.$isVU)return["sendport",init.globalState.NO,a.tv,J.Mo(a.JE)]
 if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
+yf:function(a){if(!!a.$iskuS)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 fL:{
 "^":"ooy;mR",
 DE:function(a){if(!!a.$isVU)return new H.VU(a.JE,a.tv)
 if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
+yf:function(a){if(!!a.$iskuS)return new H.kuS(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 BV:{
 "^":"fPc;RZ",
@@ -1039,7 +953,7 @@
 u=v.hV(w)
 if(u==null)return
 return new H.VU(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
+Op:function(a){return new H.kuS(J.UQ(a,1))}},
 m3:{
 "^":"a;u5",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
@@ -1056,9 +970,9 @@
 u:function(a,b,c){},
 CH:function(a){},
 no:function(){}},
-BB:{
+HU5:{
 "^":"a;",
-Zo:function(a){var z
+tf:function(a){var z
 if(H.vM(a))return this.Pq(a)
 this.mR.CH(0)
 z=null
@@ -1073,7 +987,7 @@
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
 ooy:{
-"^":"BB;",
+"^":"HU5;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x,w
 z=this.mR.t(0,a)
@@ -1098,12 +1012,12 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 RK:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,78,79,"call"],
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,77,78,"call"],
 $isEH:true},
 hz:{
-"^":"BB;",
+"^":"HU5;",
 Pq:function(a){return a},
 wb:function(a){var z,y
 z=this.mR.t(0,a)
@@ -1171,40 +1085,48 @@
 PR:function(a){throw H.b("Unexpected serialized object")}},
 Oe:{
 "^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
+ed:function(){if(self.setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
 if(this.p9==null)return
 H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
+var z=this.p9
+if(this.Om)self.clearTimeout(z)
+else self.clearInterval(z)
 this.p9=null}else throw H.b(P.f("Canceling a timer."))},
+WI:function(a,b){if(self.setTimeout!=null){++init.globalState.Xz.GL
+this.p9=self.setInterval(H.tR(new H.DH(this,b),0),a)}else throw H.b(P.f("Periodic timer."))},
 Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
+if(a===0)z=self.setTimeout==null||init.globalState.EF===!0
 else z=!1
 if(z){this.p9=1
 z=init.globalState.Xz
 y=init.globalState.N0
 z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+this.zu=!0}else if(self.setTimeout!=null){++init.globalState.Xz.GL
+this.p9=self.setTimeout(H.tR(new H.vt(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))},
 static:{cy:function(a,b){var z=new H.Oe(!0,!1,null)
 z.Qa(a,b)
+return z},zw:function(a,b){var z=new H.Oe(!1,!1,null)
+z.WI(a,b)
 return z}}},
 Av:{
-"^":"TpZ:18;a,b",
+"^":"TpZ:17;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 vt:{
-"^":"TpZ:18;c,d",
+"^":"TpZ:17;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-iV:{
-"^":"a;qK>",
+DH:{
+"^":"TpZ:74;a,b",
+$0:[function(){this.b.$1(this.a)},"$0",null,0,0,null,"call"],
+$isEH:true},
+kuS:{
+"^":"a;x6>",
 giO:function(a){var z,y,x
-z=this.qK
+z=this.x6
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1217,10 +1139,10 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
+if(!!J.x(b).$iskuS){z=this.x6
+y=b.x6
 return z==null?y==null:z===y}return!1},
-$isiV:true,
+$iskuS:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
@@ -1237,7 +1159,7 @@
 eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},
-rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,5],
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,3],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1278,8 +1200,19 @@
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
 return(z+H.ia(H.oX(a),0,null)).replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})},
 a5:function(a){return"Instance of '"+H.lh(a)+"'"},
-Ao:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
+Qn:[function(){return Date.now()},"$0","EY",0,0,4],
+PA:function(){var z,y
+if($.zIm!=null)return
+$.zIm=1000
+$.lEO=H.EY()
+if(typeof window=="undefined")return
+z=window
+if(z==null)return
+y=z.performance
+if(y==null)return
+if(typeof y.now!="function")return
+$.zIm=1000000
+$.lEO=new H.aH8(y)},
 RF:function(a){var z,y,x,w,v,u
 z=a.length
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
@@ -1368,7 +1301,7 @@
 if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
 z.name=""}else z.toString=H.tM
 return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",0,0,null],
 vh:function(a){throw H.b(a)},
 Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=new H.Am(a)
@@ -1422,7 +1355,7 @@
 else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","uA",14,0,null,5,6,7,8,9,10,11],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1491,7 +1424,7 @@
 rm:function(a,b,c,d){var z,y
 z=H.uj
 y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
+switch(b?-1:a){case 0:throw H.b(H.S3("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
 case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
 case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
@@ -1532,7 +1465,7 @@
 ag:function(a){throw H.b(P.mE("Cyclic initialization for static "+H.d(a)))},
 KT:function(a,b,c){return new H.GN(a,b,c,null)},
 Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.tu(z)
+if(b==null||b.length===0)return new H.Hs(z)
 return new H.fw(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
@@ -1577,7 +1510,7 @@
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
 return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
+IGs:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
 IU:function(a,b){var z,y
 if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="c8"
 if(b==null)return!0
@@ -1651,7 +1584,7 @@
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
 wzi:function(a){return H.eQ(a)},
-Xn:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+fc:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 Gz:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.q4[z]
@@ -1710,7 +1643,7 @@
 z["+"+v]=s
 z["*"+v]=s}}},
 kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
+z=C.GM()
 z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
 if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
 if(typeof y=="function")y=[y]
@@ -1750,7 +1683,7 @@
 "^":"a;",
 gl0:function(a){return J.xC(this.gB(this),0)},
 gor:function(a){return!J.xC(this.gB(this),0)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
 u:function(a,b,c){return this.EP()},
 Rz:function(a,b){return this.EP()},
@@ -1774,8 +1707,8 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Oq(this,0),H.Oq(this,1))},
 $isyN:true},
 hY:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,78,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1831,8 +1764,7 @@
 x=P.Fl(P.qU,P.KN)
 for(w=this.Rv,v=0;v<y;++v){u=w+v
 x.u(0,this.XL(u),u)}z.a=0
-y=x.gvc(x)
-y=P.F(y,!0,H.ip(y,"mW",0))
+y=x.gvc(x).br(0)
 H.rd(y,null)
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
@@ -1846,7 +1778,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"TpZ:5;a,b,c",
+"^":"TpZ:3;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1854,15 +1786,19 @@
 if(y>=z.length)return H.e(z,y)
 z[y]=x},
 $isEH:true},
+aH8:{
+"^":"TpZ:74;a",
+$0:function(){return C.CD.yu(Math.floor(1000*this.a.now()))},
+$isEH:true},
 Cj:{
-"^":"TpZ:81;a,b,c",
+"^":"TpZ:80;a,b,c",
 $2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"TpZ:81;a,b",
+"^":"TpZ:80;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(0,a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1899,7 +1835,7 @@
 "^":"XS;K9,Ga",
 bu:[function(a){var z=this.Ga
 if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,69],
+return"NullError: Cannot call \""+H.d(z)+"\" on null"},"$0","gAY",0,0,71],
 $isJS:true,
 $isXS:true},
 u0:{
@@ -1909,7 +1845,7 @@
 if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
 y=this.cR
 if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,69],
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},"$0","gAY",0,0,71],
 $isJS:true,
 $isXS:true,
 static:{T3:function(a,b){var z,y
@@ -1920,13 +1856,13 @@
 vV:{
 "^":"XS;K9",
 bu:[function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,69]},
+return C.xB.gl0(z)?"Error":"Error: "+z},"$0","gAY",0,0,71]},
 Am:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
-XO:{
+oP:{
 "^":"a;lA,ui",
 bu:[function(a){var z,y
 z=this.ui
@@ -1935,30 +1871,30 @@
 y=typeof z==="object"?z.stack:null
 z=y==null?"":y
 this.ui=z
-return z},"$0","gAY",0,0,69]},
+return z},"$0","gAY",0,0,71]},
 dr:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"TpZ:72;b,c",
+"^":"TpZ:74;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"TpZ:72;d,e,f",
+"^":"TpZ:74;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"TpZ:72;UI,bK,Gq,Rm",
+"^":"TpZ:74;UI,bK,Gq,Rm",
 $0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
 Qx:{
-"^":"TpZ:72;w3,HZ,mG,xC,cj",
+"^":"TpZ:74;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 TpZ:{
 "^":"a;",
-bu:[function(a){return"Closure"},"$0","gAY",0,0,69],
+bu:[function(a){return"Closure"},"$0","gAY",0,0,71],
 $isEH:true,
 gKu:function(){return this}},
 Bp:{
@@ -1986,13 +1922,13 @@
 if(z[v]===a)return v}}}},
 Pe:{
 "^":"XS;G1>",
-bu:[function(a){return this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return this.G1},"$0","gAY",0,0,71],
 $isXS:true,
 static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
 bb:{
 "^":"XS;G1>",
-bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,69],
-static:{Yi:function(a){return new H.bb(a)}}},
+bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
+static:{S3:function(a){return new H.bb(a)}}},
 lbp:{
 "^":"a;"},
 GN:{
@@ -2030,7 +1966,7 @@
 t=H.kU(z)
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
-x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gAY",0,0,69],
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},"$0","gAY",0,0,71],
 static:{"^":"lcs",Dz:function(a){var z,y,x
 a=a
 z=[]
@@ -2038,17 +1974,17 @@
 return z}}},
 hJ:{
 "^":"lbp;",
-bu:[function(a){return"dynamic"},"$0","gAY",0,0,69],
+bu:[function(a){return"dynamic"},"$0","gAY",0,0,71],
 za:function(){return},
 $ishJ:true},
-tu:{
+Hs:{
 "^":"lbp;oc>",
 za:function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
-bu:[function(a){return this.oc},"$0","gAY",0,0,69]},
+bu:[function(a){return this.oc},"$0","gAY",0,0,71]},
 fw:{
 "^":"lbp;oc>,re,Et",
 za:function(){var z,y
@@ -2061,7 +1997,7 @@
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
-bu:[function(a){return H.d(this.oc)+"<"+J.uG(this.re,", ")+">"},"$0","gAY",0,0,69]},
+bu:[function(a){return H.d(this.oc)+"<"+J.xp(this.re,", ")+">"},"$0","gAY",0,0,71]},
 cu:{
 "^":"a;LU,ke",
 bu:[function(a){var z,y
@@ -2069,22 +2005,22 @@
 if(z!=null)return z
 y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
-return y},"$0","gAY",0,0,69],
+return y},"$0","gAY",0,0,71],
 giO:function(a){return J.v1(this.LU)},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"TpZ:82;b",
+"^":"TpZ:81;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 rh:{
-"^":"TpZ:5;c",
+"^":"TpZ:3;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
@@ -2134,7 +2070,7 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSP:true,
+$iswL:true,
 static:{v4:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
@@ -2182,26 +2118,26 @@
 $isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
+"^":"LPc;IF,Qw,cw,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+gv8:function(a){return a.IF},
+sv8:function(a,b){a.IF=this.ct(a,C.S4,a.IF,b)},
+gFR:function(a){return a.Qw},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-F6:[function(a,b,c,d){var z=a.fi
+sFR:function(a,b){a.Qw=this.ct(a,C.AV,a.Qw,b)},
+gph:function(a){return a.cw},
+sph:function(a,b){a.cw=this.ct(a,C.hf,a.cw,b)},
+F6:[function(a,b,c,d){var z=a.IF
 if(z===!0)return
-if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,83,46,47,84],
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).YM(new X.jE(a))}},"$3","gNa",6,0,82,49,50,83],
 static:{zy:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
+a.IF=!1
+a.Qw=null
+a.cw="action"
 a.Cc=[]
 a.q1=!1
 a.oG=!1
@@ -2214,17 +2150,17 @@
 "^":"xc+Pi;",
 $isd3:true},
 jE:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
 N.QM("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.Si(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
-Xk:function(a){var z=$.Vy().getItem(a)
+return z},"$1","vN",2,0,12,13],
+DUC:function(a){var z=$.Vy().getItem(a)
 if(z==null)return
 return C.xr.kV(z)},
 FI:function(a){if(a==null)return P.Vu(null,null,null)
@@ -2240,7 +2176,7 @@
 a=z.Z(a,1000)
 x=G.o1(y,3)
 for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","xK",2,0,15],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","HH",2,0,14],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2251,12 +2187,12 @@
 z=C.jn.Y(z,1000)
 if(y>0)return G.o1(y,2)+":"+G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)
 else return G.o1(x,2)+":"+G.o1(w,2)+"."+G.o1(z,3)},
-As:[function(a){var z=J.Wx(a)
+Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return C.CD.Sy(z.V(a,1024),1)+"KB"
 else if(z.C(a,1073741824))return C.CD.Sy(z.V(a,1048576),1)+"MB"
 else if(z.C(a,1099511627776))return C.CD.Sy(z.V(a,1073741824),1)+"GB"
-else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","p0",2,0,15,16],
+else return C.CD.Sy(z.V(a,1099511627776),1)+"TB"},"$1","Gt",2,0,14,15],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2281,7 +2217,7 @@
 z=b.gG2()
 H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gbf())
 z=b.gLi()
-H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gXa())}this.Eh=b},
+H.VM(new P.Ik(z),[H.Oq(z,0)]).yI(this.gVG())}this.Eh=b},
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
 gvK:function(){return this.cC},
@@ -2300,10 +2236,10 @@
 z.Cy()},
 x3:function(a){J.rA(this.cC,new G.xE(a,new G.cE()))},
 yS:[function(a){this.Pv=a
-this.og("error/",null)},"$1","gbf",2,0,85,24],
+this.og("error/",null)},"$1","gbf",2,0,84,23],
 kI:[function(a){this.Pv=a
 if(J.xC(J.Iz(a),"NetworkException"))this.Z6.bo(0,"#/vm-connect/")
-else this.og("error/",null)},"$1","gXa",2,0,86,87],
+else this.og("error/",null)},"$1","gVG",2,0,85,86],
 og:function(a,b){var z,y,x,w,v
 z=b==null?P.Fl(null,null):P.Ms(b,C.xM)
 for(y=this.OJ,x=0;x<y.length;++x){w=y[x]
@@ -2319,7 +2255,7 @@
 if(J.xC(this.Ef,a))return
 if(this.Ef!=null){N.QM("").To("Uninstalling page: "+H.d(this.Ef))
 this.Ef.oV()
-J.r4(this.bn)}N.QM("").To("Installing page: "+H.d(a))
+J.qv(this.bn)}N.QM("").To("Installing page: "+H.d(a))
 try{a.ci()}catch(y){x=H.Ru(y)
 z=x
 N.QM("").YX("Failed to install page: "+H.d(z))}this.bn.appendChild(a.gyF())
@@ -2328,10 +2264,10 @@
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.RG,w,x)
 w.$builtinTypeInfo=[null]
 this.nq(this,w)}this.Ef=x},
-ab:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,88,89],
+mn:[function(a){if(!!J.x(a).$isKM)this.m2.h(0,a.N)},"$1","gwn",2,0,87,88],
 aO:[function(a){if(!J.xC(this.Eh,a))return
 this.swv(0,null)
-this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,88,89],
+this.Z6.bo(0,"#/vm-connect/")},"$1","gkq",2,0,87,88],
 Ty:function(a){var z=this.m2.TY
 z=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),z,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
@@ -2344,13 +2280,13 @@
 this.AQ(!0)},
 static:{"^":"Kh<"}},
 cE:{
-"^":"TpZ:90;",
+"^":"TpZ:89;",
 $1:function(a){var z=J.RE(a)
 return J.xC(z.gfG(a),"IsolateInterrupted")||J.xC(z.gfG(a),"BreakpointReached")||J.xC(z.gfG(a),"ExceptionThrown")},
 $isEH:true},
 xE:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,91,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){return J.xC(J.aT(a),this.a)&&this.b.$1(a)===!0},"$1",null,2,0,null,90,"call"],
 $isEH:true},
 Kf:{
 "^":"a;KJ",
@@ -2392,12 +2328,12 @@
 this.bo(0,z)
 y.e6(a)}},
 ng:{
-"^":"yVe;MP,ec,c5,ro,dUC,pt",
+"^":"yVe;MP,ec,c5,ro,fb,pt",
 Cy:function(){var z=H.d(window.location.hash)
 if(window.location.hash===""||window.location.hash==="#")z="#"+this.MP
 window.history.pushState(z,document.title,z)
 this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,92,14],
+y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,91,13],
 wa:function(a){return"#"+H.d(a)}},
 OS:{
 "^":"Pi;i6>,yF<",
@@ -2414,12 +2350,12 @@
 this.i6.Eh.cv(a).ml(new G.mo(this)).OA(new G.Go5())},
 VU:function(a){return!0}},
 mo:{
-"^":"TpZ:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,93,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Go5:{
-"^":"TpZ:13;",
-$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){N.QM("").YX("ServiceObjectPage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 t9:{
 "^":"OS;i6,yF,fz,AP,fn",
@@ -2430,13 +2366,13 @@
 VU:function(a){return J.co(a,"class-tree/")},
 static:{"^":"rjk"}},
 Za:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,94,"call"],
+if(z!=null)J.uM(z,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ha:{
-"^":"TpZ:13;",
-$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){N.QM("").YX("ClassTreePage visit error: "+H.d(a))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Sy:{
 "^":"OS;i6,yF,fz,AP,fn",
@@ -2455,9 +2391,9 @@
 VU:function(a){return J.co(a,"vm-connect/")}},
 ut:{
 "^":"a;IU",
-cv:function(a){return G.Xk(this.IU+"."+H.d(a))}},
+cv:function(a){return G.DUC(this.IU+"."+H.d(a))}},
 KF:{
-"^":"TpZ:5;",
+"^":"TpZ:3;",
 $1:[function(a){var z,y,x,w
 z=C.xr.kV(a)
 if(z==null)return z
@@ -2466,14 +2402,14 @@
 while(!0){w=y.gB(z)
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
-y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,95,"call"],
+y.u(z,x,U.K9(y.t(z,x)));++x}return z},"$1",null,2,0,null,94,"call"],
 $isEH:true},
 XN:{
-"^":"TpZ:13;",
-$1:[function(a){},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 nD:{
-"^":"d3;wu,jY>,TY,ro,dUC,pt",
+"^":"d3;wu,jY>,TY,ro,fb,pt",
 BZ:function(){return"ws://"+H.d(window.location.host)+"/ws"},
 TP:function(a){var z=this.MG(a)
 if(z!=null)return z
@@ -2507,7 +2443,7 @@
 UJ:function(){var z,y,x,w,v
 z=this.jY
 z.V1(z)
-y=G.Xk(this.wu.IU+".history")
+y=G.DUC(this.wu.IU+".history")
 if(y==null)return
 x=J.U6(y)
 w=0
@@ -2516,17 +2452,17 @@
 if(!(w<v))break
 x.u(y,w,U.K9(x.t(y,w)));++w}z.FV(0,y)
 this.XT()},
-Ff:function(){this.UJ()
+XA:function(){this.UJ()
 var z=this.TP(this.BZ())
 this.TY=z
 this.h(0,z)},
 static:{"^":"dI"}},
 Un:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:function(a){if(J.xC(a.gw8(),this.b)&&J.xC(a.gA9(),!1))this.a.a=a},
 $isEH:true},
 jQ:{
-"^":"TpZ:96;",
+"^":"TpZ:95;",
 $2:function(a,b){return J.FW(b.geX(),a.geX())},
 $isEH:true},
 Y2:{
@@ -2544,7 +2480,7 @@
 return this.yq},
 k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
-iY:{
+xK:{
 "^":"Pi;vp>,AP,fn",
 mA:function(a){var z,y
 z=this.vp
@@ -2556,7 +2492,7 @@
 z=this.vp
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.kJ(z,x)+1,J.Mx(x))
+if(x.r8()===!0)y.oF(z,y.kJ(z,x)+1,J.Mx(x))
 else this.FS(x)},
 FS:function(a){var z,y,x,w,v
 z=J.RE(a)
@@ -2569,12 +2505,12 @@
 v=w.kJ(z,a)+1
 w.UZ(z,v,v+y)}},
 Kt:{
-"^":"a;ph>,OV<",
-static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,17]}},
+"^":"a;ph>,xy<",
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","ji",2,0,16]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
-lg:{
+Vz:{
 "^":"Pi;oH<,vp>,zz<",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
@@ -2584,15 +2520,17 @@
 F.Wi(this,C.JB,0,1)},
 eE:function(a,b){var z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
+return J.UQ(J.U8(z[a]),b)},
 PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,97],
-zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gPd",4,0,97],
+return J.FW(this.eE(b,this.pT),z)},"$2","gpPX",4,0,96],
+zF:[function(a,b){return J.FW(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gCa",4,0,96],
 Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
+H.PA()
+$.xj=$.zIm
+new P.VV(null,null).wE(0)
 z=this.zz
 if(this.jV){y=this.gpPX()
-H.rd(z,y)}else{y=this.gPd()
+H.rd(z,y)}else{y=this.gCa()
 H.rd(z,y)}},
 Ai:function(){C.Nm.sB(this.vp,0)
 C.Nm.sB(this.zz,0)},
@@ -2602,17 +2540,17 @@
 Gu:function(a,b){var z,y
 z=this.vp
 if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
+y=J.UQ(J.U8(z[a]),b)
 z=this.oH
 if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
+return z[b].gxy().$1(y)},
 YU:[function(a){var z
 if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 return J.ew(J.Yq(z[a]),"\u2003")}z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
 z=J.Yq(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,98]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,14,97]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
 Jz:[function(){var z,y,x,w,v
 z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.Zg,new E.ed(),C.ET,new E.wa(),C.BE,new E.Or(),C.WC,new E.YL(),C.hR,new E.wf(),C.S4,new E.Oa(),C.Ro,new E.emv(),C.hN,new E.Lbd(),C.AV,new E.QAa(),C.bV,new E.CvS(),C.C0,new E.edy(),C.eZ,new E.waE(),C.bk,new E.Ore(),C.lH,new E.YLa(),C.am,new E.wfa(),C.oE,new E.Oaa(),C.kG,new E.e0(),C.OI,new E.e1(),C.I9,new E.e2(),C.To,new E.e3(),C.XA,new E.e4(),C.i4,new E.e5(),C.qt,new E.e6(),C.p1,new E.e7(),C.yJ,new E.e8(),C.la,new E.e9(),C.yL,new E.e10(),C.bJ,new E.e11(),C.ox,new E.e12(),C.Je,new E.e13(),C.kI,new E.e14(),C.vY,new E.e15(),C.Rs,new E.e16(),C.Lw,new E.e17(),C.eR,new E.e18(),C.iE,new E.e19(),C.f4,new E.e20(),C.VK,new E.e21(),C.aH,new E.e22(),C.aK,new E.e23(),C.GP,new E.e24(),C.vs,new E.e25(),C.Gr,new E.e26(),C.TU,new E.e27(),C.Fe,new E.e28(),C.tP,new E.e29(),C.yh,new E.e30(),C.Zb,new E.e31(),C.u7,new E.e32(),C.p8,new E.e33(),C.qR,new E.e34(),C.ld,new E.e35(),C.ne,new E.e36(),C.B0,new E.e37(),C.r1,new E.e38(),C.mr,new E.e39(),C.Ek,new E.e40(),C.Pn,new E.e41(),C.YT,new E.e42(),C.h7,new E.e43(),C.R3,new E.e44(),C.WQ,new E.e45(),C.fV,new E.e46(),C.jU,new E.e47(),C.OO,new E.e48(),C.Mc,new E.e49(),C.FP,new E.e50(),C.kF,new E.e51(),C.UD,new E.e52(),C.Aq,new E.e53(),C.DS,new E.e54(),C.C9,new E.e55(),C.VF,new E.e56(),C.uU,new E.e57(),C.YJ,new E.e58(),C.eF,new E.e59(),C.oI,new E.e60(),C.ST,new E.e61(),C.QH,new E.e62(),C.qX,new E.e63(),C.rE,new E.e64(),C.nf,new E.e65(),C.EI,new E.e66(),C.JB,new E.e67(),C.RY,new E.e68(),C.d4,new E.e69(),C.cF,new E.e70(),C.SI,new E.e71(),C.zS,new E.e72(),C.YA,new E.e73(),C.Ge,new E.e74(),C.A7,new E.e75(),C.He,new E.e76(),C.im,new E.e77(),C.Ss,new E.e78(),C.k6,new E.e79(),C.oj,new E.e80(),C.PJ,new E.e81(),C.q2,new E.e82(),C.d2,new E.e83(),C.kN,new E.e84(),C.fn,new E.e85(),C.yB,new E.e86(),C.eJ,new E.e87(),C.iG,new E.e88(),C.Py,new E.e89(),C.pC,new E.e90(),C.uu,new E.e91(),C.qs,new E.e92(),C.XH,new E.e93(),C.tJ,new E.e94(),C.F8,new E.e95(),C.C1,new E.e96(),C.Nr,new E.e97(),C.nL,new E.e98(),C.a0,new E.e99(),C.Yg,new E.e100(),C.bR,new E.e101(),C.ai,new E.e102(),C.ob,new E.e103(),C.MY,new E.e104(),C.Iv,new E.e105(),C.Wg,new E.e106(),C.tD,new E.e107(),C.nZ,new E.e108(),C.Of,new E.e109(),C.Vl,new E.e110(),C.pY,new E.e111(),C.XL,new E.e112(),C.LA,new E.e113(),C.AT,new E.e114(),C.Lk,new E.e115(),C.dK,new E.e116(),C.xf,new E.e117(),C.rB,new E.e118(),C.bz,new E.e119(),C.Jx,new E.e120(),C.b5,new E.e121(),C.Lc,new E.e122(),C.hf,new E.e123(),C.uk,new E.e124(),C.Zi,new E.e125(),C.TN,new E.e126(),C.GI,new E.e127(),C.Wn,new E.e128(),C.ur,new E.e129(),C.VN,new E.e130(),C.EV,new E.e131(),C.VI,new E.e132(),C.eh,new E.e133(),C.SA,new E.e134(),C.kV,new E.e135(),C.vp,new E.e136(),C.cc,new E.e137(),C.DY,new E.e138(),C.Lx,new E.e139(),C.M3,new E.e140(),C.wT,new E.e141(),C.JK,new E.e142(),C.SR,new E.e143(),C.t6,new E.e144(),C.rP,new E.e145(),C.pX,new E.e146(),C.VD,new E.e147(),C.NN,new E.e148(),C.UX,new E.e149(),C.YS,new E.e150(),C.pu,new E.e151(),C.BJ,new E.e152(),C.c6,new E.e153(),C.td,new E.e154(),C.Gn,new E.e155(),C.zO,new E.e156(),C.vg,new E.e157(),C.YV,new E.e158(),C.If,new E.e159(),C.Ys,new E.e160(),C.zm,new E.e161(),C.nX,new E.e162(),C.xP,new E.e163(),C.XM,new E.e164(),C.Ic,new E.e165(),C.yG,new E.e166(),C.uI,new E.e167(),C.O9,new E.e168(),C.ba,new E.e169(),C.tW,new E.e170(),C.CG,new E.e171(),C.Wj,new E.e172(),C.vb,new E.e173(),C.UL,new E.e174(),C.AY,new E.e175(),C.QK,new E.e176(),C.AO,new E.e177(),C.Xd,new E.e178(),C.I7,new E.e179(),C.kY,new E.e180(),C.Wm,new E.e181(),C.GR,new E.e182(),C.KX,new E.e183(),C.ja,new E.e184(),C.Dj,new E.e185(),C.ir,new E.e186(),C.dx,new E.e187(),C.ni,new E.e188(),C.X2,new E.e189(),C.F3,new E.e190(),C.UY,new E.e191(),C.Aa,new E.e192(),C.nY,new E.e193(),C.tg,new E.e194(),C.HD,new E.e195(),C.iU,new E.e196(),C.eN,new E.e197(),C.ue,new E.e198(),C.nh,new E.e199(),C.L2,new E.e200(),C.Gs,new E.e201(),C.bE,new E.e202(),C.YD,new E.e203(),C.PX,new E.e204(),C.N8,new E.e205(),C.EA,new E.e206(),C.oW,new E.e207(),C.hd,new E.e208(),C.pH,new E.e209(),C.Ve,new E.e210(),C.jM,new E.e211(),C.W5,new E.e212(),C.uX,new E.e213(),C.nt,new E.e214(),C.IT,new E.e215(),C.li,new E.e216(),C.PM,new E.e217(),C.k5,new E.e218(),C.Nv,new E.e219(),C.Cw,new E.e220(),C.TW,new E.e221(),C.xS,new E.e222(),C.ft,new E.e223(),C.QF,new E.e224(),C.mi,new E.e225(),C.zz,new E.e226(),C.hO,new E.e227(),C.ei,new E.e228(),C.HK,new E.e229(),C.je,new E.e230(),C.Ef,new E.e231(),C.QL,new E.e232(),C.RH,new E.e233(),C.Q1,new E.e234(),C.ID,new E.e235(),C.z6,new E.e236(),C.bc,new E.e237(),C.kw,new E.e238(),C.ep,new E.e239(),C.J2,new E.e240(),C.zU,new E.e241(),C.OU,new E.e242(),C.bn,new E.e243(),C.mh,new E.e244(),C.Fh,new E.e245(),C.yv,new E.e246(),C.LP,new E.e247(),C.jh,new E.e248(),C.fj,new E.e249(),C.xw,new E.e250(),C.zn,new E.e251(),C.RJ,new E.e252(),C.Tc,new E.e253(),C.YE,new E.e254(),C.Uy,new E.e255()],null,null)
@@ -2625,1881 +2563,1881 @@
 $.qe=v
 $.M6=[new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391(),new E.e392(),new E.e393(),new E.e394(),new E.e395(),new E.e396(),new E.e397(),new E.e398(),new E.e399(),new E.e400(),new E.e401(),new E.e402(),new E.e403(),new E.e404(),new E.e405(),new E.e406(),new E.e407(),new E.e408(),new E.e409(),new E.e410(),new E.e411(),new E.e412(),new E.e413(),new E.e414(),new E.e415(),new E.e416(),new E.e417(),new E.e418(),new E.e419(),new E.e420(),new E.e421(),new E.e422(),new E.e423(),new E.e424(),new E.e425(),new E.e426(),new E.e427(),new E.e428(),new E.e429(),new E.e430(),new E.e431(),new E.e432(),new E.e433(),new E.e434(),new E.e435(),new E.e436(),new E.e437(),new E.e438(),new E.e439(),new E.e440(),new E.e441(),new E.e442(),new E.e443(),new E.e444(),new E.e445(),new E.e446()]
 $.UG=!0
-F.E2()},"$0","V7A",0,0,18],
+F.E2()},"$0","jk",0,0,17],
 em:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.r0(a)},
 $isEH:true},
 ed:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 wa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gA3()},
 $isEH:true},
 Or:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqZ()},
 $isEH:true},
 YL:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 wf:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gQ1()},
 $isEH:true},
 Oa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 emv:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 Lbd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gfj()},
 $isEH:true},
 QAa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 CvS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gCs()},
 $isEH:true},
 edy:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 waE:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Ore:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 YLa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.hn(a)},
 $isEH:true},
 wfa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.HP(a)},
 $isEH:true},
 Oaa:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zF(a)},
 $isEH:true},
 e0:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 e1:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Uf(a)},
 $isEH:true},
 e2:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.RC(a)},
 $isEH:true},
 e3:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gaP()},
 $isEH:true},
 e4:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.E3(a)},
 $isEH:true},
 e5:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.on(a)},
 $isEH:true},
 e6:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.SM(a)},
 $isEH:true},
 e7:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.goH()},
 $isEH:true},
 e8:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mh(a)},
 $isEH:true},
 e9:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jO(a)},
 $isEH:true},
 e10:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xe(a)},
 $isEH:true},
 e11:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.OT(a)},
 $isEH:true},
 e12:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ok(a)},
 $isEH:true},
 e13:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gl()},
 $isEH:true},
 e14:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.h6(a)},
 $isEH:true},
 e15:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jr(a)},
 $isEH:true},
 e16:{
-"^":"TpZ:13;",
-$1:function(a){return J.P3(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.Cg(a)},
 $isEH:true},
 e17:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.o4(a)},
 $isEH:true},
 e18:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guh()},
 $isEH:true},
 e19:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gP9()},
 $isEH:true},
 e20:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guH()},
 $isEH:true},
 e21:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.mP(a)},
 $isEH:true},
 e22:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.BT(a)},
 $isEH:true},
 e23:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.vi(a)},
 $isEH:true},
 e24:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nq(a)},
 $isEH:true},
 e25:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.k0(a)},
 $isEH:true},
 e26:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.rw(a)},
 $isEH:true},
 e27:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.lk(a)},
 $isEH:true},
 e28:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gej()},
 $isEH:true},
 e29:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gw2()},
 $isEH:true},
 e30:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.w8(a)},
 $isEH:true},
 e31:{
-"^":"TpZ:13;",
-$1:function(a){return J.is(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.zk(a)},
 $isEH:true},
 e32:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.kv(a)},
 $isEH:true},
 e33:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.a3(a)},
 $isEH:true},
 e34:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ts(a)},
 $isEH:true},
 e35:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ky(a)},
 $isEH:true},
 e36:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.io(a)},
 $isEH:true},
 e37:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.kE(a)},
 $isEH:true},
 e38:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Gl(a)},
 $isEH:true},
 e39:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mz(a)},
 $isEH:true},
 e40:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.nb(a)},
 $isEH:true},
 e41:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gty()},
 $isEH:true},
 e42:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yn(a)},
 $isEH:true},
 e43:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gMX()},
 $isEH:true},
 e44:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gx5()},
 $isEH:true},
 e45:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pm(a)},
 $isEH:true},
 e46:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gtJ()},
 $isEH:true},
 e47:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ec(a)},
 $isEH:true},
 e48:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ra(a)},
 $isEH:true},
 e49:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.YH(a)},
 $isEH:true},
 e50:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.WX(a)},
 $isEH:true},
 e51:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.IP(a)},
 $isEH:true},
 e52:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZd()},
 $isEH:true},
 e53:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.TM(a)},
 $isEH:true},
 e54:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xo(a)},
 $isEH:true},
 e55:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gkA()},
 $isEH:true},
 e56:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gGK()},
 $isEH:true},
 e57:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gan()},
 $isEH:true},
 e58:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gcQ()},
 $isEH:true},
 e59:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gS7()},
 $isEH:true},
 e60:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJz()},
 $isEH:true},
 e61:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.PY(a)},
 $isEH:true},
 e62:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.bu(a)},
 $isEH:true},
 e63:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.VL(a)},
 $isEH:true},
 e64:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zN(a)},
 $isEH:true},
 e65:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.m4(a)},
 $isEH:true},
 e66:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gmu()},
 $isEH:true},
 e67:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gCO()},
 $isEH:true},
 e68:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.MB(a)},
 $isEH:true},
 e69:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.eU(a)},
 $isEH:true},
 e70:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.DB(a)},
 $isEH:true},
 e71:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gGf()},
 $isEH:true},
 e72:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvS()},
 $isEH:true},
 e73:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJL()},
 $isEH:true},
 e74:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Er(a)},
 $isEH:true},
 e75:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.OB(a)},
 $isEH:true},
 e76:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.YQ(a)},
 $isEH:true},
 e77:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.tC(a)},
 $isEH:true},
 e78:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gu9()},
 $isEH:true},
 e79:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aW(a)},
 $isEH:true},
 e80:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aB(a)},
 $isEH:true},
 e81:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gL4()},
 $isEH:true},
 e82:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gaj()},
 $isEH:true},
 e83:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giq()},
 $isEH:true},
 e84:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gBm()},
 $isEH:true},
 e85:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xR(a)},
 $isEH:true},
 e86:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.US(a)},
 $isEH:true},
 e87:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gNI()},
 $isEH:true},
 e88:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gva()},
 $isEH:true},
 e89:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gKt()},
 $isEH:true},
 e90:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gp2()},
 $isEH:true},
 e91:{
-"^":"TpZ:13;",
-$1:function(a){return J.UU(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.IA(a)},
 $isEH:true},
 e92:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ew(a)},
 $isEH:true},
 e93:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVM()},
 $isEH:true},
 e94:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Xi(a)},
 $isEH:true},
 e95:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.bL(a)},
 $isEH:true},
 e96:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUB()},
 $isEH:true},
 e97:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gRs()},
 $isEH:true},
 e98:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ix(a)},
 $isEH:true},
 e99:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gni()},
 $isEH:true},
 e100:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gqy()},
 $isEH:true},
 e101:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.wz(a)},
 $isEH:true},
 e102:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.FN(a)},
 $isEH:true},
 e103:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Wk(a)},
 $isEH:true},
 e104:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gho()},
 $isEH:true},
 e105:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.eT(a)},
 $isEH:true},
 e106:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.C8(a)},
 $isEH:true},
 e107:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.tf(a)},
 $isEH:true},
 e108:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pO(a)},
 $isEH:true},
 e109:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cU(a)},
 $isEH:true},
 e110:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gW1()},
 $isEH:true},
 e111:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYG()},
 $isEH:true},
 e112:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gi2()},
 $isEH:true},
 e113:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gHY()},
 $isEH:true},
 e114:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gFo()},
 $isEH:true},
 e115:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.j0(a)},
 $isEH:true},
 e116:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ZN(a)},
 $isEH:true},
 e117:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.xa(a)},
 $isEH:true},
 e118:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.aT(a)},
 $isEH:true},
 e119:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.KG(a)},
 $isEH:true},
 e120:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giR()},
 $isEH:true},
 e121:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEB()},
 $isEH:true},
 e122:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Iz(a)},
 $isEH:true},
 e123:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Yq(a)},
 $isEH:true},
 e124:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uY(a)},
 $isEH:true},
 e125:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.X7(a)},
 $isEH:true},
 e126:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.IR(a)},
 $isEH:true},
 e127:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gPE()},
 $isEH:true},
 e128:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.q8(a)},
 $isEH:true},
 e129:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.ghX()},
 $isEH:true},
 e130:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvU()},
 $isEH:true},
 e131:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jl(a)},
 $isEH:true},
 e132:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gRd()},
 $isEH:true},
 e133:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zY(a)},
 $isEH:true},
 e134:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.de(a)},
 $isEH:true},
 e135:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ds(a)},
 $isEH:true},
 e136:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cO(a)},
 $isEH:true},
 e137:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gzM()},
 $isEH:true},
 e138:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gMN()},
 $isEH:true},
 e139:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.giP()},
 $isEH:true},
 e140:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gmd()},
 $isEH:true},
 e141:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.geH()},
 $isEH:true},
 e142:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yc(a)},
 $isEH:true},
 e143:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Yf(a)},
 $isEH:true},
 e144:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zq(a)},
 $isEH:true},
 e145:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ih(a)},
 $isEH:true},
 e146:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.z2(a)},
 $isEH:true},
 e147:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ZF(a)},
 $isEH:true},
 e148:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Lh(a)},
 $isEH:true},
 e149:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zv(a)},
 $isEH:true},
 e150:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.O6(a)},
 $isEH:true},
 e151:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Pf(a)},
 $isEH:true},
 e152:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUY()},
 $isEH:true},
 e153:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvK()},
 $isEH:true},
 e154:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Jj(a)},
 $isEH:true},
 e155:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.t8(a)},
 $isEH:true},
 e156:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gL1()},
 $isEH:true},
 e157:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gxQ()},
 $isEH:true},
 e158:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEl()},
 $isEH:true},
 e159:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gxH()},
 $isEH:true},
 e160:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ee(a)},
 $isEH:true},
 e161:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.JG(a)},
 $isEH:true},
 e162:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Lp(a)},
 $isEH:true},
 e163:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.z1(a)},
 $isEH:true},
 e164:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.AF(a)},
 $isEH:true},
 e165:{
-"^":"TpZ:13;",
-$1:function(a){return J.fi(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.LB(a)},
 $isEH:true},
 e166:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Kl(a)},
 $isEH:true},
 e167:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gU6()},
 $isEH:true},
 e168:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cj(a)},
 $isEH:true},
 e169:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.br(a)},
 $isEH:true},
 e170:{
-"^":"TpZ:13;",
-$1:function(a){return J.PB(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.jL(a)},
 $isEH:true},
 e171:{
-"^":"TpZ:13;",
-$1:function(a){return J.fy(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.L6(a)},
 $isEH:true},
 e172:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Qa(a)},
 $isEH:true},
 e173:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ks(a)},
 $isEH:true},
 e174:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.CN(a)},
 $isEH:true},
 e175:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ql(a)},
 $isEH:true},
 e176:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ul(a)},
 $isEH:true},
 e177:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gUx()},
 $isEH:true},
 e178:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.id(a)},
 $isEH:true},
 e179:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gm8()},
 $isEH:true},
 e180:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.BZ(a)},
 $isEH:true},
 e181:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.H1(a)},
 $isEH:true},
 e182:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Cm(a)},
 $isEH:true},
 e183:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.fU(a)},
 $isEH:true},
 e184:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.GH(a)},
 $isEH:true},
 e185:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.n8(a)},
 $isEH:true},
 e186:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gLc()},
 $isEH:true},
 e187:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gNS()},
 $isEH:true},
 e188:{
-"^":"TpZ:13;",
-$1:function(a){return a.gzK()},
+"^":"TpZ:12;",
+$1:function(a){return a.gVI()},
 $isEH:true},
 e189:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.iL(a)},
 $isEH:true},
 e190:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.k7(a)},
 $isEH:true},
 e191:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uW(a)},
 $isEH:true},
 e192:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.W2(a)},
 $isEH:true},
 e193:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UT(a)},
 $isEH:true},
 e194:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Kd(a)},
 $isEH:true},
 e195:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.pU(a)},
 $isEH:true},
 e196:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Tg(a)},
 $isEH:true},
 e197:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVc()},
 $isEH:true},
 e198:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gpF()},
 $isEH:true},
 e199:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.TY(a)},
 $isEH:true},
 e200:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gA6()},
 $isEH:true},
 e201:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Ry(a)},
 $isEH:true},
 e202:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UP(a)},
 $isEH:true},
 e203:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.UA(a)},
 $isEH:true},
 e204:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.zH(a)},
 $isEH:true},
 e205:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Zs(a)},
 $isEH:true},
 e206:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gXR()},
 $isEH:true},
 e207:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.NB(a)},
 $isEH:true},
 e208:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gzS()},
 $isEH:true},
 e209:{
-"^":"TpZ:13;",
-$1:function(a){return J.U8(a)},
+"^":"TpZ:12;",
+$1:function(a){return J.Cr(a)},
 $isEH:true},
 e210:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.oN(a)},
 $isEH:true},
 e211:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gV8()},
 $isEH:true},
 e212:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gp8()},
 $isEH:true},
 e213:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.F9(a)},
 $isEH:true},
 e214:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.HB(a)},
 $isEH:true},
 e215:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yI(a)},
 $isEH:true},
 e216:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jx(a)},
 $isEH:true},
 e217:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.jB(a)},
 $isEH:true},
 e218:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gS5()},
 $isEH:true},
 e219:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gDo()},
 $isEH:true},
 e220:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.guj()},
 $isEH:true},
 e221:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.j1(a)},
 $isEH:true},
 e222:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Aw(a)},
 $isEH:true},
 e223:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.l2(a)},
 $isEH:true},
 e224:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gm2()},
 $isEH:true},
 e225:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.dY(a)},
 $isEH:true},
 e226:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.yq(a)},
 $isEH:true},
 e227:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gki()},
 $isEH:true},
 e228:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZn()},
 $isEH:true},
 e229:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvs()},
 $isEH:true},
 e230:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVh()},
 $isEH:true},
 e231:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZX()},
 $isEH:true},
 e232:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Rg(a)},
 $isEH:true},
 e233:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.d5(a)},
 $isEH:true},
 e234:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.SG(a)},
 $isEH:true},
 e235:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.cs(a)},
 $isEH:true},
 e236:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gVF()},
 $isEH:true},
 e237:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gkw()},
 $isEH:true},
 e238:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.K2(a)},
 $isEH:true},
 e239:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.uy(a)},
 $isEH:true},
 e240:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gEy()},
 $isEH:true},
 e241:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.XJ(a)},
 $isEH:true},
 e242:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gjW()},
 $isEH:true},
 e243:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.P4(a)},
 $isEH:true},
 e244:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gJk()},
 $isEH:true},
 e245:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Q2(a)},
 $isEH:true},
 e246:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gSu()},
 $isEH:true},
 e247:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gSU()},
 $isEH:true},
 e248:{
-"^":"TpZ:13;",
-$1:function(a){return a.gXA()},
+"^":"TpZ:12;",
+$1:function(a){return a.gFc()},
 $isEH:true},
 e249:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gYY()},
 $isEH:true},
 e250:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gZ3()},
 $isEH:true},
 e251:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.ry(a)},
 $isEH:true},
 e252:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.I2(a)},
 $isEH:true},
 e253:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gTX()},
 $isEH:true},
 e254:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.NC(a)},
 $isEH:true},
 e255:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gV0()},
 $isEH:true},
 e256:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.RX(a,b)},
 $isEH:true},
 e257:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.L9(a,b)},
 $isEH:true},
 e258:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NV(a,b)},
 $isEH:true},
 e259:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.l7(a,b)},
 $isEH:true},
 e260:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.kB(a,b)},
 $isEH:true},
 e261:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ae(a,b)},
 $isEH:true},
 e262:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.IX(a,b)},
 $isEH:true},
 e263:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ed(a,b)},
 $isEH:true},
 e264:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NE(a,b)},
 $isEH:true},
 e265:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.WI(a,b)},
 $isEH:true},
 e266:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NZ(a,b)},
 $isEH:true},
 e267:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.T5(a,b)},
 $isEH:true},
 e268:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.i0(a,b)},
 $isEH:true},
 e269:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Sf(a,b)},
 $isEH:true},
 e270:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Jl(a,b)},
 $isEH:true},
 e271:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.TP(a,b)},
 $isEH:true},
 e272:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.LM(a,b)},
 $isEH:true},
 e273:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.au(a,b)},
 $isEH:true},
 e274:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ac(a,b)},
 $isEH:true},
 e275:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Yz(a,b)},
 $isEH:true},
 e276:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sej(b)},
 $isEH:true},
 e277:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sw2(b)},
 $isEH:true},
 e278:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qr(a,b)},
 $isEH:true},
 e279:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xW(a,b)},
 $isEH:true},
 e280:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Wy(a,b)},
 $isEH:true},
 e281:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.i2(a,b)},
 $isEH:true},
 e282:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.BC(a,b)},
 $isEH:true},
 e283:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.pB(a,b)},
 $isEH:true},
 e284:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.NO(a,b)},
 $isEH:true},
 e285:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.WB(a,b)},
 $isEH:true},
 e286:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.JZ(a,b)},
 $isEH:true},
 e287:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fR(a,b)},
 $isEH:true},
 e288:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uP(a,b)},
 $isEH:true},
 e289:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.vJ(a,b)},
 $isEH:true},
 e290:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Nf(a,b)},
 $isEH:true},
 e291:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Pl(a,b)},
 $isEH:true},
 e292:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.C3(a,b)},
 $isEH:true},
 e293:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.AI(a,b)},
 $isEH:true},
 e294:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.OE(a,b)},
 $isEH:true},
 e295:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.nA(a,b)},
 $isEH:true},
 e296:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fb(a,b)},
 $isEH:true},
 e297:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.siq(b)},
 $isEH:true},
 e298:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qy(a,b)},
 $isEH:true},
 e299:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.x0(a,b)},
 $isEH:true},
 e300:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sKt(b)},
 $isEH:true},
 e301:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cV(a,b)},
 $isEH:true},
 e302:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.mU(a,b)},
 $isEH:true},
 e303:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uM(a,b)},
 $isEH:true},
 e304:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.GZ(a,b)},
 $isEH:true},
 e305:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.hS(a,b)},
 $isEH:true},
 e306:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.mz(a,b)},
 $isEH:true},
 e307:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.pA(a,b)},
 $isEH:true},
 e308:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.shX(b)},
 $isEH:true},
 e309:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cl(a,b)},
 $isEH:true},
 e310:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Ql(a,b)},
 $isEH:true},
 e311:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xQ(a,b)},
 $isEH:true},
 e312:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.MX(a,b)},
 $isEH:true},
 e313:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.A4(a,b)},
 $isEH:true},
 e314:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wD(a,b)},
 $isEH:true},
 e315:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wJ(a,b)},
 $isEH:true},
 e316:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.oJ(a,b)},
 $isEH:true},
 e317:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.DF(a,b)},
 $isEH:true},
 e318:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.svK(b)},
 $isEH:true},
 e319:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.h9(a,b)},
 $isEH:true},
 e320:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sL1(b)},
 $isEH:true},
 e321:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sEl(b)},
 $isEH:true},
 e322:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sxH(b)},
 $isEH:true},
 e323:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.XF(a,b)},
 $isEH:true},
 e324:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.A1(a,b)},
 $isEH:true},
 e325:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.SF(a,b)},
 $isEH:true},
 e326:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Qv(a,b)},
 $isEH:true},
 e327:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.R8(a,b)},
 $isEH:true},
 e328:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Xg(a,b)},
 $isEH:true},
 e329:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.aw(a,b)},
 $isEH:true},
 e330:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.CJ(a,b)},
 $isEH:true},
 e331:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.P2(a,b)},
 $isEH:true},
 e332:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.J0(a,b)},
 $isEH:true},
 e333:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.PP(a,b)},
 $isEH:true},
 e334:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Sj(a,b)},
 $isEH:true},
 e335:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tv(a,b)},
 $isEH:true},
 e336:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.w7(a,b)},
 $isEH:true},
 e337:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ME(a,b)},
 $isEH:true},
 e338:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.kX(a,b)},
 $isEH:true},
 e339:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.q0(a,b)},
 $isEH:true},
 e340:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.EJ(a,b)},
 $isEH:true},
 e341:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.iH(a,b)},
 $isEH:true},
 e342:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.SO(a,b)},
 $isEH:true},
 e343:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.B9(a,b)},
 $isEH:true},
 e344:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.PN(a,b)},
 $isEH:true},
 e345:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sVc(b)},
 $isEH:true},
 e346:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.By(a,b)},
 $isEH:true},
 e347:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.jd(a,b)},
 $isEH:true},
 e348:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.uH(a,b)},
 $isEH:true},
 e349:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ZI(a,b)},
 $isEH:true},
 e350:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.fa(a,b)},
 $isEH:true},
 e351:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Cu(a,b)},
 $isEH:true},
 e352:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sV8(b)},
 $isEH:true},
 e353:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.EC(a,b)},
 $isEH:true},
 e354:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.xH(a,b)},
 $isEH:true},
 e355:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.wu(a,b)},
 $isEH:true},
 e356:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.Tx(a,b)},
 $isEH:true},
 e357:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sDo(b)},
 $isEH:true},
 e358:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.suj(b)},
 $isEH:true},
 e359:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.H3(a,b)},
 $isEH:true},
 e360:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.TZ(a,b)},
 $isEH:true},
 e361:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.t3(a,b)},
 $isEH:true},
 e362:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.my(a,b)},
 $isEH:true},
 e363:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sVF(b)},
 $isEH:true},
 e364:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.yO(a,b)},
 $isEH:true},
 e365:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.ZU(a,b)},
 $isEH:true},
 e366:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){a.sjW(b)},
 $isEH:true},
 e367:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tQ(a,b)},
 $isEH:true},
 e368:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.tH(a,b)},
 $isEH:true},
 e369:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e370:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e371:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e372:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e373:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e374:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e375:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e376:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e377:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e378:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e379:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e380:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e381:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e382:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e383:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-notify",C.Qt)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e384:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("nav-notify-item",C.a8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e385:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e386:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e387:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e388:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e389:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e390:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e391:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e392:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e393:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e394:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e395:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("class-view",C.ou)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e396:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e397:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e398:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e399:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e400:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e401:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("flag-list",C.Qb)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e402:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e403:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e404:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e405:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e406:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e407:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e408:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-ref",C.qZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e409:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e410:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e411:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e412:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e413:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e414:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e415:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e416:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e417:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e418:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e419:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e420:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e421:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-list-view",C.he)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e422:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e423:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e424:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e425:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e426:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e427:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e428:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e429:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e430:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e431:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e432:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e433:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e434:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e435:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e436:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e437:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e438:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e439:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e440:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e441:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e442:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e443:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e444:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-connect-target",C.ws)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e445:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-connect",C.bC)},"$0",null,0,0,null,"call"],
 $isEH:true},
 e446:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
 $isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":"pv;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"tu;BW,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.BW).YM(b)},"$1","gvC",2,0,19,98],
 static:{Dw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4512,7 +4450,7 @@
 C.Mw.ZL(a)
 C.Mw.XI(a)
 return a}}},
-pv:{
+tu:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
@@ -4555,10 +4493,10 @@
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.iY(z,null,null)
+a.Hm=new G.xK(z,null,null)
 z=a.CA
 if(z!=null)this.hP(a,z.gDZ())},
-GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,13,57],
+GU:[function(a,b){a.CA.WR().ml(new O.nc(a))},"$1","guz",2,0,12,59],
 hP:function(a,b){var z,y,x,w,v,u,t,s,r,q
 try{w=a.CA
 v=H.VM([],[G.Y2])
@@ -4575,11 +4513,11 @@
 w.push(s)
 a.Hm.mA(z)}catch(q){w=H.Ru(q)
 y=w
-x=new H.XO(q,null)
+x=new H.oP(q,null)
 N.QM("").wF("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,100,101],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,100,101],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -4589,8 +4527,8 @@
 if(typeof v!=="number")return v.W()
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,102,1,103,104],
+x=new H.oP(u,null)
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
 static:{l0:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4607,8 +4545,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 nc:{
-"^":"TpZ:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,105,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,104,"call"],
 $isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 ak:{
@@ -4619,13 +4557,13 @@
 sWt:function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,b)},
 gCF:function(a){return a.mN},
 sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,106,107],
-tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,108,109],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,108,110],
+vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,105,106],
+tl:[function(a,b){return a.yB.cv("instances?limit="+H.d(b)).ml(new Z.Ob(a))},"$1","gR1",2,0,107,108],
+S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,107,109],
 SK:[function(a,b){a.nJ=this.ct(a,C.yB,a.nJ,null)
 a.mN=this.ct(a,C.tg,a.mN,null)
-J.cI(a.yB).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,20,99],
+J.cI(a.yB).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.yB).YM(b)},"$1","gDX",2,0,19,98],
 static:{lW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4642,23 +4580,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 Ob:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,93,"call"],
+z.nJ=J.Q5(z,C.yB,z.nJ,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 SS:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,93,"call"],
+z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 VY:{
 "^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gtT:function(a){return a.tY},
 aV:[function(a,b){Q.xI.prototype.aV.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,12,59],
 static:{On:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4682,7 +4620,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.P9())},
-SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Xx).YM(b)},"$1","gvC",2,0,19,98],
 b0:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4692,10 +4630,10 @@
 return x},
 YI:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).h(0,"highlight")},"$3","gff",6,0,112,1,103,104],
+J.Uf(z).h(0,"highlight")},"$3","gff",6,0,111,2,102,103],
 Lk:[function(a,b,c,d){var z=this.b0(a,d)
 if(z==null)return
-J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,112,1,103,104],
+J.Uf(z).Rz(0,"highlight")},"$3","gAF",6,0,111,2,102,103],
 static:{fm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4712,8 +4650,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 P9:{
-"^":"TpZ:113;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:112;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,83,"call"],
 $isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 JI:{
@@ -4729,15 +4667,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 tn:[function(a,b){var z=a.oM
-a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,20,57],
+a.tH=this.ct(a,C.mr,a.tH,z)},"$1","ghy",2,0,19,59],
 WM:[function(a){var z=a.tH
 a.tH=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,17],
 cb:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.tH!==!0,this.gN2(a))}else{z=a.tH
-a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,83,46,47,84],
+a.tH=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,82,49,50,83],
 static:{oS:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -4807,7 +4745,7 @@
 H.qG(a,b+y,x,a,b)
 for(z=z.gA(c);z.G();b=w){w=b+1
 C.Nm.u(a,b,z.gl())}},
-na:function(a,b,c){var z,y
+h8:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
@@ -4972,7 +4910,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ad:function(a,b){return P.mW.prototype.ad.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"kY",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"aL")},30],
 es:function(a,b,c){var z,y,x
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
@@ -5074,14 +5012,14 @@
 "^":"i1;l6,T6",
 $isyN:true},
 MH:{
-"^":"Dk;lo,OI,T6",
+"^":"Anv;lo,OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){var z=this.OI
 if(z.G()){this.lo=this.mb(z.gl())
 return!0}this.lo=null
 return!1},
 gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
+$asAnv:function(a,b){return[b]}},
 A8:{
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.$1(a)},
@@ -5093,11 +5031,11 @@
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
+gA:function(a){var z=new H.vG(J.mY(this.l6),this.T6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
-Mo:{
-"^":"Dk;OI,T6",
+vG:{
+"^":"Anv;OI,T6",
 mb:function(a){return this.T6.$1(a)},
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
@@ -5130,20 +5068,20 @@
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},
 V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
 UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-JJ:{
+Zl:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
 Yj:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
 h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
@@ -5159,7 +5097,7 @@
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ark+JJ;",
+"^":"ark+Zl;",
 $isWO:true,
 $asWO:null,
 $isyN:true,
@@ -5181,7 +5119,7 @@
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
-bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,72],
+bu:[function(a){return"Symbol(\""+H.d(this.fN)+"\")"},"$0","gAY",0,0,74],
 $istx:true,
 $isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
@@ -5191,17 +5129,17 @@
 z.fixed$length=init
 return z}}],["dart.async","dart:async",,P,{
 "^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
+xg:function(){if(self.scheduleImmediate!=null)return P.vd()
 return P.K7()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,18],
+Bz:[function(a){P.YF(C.ny,a)},"$1","K7",2,0,18],
 VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.wY(a)},
 Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
+P.rT(C.ny,new P.Vq(a,z))
 return z},
 Ne:function(a,b){var z,y,x,w,v
 z={}
@@ -5229,20 +5167,10 @@
 try{P.Cx()}catch(z){H.Ru(z)
 $.ej().$1(P.yK())
 $.S6=$.S6.gaw()
-throw z}},"$0","yK",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.yK())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-HT:function(a,b,c,d,e,f){return e?H.VM(new P.Mv(b,c,d,a,null,0,null),[f]):H.VM(new P.q1(b,c,d,a,null,0,null),[f])},
+throw z}},"$0","yK",0,0,17],
+rb:function(a){var z=$.X3
+if(C.NU===z){P.Tk(null,null,C.NU,a)
+return}z.wr(z.xi(a,!0))},
 bK:function(a,b,c,d){var z
 if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
@@ -5255,15 +5183,15 @@
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 $.X3.hk(y,x)}},
-HC:[function(a){},"$1","C7",2,0,20,21],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,22,23,24,25],
-dL:[function(){},"$0","v3",0,0,18],
-FE:function(a,b,c){var z,y,x,w
+HC:[function(a){},"$1","C7",2,0,19,20],
+SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","Xq",2,2,21,22,23,24],
+dL:[function(){},"$0","v3",0,0,17],
+zE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 c.$2(z,y)}},
 NX:function(a,b,c,d){var z=a.ed()
 if(!!J.x(z).$isb8)z.YM(new P.dR(b,c,d))
@@ -5276,40 +5204,58 @@
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
+YF:function(a,b){var z=a.gVs()
 return H.cy(z<0?0:z,b)},
+dp:function(a,b){var z=a.gVs()
+return H.zw(z<0?0:z,b)},
 Us:function(a){var z=$.X3
 $.X3=a
 return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
+HM:function(a){if(a.geT(a)==null)return
+return a.geT(a).gQc()},
+CK:[function(a,b,c,d,e){P.Tk(null,null,C.NU,new P.FO(d,e))},"$5","wLZ",10,0,25,26,27,28,23,24],
 T8:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
+return y}finally{$.X3=z}},"$4","lw",8,0,29,26,27,28,30],
 V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,31,26,27,28,30,32],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-w6:[function(a,b,c,d){return d},"$4","l9",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","Lm",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","oQ",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-E1:[function(a,b,c,d,e){var z
+return y}finally{$.X3=z}},"$6","xd",12,0,33,26,27,28,30,8,9],
+nI:[function(a,b,c,d){return d},"$4","W7",8,0,34,26,27,28,30],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,35,26,27,28,30],
+bD:[function(a,b,c,d){return d},"$4","Dk",8,0,36,26,27,28,30],
+Tk:[function(a,b,c,d){var z,y
+if(C.NU!==c)d=c.ce(d)
+z=$.k8
+if(z==null){z=new P.OM(d,null)
+$.k8=z
+$.S6=z
+$.ej().$1(P.yK())}else{y=new P.OM(d,null)
+z.aw=y
+$.k8=y}},"$4","G2",8,0,37,26,27,28,30],
+PB:[function(a,b,c,d,e){return P.YF(d,C.NU!==c?c.ce(e):e)},"$5","vRP",10,0,38,26,27,28,39,40],
+PD:[function(a,b,c,d,e){return P.dp(d,C.NU!==c?c.UG(e):e)},"$5","oo",10,0,41,26,27,28,39,40],
+JjS:[function(a,b,c,d){H.qw(H.d(d))},"$4","hI",8,0,42,26,27,28,43],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,44],
+E1:[function(a,b,c,d,e){var z,y
 $.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Ak",10,0,44],
+if(d==null)d=C.Kk
+else if(!J.x(d).$isyQ)throw H.b(P.u("ZoneSpecifications must be instantiated with the provided constructor."))
+if(e==null)z=!!J.x(c).$ism0?c.gSe():P.YM(null,null,null,null,null)
+else{z=P.YM(null,null,null,null,null)
+z.FV(0,e)}y=new P.FQ(null,null,null,null,null,null,null,null,null,null,null,null,null,c,z)
+y.UE(c,d,z)
+return y},"$5","H2",10,0,45,26,27,28,46,47],
 C6:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -5319,7 +5265,7 @@
 Ik:{
 "^":"u2;ly"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,ly,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"Bx;Ae@,iE@,SJ@,ly,dB,o7,Bd,Lj,Gv,lz,Ri",
 gly:function(){return this.ly},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -5336,8 +5282,8 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+uO:[function(){},"$0","gp4",0,0,17],
+LP:[function(){},"$0","gZ9",0,0,17],
 static:{"^":"E2b,HCK,VCd"}},
 WVu:{
 "^":"a;iE@,SJ@",
@@ -5354,14 +5300,16 @@
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.v3())
+oD:function(a,b,c,d){var z,y,x
+if((this.Gv&4)!==0){if(c==null)c=P.v3()
+z=new P.EM($.X3,0,c)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.yc()
 return z}z=$.X3
-y=a?1:0
+y=d?1:0
 x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
 x.$builtinTypeInfo=this.$builtinTypeInfo
+x.aA(a,b,c,d,H.Oq(this,0))
 x.SJ=x
 x.iE=x
 y=this.SJ
@@ -5375,15 +5323,15 @@
 j0:function(a){if(a.giE()===a)return
 if(a.gP4())a.dK()
 else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
+if((this.Gv&2)===0&&this.iE===this)this.Of()}return},
 mO:function(a){},
 m4:function(a){},
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},114],
-js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,115,23,24,25],
+this.Iv(b)},"$1","gL0",2,0,function(){return H.IGs(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"WVu")},113],
+ld:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.pb(a,b)},function(a){return this.ld(a,null)},"JT","$2","$1","gGj",2,2,114,22,23,24],
 xO:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -5437,17 +5385,17 @@
 "^":"TpZ;a,b",
 $1:function(a){a.Rg(0,this.b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
 "^":"TpZ;a,b,c",
 $1:function(a){a.oJ(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 Bg:{
 "^":"TpZ;a",
 $1:function(a){a.Qj()},
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
+$signature:function(){return H.IGs(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
@@ -5462,16 +5410,16 @@
 b8:{
 "^":"a;",
 $isb8:true},
-w4:{
-"^":"TpZ:72;a,b",
+Vq:{
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 mQ:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z,y,x
 z=this.a
 y=z.b
@@ -5479,10 +5427,10 @@
 x=--z.c
 if(y!=null)if(x===0||this.b)z.a.w0(a,b)
 else{z.d=a
-z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,116,117,"call"],
+z.e=b}else if(x===0&&!this.b)z.a.w0(z.d,z.e)},"$2",null,4,0,null,115,116,"call"],
 $isEH:true},
 Tw:{
-"^":"TpZ:118;a,c,d",
+"^":"TpZ:117;a,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=--z.c
@@ -5492,7 +5440,7 @@
 x[w]=a
 if(y===0){z=z.a.MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
+z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 A5:{
 "^":"a;",
@@ -5504,14 +5452,14 @@
 "^":"Pf0;MM",
 j3:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,119,23,21],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,118,22,20],
 w0:[function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,115,23,24,25]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gYJ",2,2,114,22,23,24]},
 Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
+"^":"a;Gv,Lj<,jk,BQ@,OY?,As?,qV?,o4?",
 gcg:function(){return this.Gv>=4},
 gWj:function(){return this.Gv===4},
 gNm:function(){return this.Gv===8},
@@ -5566,7 +5514,7 @@
 P.HZ(this,z)},
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,22,23,24,25],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Qp","$2","$1","gaq",2,2,21,22,23,24],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
@@ -5619,6 +5567,10 @@
 if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
 if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
 if(s!=null)$.X3=s
+b.sOY(null)
+b.sAs(null)
+b.sqV(null)
+b.so4(null)
 if(x.d)return
 if(x.b===!0){y=x.c
 y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
@@ -5635,41 +5587,41 @@
 y=b
 b=q}}}},
 da:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 U7:{
-"^":"TpZ:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,20,"call"],
 $isEH:true},
 vr:{
-"^":"TpZ:120;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+"^":"TpZ:119;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 cX:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"TpZ:72;c,d",
+"^":"TpZ:74;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 ZL:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"TpZ:121;b,d,e,f",
+"^":"TpZ:120;b,d,e,f",
 $0:function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.c=new P.Ca(z,y)
 return!1}},
 $isEH:true},
 RW:{
-"^":"TpZ:18;c,b,UI,bK",
+"^":"TpZ:17;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
@@ -5677,7 +5629,7 @@
 x=!0
 if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(q,null)
 r=J.w8(z)
 p=w
 o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
@@ -5693,7 +5645,7 @@
 if(p)m.c=n.mg(u,J.w8(z),z.gI4())
 else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(q,null)
 r=J.w8(z)
 p=t
 o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
@@ -5705,13 +5657,13 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"TpZ:18;c,b,Gq,Rm,w3",
+"^":"TpZ:17;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
 try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 if(this.Gq){v=J.w8(this.c.e.gcG())
 u=y
 u=v==null?u==null:v===u
@@ -5725,24 +5677,24 @@
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
 $isEH:true},
 jZ:{
-"^":"TpZ:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,122,"call"],
+"^":"TpZ:12;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,121,"call"],
 $isEH:true},
 FZ:{
-"^":"TpZ:120;a,mG",
+"^":"TpZ:119;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isGc){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,22,23,24,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 wS:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},123],
-lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},123],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"wS",0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"bp",ret:P.wS,args:[{func:"Pw",args:[a]}]}},this.$receiver,"wS")},122],
+lM:[function(a,b){return H.VM(new P.AE(b,this),[H.ip(this,"wS",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"xv",ret:P.wS,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"wS")},122],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5759,7 +5711,7 @@
 z={}
 y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
@@ -5778,12 +5730,6 @@
 y=P.Dt([P.xu,H.ip(this,"wS",0)])
 this.KR(new P.oY(this,z),!0,new P.yZ(z,y),y.gaq())
 return y},
-gTw:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"wS",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
 grZ:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"wS",0))
@@ -5797,239 +5743,130 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.LB(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,124,"call"],
+P.zE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-LB:{
-"^":"TpZ:72;e,f",
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+Oh:{
+"^":"TpZ:74;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
-Oh:{
-"^":"TpZ:125;a,UI",
+jvH:{
+"^":"TpZ:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 tG:{
-"^":"TpZ:72;bK",
+"^":"TpZ:74;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
 "^":"TpZ;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,124,"call"],
+$1:[function(a){P.zE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 Rl:{
-"^":"TpZ:72;e,f",
+"^":"TpZ:74;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 Jb:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){},
 $isEH:true},
 M4:{
-"^":"TpZ:72;UI",
+"^":"TpZ:74;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Ia:{
+Ee:{
 "^":"TpZ;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,124,"call"],
+P.zE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,123,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 WN:{
-"^":"TpZ:72;e,f",
+"^":"TpZ:74;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"TpZ:125;a,UI",
+"^":"TpZ:124;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-BSd:{
-"^":"TpZ:72;bK",
+Ia:{
+"^":"TpZ:74;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 PI:{
-"^":"TpZ:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 uO:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 qg:{
-"^":"TpZ:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Wd:{
-"^":"TpZ:72;c",
+"^":"TpZ:74;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 oY:{
 "^":"TpZ;a,b",
-$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,114,"call"],
+$1:[function(a){this.b.h(0,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.a,"wS")}},
 yZ:{
-"^":"TpZ:72;c,d",
+"^":"TpZ:74;c,d",
 $0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
-xp:{
-"^":"TpZ;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
-OC:{
-"^":"TpZ:72;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
 UH:{
 "^":"TpZ;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
+z.a=a},"$1",null,2,0,null,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
+$signature:function(){return H.IGs(function(a){return{func:"Pw",args:[a]}},this.b,"wS")}},
 eI:{
-"^":"TpZ:72;a,c",
-$0:[function(){var z=this.a
-if(z.b){this.c.rX(z.a)
-return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
+"^":"TpZ:74;a,c",
+$0:[function(){var z,y,x,w
+x=this.a
+if(x.b){this.c.rX(x.a)
+return}try{x=H.DU()
+throw H.b(x)}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+this.c.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 yX:{
 "^":"a;",
 $isyX:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.Qk(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-SL:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-xO:function(a){var z=this.Gv
-if((z&4)!==0)return this.SL()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.SY()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.SL()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.Dn(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gQC()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.YM(this.gQC())
-v=new P.Bc(this)
-if(z!=null)z=z.YM(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"TpZ:72;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"TpZ:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-SY:function(){this.gEe().Qj()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.Dn(a,b,null))},
-SY:function(){this.gEe().w6(C.ZB)}},
-q1:{
-"^":"ZzD;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Mv:{
-"^":"MFI;nL<,p4<,Z9<,QC<,xG,Gv,yx",
-tA:function(){return this.QC.$0()}},
-MFI:{
-"^":"nR+TT;"},
 u2:{
-"^":"aN;ly",
-w4:function(a){return this.ly.ET(a)},
+"^":"ezY;",
+ht:function(a,b,c,d){return this.ly.oD(a,b,c,d)},
 giO:function(a){return(H.eQ(this.ly)^892482866)>>>0},
 n:function(a,b){if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isu2)return!1
 return b.ly===this.ly},
 $isu2:true},
-yU:{
-"^":"KA;ly<,pN,o7,Bd,Lj,Gv,lz,Ri",
+Bx:{
+"^":"KA;ly<",
 tA:function(){return this.gly().j0(this)},
-uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,18]},
+uO:[function(){this.gly().mO(this)},"$0","gp4",0,0,17],
+LP:[function(){this.gly().m4(this)},"$0","gZ9",0,0,17]},
 NOT:{
 "^":"a;"},
 KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-ps:function(a){this.pN=this.Lj.wY(a)},
+"^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
 fm:function(a,b){if(b==null)b=P.Xq()
 this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
 Fv:[function(a,b){var z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.YM(this.gDQ(this))
 if(z<128&&this.Ri!=null)this.Ri.IO()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -6039,15 +5876,14 @@
 if(z)this.Ri.t2(this)
 else{z=(this.Gv&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
+if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,17],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
-this.tk()
+this.rk()
 return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
 gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
+rk:function(){var z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0)this.Ri.IO()
 if((this.Gv&32)===0)this.Ri=null
@@ -6066,9 +5902,9 @@
 this.Gv=z
 if(z<32)this.SY()
 else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
+uO:[function(){},"$0","gp4",0,0,17],
+LP:[function(){},"$0","gZ9",0,0,17],
+tA:function(){return},
 w6:function(a){var z,y
 z=this.Ri
 if(z==null){z=new P.Qk(null,null,0)
@@ -6079,21 +5915,21 @@
 if(y<128)this.Ri.t2(this)}},
 Iv:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
-this.Lj.m1(this.pN,a)
+this.Lj.m1(this.dB,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.ut((z&4)!==0)},
 pb:function(a,b){var z,y
 z=this.Gv
 y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
+this.rk()
 z=this.lz
 if(!!J.x(z).$isb8)z.YM(y)
 else y.$0()}else{y.$0()
 this.ut((z&4)!==0)}},
 SY:function(){var z,y
 z=new P.qB(this)
-this.tk()
+this.rk()
 this.Gv=(this.Gv|16)>>>0
 y=this.lz
 if(!!J.x(y).$isb8)y.YM(z)
@@ -6120,10 +5956,19 @@
 else this.LP()
 this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
 if((z&64)!==0&&z<128)this.Ri.t2(this)},
+aA:function(a,b,c,d,e){var z=this.Lj
+this.dB=z.wY(a)
+this.fm(0,b)
+this.Bd=z.Al(c==null?P.v3():c)},
 $isyX:true,
-static:{"^":"Xx,bG,Q9e,Ir9,nav,Dr,JAK,vo,Pj"}},
+static:{"^":"Xx,kMJ,nS,Ir9,nav,Dr,JAK,vo,Pj",T6:function(a,b,c,d,e){var z,y
+z=$.X3
+y=d?1:0
+y=H.VM(new P.KA(null,null,null,z,y,null,null),[e])
+y.aA(a,b,c,d,e)
+return y}}},
 x1:{
-"^":"TpZ:18;a,b,c",
+"^":"TpZ:17;a,b,c",
 $0:[function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
@@ -6140,7 +5985,7 @@
 else y.m1(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
 qB:{
-"^":"TpZ:18;a",
+"^":"TpZ:17;a",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6149,21 +5994,12 @@
 z.Lj.bH(z.Bd)
 z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
 $isEH:true},
-aN:{
+ezY:{
 "^":"wS;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.ps(a)
-z.fm(0,d)
-z.y5(c)
-return z},
+KR:function(a,b,c,d){return this.ht(a,d,c,!0===b)},
 yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
+ht:function(a,b,c,d){return P.T6(a,b,c,d,H.Oq(this,0))}},
 ti:{
 "^":"a;aw@"},
 fZ:{
@@ -6186,7 +6022,7 @@
 this.Gv=1},
 IO:function(){if(this.Gv===1)this.Gv=3}},
 CR:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -6216,73 +6052,69 @@
 yc:function(){if((this.Gv&2)!==0)return
 this.Lj.wr(this.gXm())
 this.Gv=(this.Gv|2)>>>0},
-ps:function(a){},
 fm:function(a,b){},
-y5:function(a){this.Bd=a},
 Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 QE:[function(a){var z=this.Gv
 if(z>=4){z-=4
 this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
+if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,17],
 ed:function(){return},
 SY:[function(){var z=(this.Gv&4294967293)>>>0
 this.Gv=z
 if(z>=4)return
 this.Gv=(z|1)>>>0
 z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
+if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,17],
 $isyX:true,
 static:{"^":"FkV,ED7,ELg"}},
 dR:{
-"^":"TpZ:72;a,b,c",
+"^":"TpZ:74;a,b,c",
 $0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"TpZ:128;a,b",
+"^":"TpZ:127;a,b",
 $2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 QX:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 og:{
 "^":"wS;",
-KR:function(a,b,c,d){var z,y,x,w,v
+KR:function(a,b,c,d){var z,y,x,w
 b=!0===b
 z=H.ip(this,"og",0)
 y=H.ip(this,"og",1)
 x=$.X3
 w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.ps(a)
-v.fm(0,d)
-v.y5(c)
-return v},
+w=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
+w.aA(a,d,c,b,y)
+w.Xa(this,a,d,c,b,z,y)
+return w},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 kM:function(a,b){b.Rg(0,a)},
 $aswS:function(a,b){return[b]}},
 fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
+"^":"KA;KQ,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
 Rg:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.Rg.call(this,this,b)},
 oJ:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.oJ.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
+z.yy(0)},"$0","gp4",0,0,17],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
+z.QE(0)},"$0","gZ9",0,0,17],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},114],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,129,24,25],
-Sp:[function(){this.Qj()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
+vx:[function(a){this.KQ.kM(a,this)},"$1","gOa",2,0,function(){return H.IGs(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},113],
+xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,128,23,24],
+TE:[function(){this.Qj()},"$0","gH1",0,0,17],
+Xa:function(a,b,c,d,e,f,g){var z,y
 z=this.gOa()
 y=this.gve()
 this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
@@ -6295,7 +6127,7 @@
 z=null
 try{z=this.Dr(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.oJ(y,x)
 return}if(z===!0)J.wx(b,a)},
 $asog:function(a){return[a,a]},
@@ -6307,7 +6139,7 @@
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.oJ(y,x)
 return}J.wx(b,z)}},
 AE:{
@@ -6317,215 +6149,290 @@
 try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
 J.wx(b,z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 b.oJ(y,x)}}},
 Xa:{
 "^":"a;"},
-aYy:{
+fM:{
+"^":"a;M5,ig>"},
+n7:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,hY<,Ot<,jH<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,xk<",
+"^":"a;E2,hY,U1,jH,Ka,Xp,at,rb,Zq,NW,mp,xk",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.hY.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
+FI:function(a,b){return this.U1.$2(a,b)},
 mg:function(a,b,c){return this.jH.$3(a,b,c)},
 Al:function(a){return this.Ka.$1(a)},
 wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$1(a)},
+O8:function(a){return this.at.$1(a)},
 wr:function(a){return this.rb.$1(a)},
 RK:function(a,b){return this.rb.$2(a,b)},
 uN:function(a,b){return this.Zq.$2(a,b)},
 Ch:function(a,b){return this.mp.$1(b)},
-qp:function(a){return this.xk.$1$specification(a)}},
+qp:function(a){return this.xk.$1$specification(a)},
+$isyQ:true},
 e4y:{
 "^":"a;"},
 dl:{
 "^":"a;"},
 Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-c1:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().ghY()==null;)z=z.geT(z)
-return z.gtp().ghY().$4(z,new P.Id(z.geT(z)),a,b)},
-Eo:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().gjH()==null;)z=z.geT(z)
-return z.gtp().gjH().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
+"^":"a;Fu",
 RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gxk()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gxk().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+z=this.Fu.gwe()
+y=z.M5
+z.ig.$4(y,P.HM(y),a,b)}},
+m0:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
+fC:function(a){return this.gF7()===a.gF7()},
+$ism0:true},
+FQ:{
+"^":"m0;rA<,X2<,n8<,z0<,MQ<,CK<,we<,PN<,WB<,TL<,Pf<,Zo<,l5,eT>,Se<",
+gQc:function(){var z=this.l5
+if(z!=null)return z
+z=new P.Id(this)
+this.l5=z
+return z},
+gF7:function(){return this.Zo.M5},
 bH:function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 m1:function(a,b){var z,y,x,w
 try{x=this.FI(a,b)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 z8:function(a,b,c){var z,y,x,w
 try{x=this.mg(a,b,c)
 return x}catch(w){x=H.Ru(w)
 z=x
-y=new H.XO(w,null)
+y=new H.oP(w,null)
 return this.hk(z,y)}},
 xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
+if(b)return new P.OJ(this,z)
+else return new P.Yn(this,z)},
 ce:function(a){return this.xi(a,!0)},
 rO:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
+if(b)return new P.eP(this,z)
+else return new P.aQ(this,z)},
+UG:function(a){return this.rO(a,!0)},
 cl:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.cZ(this,z)}},
-TF:{
-"^":"TpZ:72;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"TpZ:72;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"TpZ:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"TpZ:80;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-cZ:{
-"^":"TpZ:80;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
+if(b)return new P.N9(this,z)
+else return new P.ap(this,z)},
+t:function(a,b){var z,y,x,w
 z=this.Se
 y=z.t(0,b)
 if(y!=null||z.x4(0,b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
+x=this.eT
+if(x!=null){w=J.UQ(x,b)
+if(w!=null)z.u(0,b,w)
+return w}return},
+hk:function(a,b){var z,y,x
+z=this.Zo
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+uI:function(a,b){var z,y,x
+z=this.Pf
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
 qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).Eo(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).V6(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
-Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
-FO:{
-"^":"TpZ:72;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+Gr:function(a){var z,y,x
+z=this.X2
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+FI:function(a,b){var z,y,x
+z=this.rA
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+mg:function(a,b,c){var z,y,x
+z=this.n8
+y=z.M5
+x=P.HM(y)
+return z.ig.$6(y,x,this,a,b,c)},
+Al:function(a){var z,y,x
+z=this.z0
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+wY:function(a){var z,y,x
+z=this.MQ
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+O8:function(a){var z,y,x
+z=this.CK
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+wr:function(a){var z,y,x
+z=this.we
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,a)},
+uN:function(a,b){var z,y,x
+z=this.PN
+y=z.M5
+x=P.HM(y)
+return z.ig.$5(y,x,this,a,b)},
+Ch:function(a,b){var z,y,x
+z=this.TL
+y=z.M5
+x=P.HM(y)
+return z.ig.$4(y,x,this,b)},
+UE:function(a,b,c){var z
+this.X2=this.eT.gX2()
+this.rA=this.eT.grA()
+this.n8=this.eT.gn8()
+z=b.Ka
+this.z0=z!=null?new P.fM(this,z):this.eT.gz0()
+z=b.Xp
+this.MQ=z!=null?new P.fM(this,z):this.eT.gMQ()
+this.CK=this.eT.gCK()
+this.we=this.eT.gwe()
+this.PN=this.eT.gPN()
+this.WB=this.eT.gWB()
+this.TL=this.eT.gTL()
+this.Pf=this.eT.gPf()
+this.Zo=this.eT.gZo()}},
+OJ:{
+"^":"TpZ:74;a,b",
+$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-eM:{
-"^":"TpZ:72;c,d",
+Yn:{
+"^":"TpZ:74;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+eP:{
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+aQ:{
+"^":"TpZ:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+N9:{
+"^":"TpZ:79;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+ap:{
+"^":"TpZ:79;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+FO:{
+"^":"TpZ:74;a,b",
 $0:[function(){var z,y
-z=this.c
+z=this.a
 P.FL("Uncaught Error: "+H.d(z))
-y=this.d
+y=this.b
 if(y==null&&!!J.x(z).$isXS)y=z.gI4()
 if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Uez:{
-"^":"TpZ:80;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-ghY:function(){return P.lw()},
-Gr:function(a){return this.ghY().$1(a)},
-gOt:function(){return P.MM()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-gjH:function(){return P.iy()},
-mg:function(a,b,c){return this.gjH().$3(a,b,c)},
-gKa:function(){return P.EU()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.l9()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.Lm()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gmp:function(a){return P.oQ()},
-Ch:function(a,b){return this.gmp(this).$1(b)},
-gxk:function(){return P.Ak()},
-qp:function(a){return this.gxk().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"m0;",
+gX2:function(){return C.F2},
+grA:function(){return C.Yl},
+gn8:function(){return C.Gu},
+gz0:function(){return C.pj},
+gMQ:function(){return C.F6},
+gCK:function(){return C.Xk},
+gwe:function(){return C.Zc},
+gPN:function(){return C.Sq},
+gWB:function(){return C.NA},
+gTL:function(){return C.uo},
+gPf:function(){return C.mc},
+gZo:function(){return C.Rt},
 geT:function(a){return},
-gtp:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
+gSe:function(){return $.wb()},
+gQc:function(){var z=$.Sk
+if(z!=null)return z
+z=new P.Id(this)
+$.Sk=z
+return z},
+gF7:function(){return this},
+bH:function(a){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$0()
+return x}x=P.T8(null,null,this,a)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+m1:function(a,b){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$1(b)
+return x}x=P.V7(null,null,this,a,b)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+z8:function(a,b,c){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$2(b,c)
+return x}x=P.Mu(null,null,this,a,b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+return P.CK(null,null,this,z,y)}},
+xi:function(a,b){if(b)return new P.hj(this,a)
+else return new P.MK(this,a)},
+ce:function(a){return this.xi(a,!0)},
+rO:function(a,b){if(b)return new P.pQ(this,a)
+else return new P.XW(this,a)},
+UG:function(a){return this.rO(a,!0)},
+cl:function(a,b){if(b)return new P.Ze(this,a)
+else return new P.dM(this,a)},
 t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.E1(this,null,this,a,b)},
+hk:function(a,b){return P.CK(null,null,this,a,b)},
+uI:function(a,b){return P.E1(null,null,this,a,b)},
 qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.T8(this,null,this,a)},
-FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
+Gr:function(a){if($.X3===C.NU)return a.$0()
+return P.T8(null,null,this,a)},
+FI:function(a,b){if($.X3===C.NU)return a.$1(b)
+return P.V7(null,null,this,a,b)},
+mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
+return P.Mu(null,null,this,a,b,c)},
 Al:function(a){return a},
 wY:function(a){return a},
 O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
+wr:function(a){P.Tk(null,null,this,a)},
+uN:function(a,b){return P.YF(a,b)},
+Ch:function(a,b){H.qw(b)},
+static:{"^":"ln,Sk"}},
+hj:{
+"^":"TpZ:74;a,b",
+$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
+$isEH:true},
+MK:{
+"^":"TpZ:74;c,d",
+$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
+$isEH:true},
+pQ:{
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+XW:{
+"^":"TpZ:12;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,32,"call"],
+$isEH:true},
+Ze:{
+"^":"TpZ:79;a,b",
+$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true},
+dM:{
+"^":"TpZ:79;c,d",
+$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,8,9,"call"],
+$isEH:true}}],["dart.collection","dart:collection",,P,{
 "^":"",
 EF:function(a,b,c){return H.B7(a,H.VM(new P.YB(0,null,null,null,null,null,0),[b,c]))},
 Fl:function(a,b){return H.VM(new P.YB(0,null,null,null,null,null,0),[a,b])},
-Ou:[function(a,b){return J.xC(a,b)},"$2","Hr",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
+Ou:[function(a,b){return J.xC(a,b)},"$2","Hr",4,0,48,49,50],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,51,49],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -6622,7 +6529,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
+FV:function(a,b){J.Me(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -6715,14 +6622,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 oi:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,130,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 DJ:{
 "^":"TpZ;a",
-$2:function(a,b){this.a.u(0,a,b)},
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
 PL:{
 "^":"bA;X5,vv,OX,OB,wV",
 nm:function(a){return H.CU(a)&0x3ffffff},
@@ -6749,11 +6656,11 @@
 z=a.length
 for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -6894,7 +6801,7 @@
 z=a.length
 for(y=0;y<z;++y)if(J.xC(J.up(a[y]),b))return y
 return-1},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 $isFo:true,
 $isZ0:true,
 $asZ0:null,
@@ -6903,14 +6810,14 @@
 delete z["<non-identifier-key>"]
 return z}}},
 a1:{
-"^":"TpZ:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,130,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 pk:{
 "^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
 "^":"a;kh>,cA@,DG@,zQ@"},
 i5:{
@@ -7219,9 +7126,9 @@
 return z}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},31],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"Uy",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"mW")},30],
 ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"RS",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},30],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -7263,7 +7170,7 @@
 w=J.x(y)
 if(w.n(y,0))return x
 y=w.W(y,1)}throw H.b(P.N(b))},
-bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,69],
+bu:[function(a){return P.Ix(this,"(",")")},"$0","gAY",0,0,71],
 $isQV:true,
 $asQV:null},
 ark:{
@@ -7301,8 +7208,8 @@
 z.We(a,b)
 return z.vM},
 ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"MQ",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"fQO",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lD")},30],
+lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"Gba",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},30],
 eR:function(a,b){return H.c1(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -7381,7 +7288,7 @@
 return}this.sB(a,this.gB(a)+1)
 this.YW(a,b+1,this.gB(a),a,b)
 this.u(a,b,c)},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 if(b<0||b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 z=J.x(c)
 if(!!z.$isyN)c=z.br(c)
@@ -7394,21 +7301,21 @@
 if(!!z.$isWO)this.zB(a,b,b+z.gB(c),c)
 else for(z=z.gA(c);z.G();b=y){y=b+1
 this.u(a,b,z.gl())}},
-bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(a,"[","]")},"$0","gAY",0,0,71],
 $isWO:true,
 $asWO:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,131,64,"call"],
+z.KF(b)},"$2",null,4,0,null,130,66,"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -7485,7 +7392,7 @@
 if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
 x[z]=null}this.eZ=0
 this.av=0;++this.qT}},
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,69],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 AR:function(){var z,y,x,w
 z=this.av
 if(z===this.eZ)throw H.b(H.DU());++this.qT
@@ -7553,7 +7460,7 @@
 y=this.v5
 H.qG(a,v,v+z,y,0)
 return this.eZ+v}},
-Pt:function(a,b){var z=Array(8)
+Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
@@ -7600,12 +7507,12 @@
 if(x>=z.length)return H.e(z,x)
 z[x]=w}return z},
 br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,69],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Oq(this,0),null])},"$1","gIr",2,0,function(){return H.IGs(function(a){return{func:"xPo",ret:P.QV,args:[{func:"JmR",args:[a]}]}},this.$receiver,"lfu")},30],
+bu:[function(a){return P.WE(this,"{","}")},"$0","gAY",0,0,71],
 ad:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+lM:[function(a,b){return H.VM(new H.oA(this,b),[H.Oq(this,0),null])},"$1","git",2,0,function(){return H.IGs(function(a){return{func:"PAJ",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},30],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -7735,7 +7642,7 @@
 gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 $isBa:true,
 $asvX1:function(a,b){return[a]},
 $asZ0:null,
@@ -7745,7 +7652,7 @@
 y=new P.An(c)
 return H.VM(new P.Ba(z,y,null,H.VM(new P.oz(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -7753,7 +7660,7 @@
 "^":"TpZ;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
@@ -7813,51 +7720,130 @@
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},
+VQ:function(a,b){return b.$2(null,new P.f1(b).$1(a))},
+KH:function(a){var z
+if(a==null)return
+if(typeof a!="object")return a
+if(Object.getPrototypeOf(a)!==Array.prototype)return new P.r4(a,Object.create(null),null)
+for(z=0;z<a.length;++z)a[z]=P.KH(a[z])
+return a},
 jc:function(a,b){var z,y,x,w
 x=a
 if(typeof x!=="string")throw H.b(P.u(a))
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-tp:[function(a){return a.Lt()},"$1","Jn",2,0,49,50],
-JC:{
-"^":"TpZ:80;",
-$2:function(a,b){return b},
-$isEH:true},
+throw H.b(P.cD(String(y)))}if(b==null)return P.KH(z)
+else return P.VQ(z,b)},
+tp:[function(a){return a.Lt()},"$1","Jn",2,0,52,0],
 f1:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){z=a
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
+if(Object.getPrototypeOf(a)===Array.prototype){for(z=this.a,y=0;y<a.length;++y)a[y]=z.$2(y,this.$1(a[y]))
+return a}z=Object.create(null)
+x=new P.r4(a,z,null)
+w=x.KN()
+for(v=J.U6(w),u=this.a,y=0;y<v.gB(w);++y){t=v.t(w,y)
+z[t]=u.$2(t,this.$1(a[t]))}x.rm=z
+return x},
 $isEH:true},
-Ukr:{
+r4:{
+"^":"a;rm,tk,zK",
+t:function(a,b){var z,y
+z=this.tk
+if(z==null)return J.UQ(this.zK,b)
+else if(typeof b!=="string")return
+else{y=z[b]
+return typeof y=="undefined"?this.KH(b):y}},
+gB:function(a){return this.tk==null?J.q8(this.zK):J.q8(this.KN())},
+gl0:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))===0},
+gor:function(a){return(this.tk==null?J.q8(this.zK):J.q8(this.KN()))>0},
+gvc:function(a){if(this.tk==null)return J.iY(this.zK)
+return J.Ld(this.KN(),0)},
+gUQ:function(a){if(this.tk==null)return J.U8(this.zK)
+return H.K1(this.KN(),new P.FE(this),null,null)},
+u:function(a,b,c){var z,y
+if(this.tk==null)J.kW(this.zK,b,c)
+else if(this.x4(0,b)){z=this.tk
+z[b]=c
+y=this.rm
+if(y==null?z!=null:y!==z)y[b]=null}else J.kW(this.Ad(),b,c)},
+FV:function(a,b){H.bQ(b,new P.E5(this))},
+x4:function(a,b){if(this.tk==null)return J.w4(this.zK,b)
+if(typeof b!=="string")return!1
+return Object.prototype.hasOwnProperty.call(this.rm,b)},
+to:function(a,b,c){var z
+if(this.x4(0,b))return this.t(0,b)
+z=c.$0()
+this.u(0,b,z)
+return z},
+Rz:function(a,b){if(this.tk!=null&&!this.x4(0,b))return
+return J.V1(this.Ad(),b)},
+V1:function(a){var z
+if(this.tk==null)J.Z8(this.zK)
+else{z=this.zK
+if(z!=null)J.Z8(z)
+this.tk=null
+this.rm=null
+this.zK=P.Fl(null,null)}},
+aN:function(a,b){var z,y,x,w,v
+if(this.tk==null)return J.Me(this.zK,b)
+z=this.KN()
+for(y=J.U6(z),x=0;x<y.gB(z);++x){w=y.t(z,x)
+v=this.tk[w]
+if(typeof v=="undefined"){v=P.KH(this.rm[w])
+this.tk[w]=v}b.$2(w,v)
+if(z!==this.zK)throw H.b(P.a4(this))}},
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
+KN:function(){var z=this.zK
+if(z==null){z=Object.keys(this.rm)
+this.zK=z}return z},
+Ad:function(){var z,y,x,w,v
+if(this.tk==null)return this.zK
+z=P.Fl(null,null)
+y=this.KN()
+for(x=J.U6(y),w=0;w<x.gB(y);++w){v=x.t(y,w)
+z.u(0,v,this.t(0,v))}if(x.gl0(y))x.h(y,null)
+else x.V1(y)
+this.tk=null
+this.rm=null
+this.zK=z
+return z},
+KH:function(a){var z
+if(!Object.prototype.hasOwnProperty.call(this.rm,a))return
+z=P.KH(this.rm[a])
+return this.tk[a]=z},
+$isFo:true,
+$asFo:function(){return[null,null]},
+$isZ0:true,
+$asZ0:function(){return[null,null]}},
+FE:{
+"^":"TpZ:12;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,129,"call"],
+$isEH:true},
+E5:{
+"^":"TpZ:79;a",
+$2:function(a,b){this.a.u(0,a,b)},
+$isEH:true},
+Uk:{
 "^":"a;"},
 wIe:{
 "^":"a;"},
 Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
+"^":"Uk;",
+$asUk:function(){return[P.qU,[P.WO,P.KN]]}},
 AJ:{
 "^":"XS;Pc,FN",
 bu:[function(a){if(this.FN!=null)return"Converting object to an encodable object failed."
-else return"Converting object did not return an encodable object."},"$0","gAY",0,0,69],
+else return"Converting object did not return an encodable object."},"$0","gAY",0,0,71],
 static:{Gy:function(a,b){return new P.AJ(a,b)}}},
 K8:{
 "^":"AJ;Pc,FN",
-bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,69],
+bu:[function(a){return"Cyclic error in JSON stringify"},"$0","gAY",0,0,71],
 static:{ko:function(a){return new P.K8(a,null)}}},
 byg:{
-"^":"Ukr;qa<,N9",
+"^":"Uk;qa<,ma",
 pW:function(a,b){return P.jc(a,this.gP1().qa)},
 kV:function(a){return this.pW(a,null)},
 Q0:function(a,b){var z=this.gZE()
@@ -7865,7 +7851,7 @@
 KP:function(a){return this.Q0(a,null)},
 gZE:function(){return C.cb},
 gP1:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
+$asUk:function(){return[P.a,P.qU]}},
 ojF:{
 "^":"wIe;UM,SI",
 $aswIe:function(){return[P.a,P.qU]}},
@@ -7873,8 +7859,8 @@
 "^":"wIe;qa<",
 $aswIe:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;N9,cP,ol",
-iY:function(a){return this.N9.$1(a)},
+"^":"a;ma,cP,ol",
+iY:function(a){return this.ma.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
@@ -7920,9 +7906,8 @@
 t=H.mx(92)
 x.vM+=t
 t=H.mx(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
+x.vM+=t}}if(w===0)x.KF(a)
+else if(w<y)x.KF(z.Nj(a,w,y))},
 WD:function(a){var z,y,x,w
 for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.ko(a))}z.push(a)},
@@ -7935,7 +7920,8 @@
 x.pop()}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.Gy(a,y))}}},
-Jc:function(a){var z,y,x,w,v,u
+Jc:function(a){var z,y,x,w
+z={}
 if(typeof a==="number"){if(!C.CD.gzr(a))return!1
 this.cP.KF(C.CD.bu(a))
 return!0}else if(a===!0){this.cP.KF("true")
@@ -7945,34 +7931,44 @@
 z.KF("\"")
 this.Ip(a)
 z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.cP
-y.KF("[")
-if(z.gB(a)>0){this.C7(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.C7(z.t(a,x))}}y.KF("]")
+return!0}else{y=J.x(a)
+if(!!y.$isWO){this.WD(a)
+z=this.cP
+z.KF("[")
+if(y.gB(a)>0){this.C7(y.t(a,0))
+for(x=1;x<y.gB(a);++x){z.vM+=","
+this.C7(y.t(a,x))}}z.KF("]")
 this.pg(a)
-return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.cP
-y.KF("{")
-for(w=J.mY(z.gvc(a)),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
+return!0}else if(!!y.$isZ0){this.WD(a)
+w=this.cP
+w.KF("{")
+z.a="\""
+y.aN(a,new P.tF(z,this))
+w.KF("}")
 this.pg(a)
 return!0}else return!1}},
 pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,ATf,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"Gsm,hyY,Ta6,Jyf,NoV,HVe,vk,BLm,KQz,Ho,mrt,NXu,CE,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.Jn()
 z=P.p9("")
 P.xl(z,b,c).C7(a)
 return z.vM}}},
+tF:{
+"^":"TpZ:80;a,b",
+$2:[function(a,b){var z,y,x
+z=this.b
+y=z.cP
+x=this.a
+y.KF(x.a)
+x.a=",\""
+z.Ip(a)
+y.KF("\":")
+z.C7(b)},"$2",null,4,0,null,77,20,"call"],
+$isEH:true},
 u5F:{
-"^":"Ziv;IE",
+"^":"Ziv;IW",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -8058,18 +8054,18 @@
 z[u]=128|v&63}}return w},
 static:{"^":"Jf4"}},
 GY:{
-"^":"wIe;IE",
+"^":"wIe;IW",
 WJ:function(a){var z,y
 z=P.p9("")
-y=new P.tz(this.IE,z,!0,0,0,0)
+y=new P.tz(this.IW,z,!0,0,0,0)
 y.ME(a,0,J.q8(a))
 y.fZ()
 return z.vM},
 $aswIe:function(){return[[P.WO,P.KN],P.qU]}},
 tz:{
-"^":"a;IE,ZB,AX,FU,kN,NY",
+"^":"a;IW,ZB,AX,FU,kN,NY",
 xO:function(a){this.fZ()},
-fZ:function(){if(this.kN>0){if(this.IE!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
+fZ:function(){if(this.kN>0){if(this.IW!==!0)throw H.b(P.cD("Unfinished UTF-8 octet sequence"))
 this.ZB.KF(H.mx(65533))
 this.FU=0
 this.kN=0
@@ -8083,8 +8079,8 @@
 this.FU=0
 this.kN=0
 this.NY=0
-v=new P.zC(z,this,a)
-$loop$0:for(u=this.ZB,t=this.IE!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
+v=new P.zC(z,this,a,b,c)
+$loop$0:for(u=this.ZB,t=this.IW!==!0,s=J.U6(a),r=b;!0;r=o){$multibyte$2:{if(x>0){do{if(r===c)break $loop$0
 q=s.t(a,r)
 p=J.Wx(q)
 if(p.i(q,192)!==128){if(t)throw H.b(P.cD("Bad UTF-8 encoding 0x"+p.WZ(q,16)))
@@ -8131,7 +8127,7 @@
 this.NY=w}},
 static:{"^":"ADi"}},
 zC:{
-"^":"TpZ:132;a,b,c",
+"^":"TpZ:131;a,b,c,d,e",
 $2:function(a,b){var z,y,x
 z=a===0&&b===J.q8(this.c)
 y=this.b
@@ -8142,7 +8138,7 @@
 $isEH:true}}],["dart.core","dart:core",,P,{
 "^":"",
 Te:function(a){return},
-Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,51,46,47],
+Wc:[function(a,b){return J.FW(a,b)},"$2","n4",4,0,53,49,50],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -8162,12 +8158,8 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-NS:[function(a){return H.CU(a)},"$1","nI",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,54],
+NS:[function(a){return H.CU(a)},"$1","cEg",2,0,55],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -8181,11 +8173,11 @@
 else y.$1(z)},
 Qe:function(a){return H.LY(a.constructor!==Array?P.F(a,!0,null):a)},
 Y25:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a.gfN(a),b)},
 $isEH:true},
 CL:{
-"^":"TpZ:133;a",
+"^":"TpZ:132;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
@@ -8215,12 +8207,12 @@
 t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
 s=P.pV(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
-else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,69],
+else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},"$0","gAY",0,0,71],
 h:function(a,b){return P.Wu(J.ew(this.y3,b.gVs()),this.aL)},
 EK:function(){H.o2(this)},
 RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,p2W,h2,QC3,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,lme",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp,Eu,p2W,h2,KL,EQe,NXt,tp1,Gio,Fz,cR,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ik(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -8267,12 +8259,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"TpZ:134;",
+"^":"TpZ:133;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"TpZ:135;",
+"^":"TpZ:134;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -8306,11 +8298,11 @@
 x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
 w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
 v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gAY",0,0,69],
+return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},"$0","gAY",0,0,71],
 $isa6:true,
 static:{"^":"Bp7,S4d,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,kTB,IJZ,iI,VkA,S84,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"TpZ:15;",
+"^":"TpZ:14;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -8319,26 +8311,26 @@
 return"00000"+H.d(a)},
 $isEH:true},
 DW:{
-"^":"TpZ:15;",
+"^":"TpZ:14;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
 XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
 $isXS:true},
 LK:{
 "^":"XS;",
-bu:[function(a){return"Throw of null."},"$0","gAY",0,0,69]},
+bu:[function(a){return"Throw of null."},"$0","gAY",0,0,71]},
 OY:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},"$0","gAY",0,0,69],
+return"Illegal argument(s)"},"$0","gAY",0,0,71],
 static:{u:function(a){return new P.OY(a)}}},
 Sn:{
 "^":"OY;G1",
-bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,69],
+bu:[function(a){return"RangeError: "+H.d(this.G1)},"$0","gAY",0,0,71],
 static:{KP:function(a){return new P.Sn(a)},N:function(a){return new P.Sn("value "+H.d(a))},TE:function(a,b,c){return new P.Sn("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
 Np:{
 "^":"XS;",
@@ -8354,59 +8346,59 @@
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
 v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,69],
+return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},"$0","gAY",0,0,71],
 $isJS:true,
 static:{lr:function(a,b,c,d,e){return new P.JS(a,b,c,d,e)}}},
 ub:{
 "^":"XS;G1>",
-bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"Unsupported operation: "+this.G1},"$0","gAY",0,0,71],
 static:{f:function(a){return new P.ub(a)}}},
 rM:{
 "^":"XS;G1>",
 bu:[function(a){var z=this.G1
-return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,69],
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},"$0","gAY",0,0,71],
 $isXS:true,
 static:{SY:function(a){return new P.rM(a)}}},
 lj:{
 "^":"XS;G1>",
-bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"Bad state: "+this.G1},"$0","gAY",0,0,71],
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
 "^":"XS;YA",
 bu:[function(a){var z=this.YA
 if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,69],
+return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},"$0","gAY",0,0,71],
 static:{a4:function(a){return new P.UV(a)}}},
 qn:{
 "^":"a;",
-bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,69],
+bu:[function(a){return"Out of Memory"},"$0","gAY",0,0,71],
 gI4:function(){return},
 $isXS:true},
 KY:{
 "^":"a;",
-bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,69],
+bu:[function(a){return"Stack Overflow"},"$0","gAY",0,0,71],
 gI4:function(){return},
 $isXS:true},
 t7:{
 "^":"XS;Wo",
-bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,69],
+bu:[function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},"$0","gAY",0,0,71],
 static:{mE:function(a){return new P.t7(a)}}},
 HG:{
 "^":"a;G1>",
 bu:[function(a){var z=this.G1
 if(z==null)return"Exception"
-return"Exception: "+H.d(z)},"$0","gAY",0,0,69]},
+return"Exception: "+H.d(z)},"$0","gAY",0,0,71]},
 oe:{
 "^":"a;G1>",
-bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,69],
+bu:[function(a){return"FormatException: "+H.d(this.G1)},"$0","gAY",0,0,71],
 static:{cD:function(a){return new P.oe(a)}}},
 eV:{
 "^":"a;",
-bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,69],
+bu:[function(a){return"IntegerDivisionByZeroException"},"$0","gAY",0,0,71],
 static:{ts:function(){return new P.eV()}}},
 qo:{
 "^":"a;oc>",
-bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,69],
+bu:[function(a){return"Expando:"+H.d(this.oc)},"$0","gAY",0,0,71],
 t:function(a,b){var z=H.of(b,"expando$values")
 return z==null?null:H.of(z,this.J4())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
@@ -8430,7 +8422,7 @@
 "^":"a;",
 $isQV:true,
 $asQV:null},
-Dk:{
+Anv:{
 "^":"a;"},
 WO:{
 "^":"a;",
@@ -8446,7 +8438,7 @@
 $asZ0:null},
 c8:{
 "^":"a;",
-bu:[function(a){return"null"},"$0","gAY",0,0,69]},
+bu:[function(a){return"null"},"$0","gAY",0,0,71]},
 "+Null":0,
 FK:{
 "^":"a;",
@@ -8456,7 +8448,7 @@
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
-bu:[function(a){return H.a5(this)},"$0","gAY",0,0,69],
+bu:[function(a){return H.a5(this)},"$0","gAY",0,0,71],
 T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
 gbx:function(a){return new H.cu(H.wO(this),null)},
 $isa:true},
@@ -8470,23 +8462,20 @@
 BpP:{
 "^":"a;"},
 VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
+"^":"a;yz,wj",
+wE:function(a){var z,y
 z=this.yz==null
 if(!z&&this.wj==null)return
-if(z)this.yz=H.Ao()
-else{z=H.Ao()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
+y=$.lEO
+if(z)this.yz=y.$0()
+else{this.yz=J.Hn(y.$0(),J.Hn(this.wj,this.yz))
+this.wj=null}},
+static:{"^":"xj"}},
 qU:{
 "^":"a;",
 $isqU:true},
 "+String":0,
-WU:{
+Kg:{
 "^":"a;Cb,R7,C3,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
@@ -8519,7 +8508,7 @@
 y=z.gl()
 this.vM+=typeof y==="string"?y:H.d(y)}}},
 V1:function(a){this.vM=""},
-bu:[function(a){return this.vM},"$0","gAY",0,0,69],
+bu:[function(a){return this.vM},"$0","gAY",0,0,71],
 PD:function(a){if(typeof a==="string")this.vM=a
 else this.KF(a)},
 static:{p9:function(a){var z=new P.Rn("")
@@ -8532,26 +8521,19 @@
 "^":"a;",
 $isuq:true},
 q5:{
-"^":"a;Bo,mn,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.mn,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.mn},
+"^":"a;Bo,IE,pO,Fi,ux,Ev,bM,hO,lH",
+gJf:function(a){var z=this.Bo
+if(z==null)return""
+if(J.rY(z).nC(z,"["))return C.xB.Nj(z,1,z.length-1)
+return z},
+gtp:function(a){var z=this.IE
+if(z==null)return P.bG(this.Fi)
+return z},
 gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.bm()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-yM:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.et(a,"/.")!==-1},
+yM:function(a,b){if(a==="")return"/"+b
+return C.xB.Nj(a,0,C.xB.cn(a,"/")+1)+b},
+K2:function(a){if(a.length>0&&C.xB.j(a,0)===58)return!0
+return C.xB.kJ(a,"/.")!==-1},
 KO:function(a){var z,y,x,w,v
 if(!this.K2(a))return a
 z=[]
@@ -8565,217 +8547,329 @@
 else{z.push(w)
 x=!1}}if(x)z.push("")
 return C.Nm.zV(z,"/")},
-bu:[function(a){var z,y
+bu:[function(a){var z,y,x,w
 z=P.p9("")
 y=this.Fi
 if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.mn,0)){z.KF(":")
-z.KF(J.AG(this.mn))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},"$0","gAY",0,0,69],
-n:function(a,b){var z,y,x
+z.KF(":")}x=this.Bo
+w=x==null
+if(!w||C.xB.nC(this.pO,"//")||y==="file"){z.KF("//")
+y=this.ux
+if(C.xB.gor(y)){z.KF(y)
+z.KF("@")}if(!w)z.KF(x)
+y=this.IE
+if(y!=null){z.KF(":")
+z.KF(y)}}z.KF(this.pO)
+y=this.Ev
+if(y!=null){z.KF("?")
+z.KF(y)}y=this.bM
+if(y!=null){z.KF("#")
+z.KF(y)}return z.vM},"$0","gAY",0,0,71],
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
+if(this.Fi===b.Fi)if(this.Bo!=null===(b.Bo!=null))if(this.ux===b.ux){y=this.gJf(this)
+x=z.gJf(b)
+if(y==null?x==null:y===x){y=this.gtp(this)
+z=z.gtp(b)
+if(y==null?z==null:y===z)if(this.pO===b.pO){z=this.Ev
+y=z==null
+x=b.Ev
+w=x==null
+if(!y===!w){if(y)z=""
+if(z==null?(w?"":x)==null:z===(w?"":x)){z=this.bM
+y=z==null
+x=b.bM
+w=x==null
+if(!y===!w){if(y)z=""
+z=z==null?(w?"":x)==null:z===(w?"":x)}else z=!1}else z=!1}else z=!1}else z=!1
+else z=!1}else z=!1}else z=!1
 else z=!1
 else z=!1
 return z},
-giO:function(a){var z=new P.Wf()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.mn=0
-else if(h==="https"&&J.xC(e,443))this.mn=0
-else this.mn=e
-this.pO=this.x6(c,d)},
+giO:function(a){var z,y,x,w,v
+z=new P.Wf()
+y=this.gJf(this)
+x=this.gtp(this)
+w=this.Ev
+if(w==null)w=""
+v=this.bM
+return z.$2(this.Fi,z.$2(this.ux,z.$2(y,z.$2(x,z.$2(this.pO,z.$2(w,z.$2(v==null?"":v,1)))))))},
 $isq5:true,
-static:{"^":"QqF,q7,rU,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,Vxa,fC,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,yw1,SQU,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.mKy,q)
-q=(C.mKy[q]&C.jn.KI(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.KU(h)
-z=new P.q5(P.L7(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},KU:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.mKy,u)
-u=(C.mKy[u]&C.jn.KI(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
+static:{"^":"QqF,q7,tvi,uCX,wm7,ilf,Imi,GpR,Q5W,XrJ,G9,pkL,lM,FsP,j3,dRC,u0I,TGN,Yk,Qxt,Vho,WTp,Hiw,H5,zst,VFG,nJd,SpW,GPf,JA7,iTk,Uo,yw1,SQU,rvM,fbQ",bG:function(a){if(a==="http")return 80
+if(a==="https")return 443
+return 0},hK:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z={}
+z.a=""
+z.b=""
+z.c=null
+z.d=null
+z.e=0
+z.f=-1
+w=a.length
+v=0
+while(!0){if(!(v<w)){y=0
+x=0
+break}if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35){y=0
+x=0
+break}if(u===47){x=v===0?2:1
+y=0
+break}if(u===58){if(v===0)P.iV(a,0,"Invalid empty scheme")
+z.a=P.iv(a,v);++v
+if(v===w){z.f=-1
+x=0}else{if(v>=w)H.vh(P.N(v))
+u=a.charCodeAt(v)
+z.f=u
+if(u===63||u===35)x=0
+else x=u===47?2:1}y=v
+break}++v
+z.f=-1}z.e=v
+if(x===2){t=v+1
+z.e=t
+if(t===w){z.f=-1
+x=0}else{u=C.xB.j(a,t)
+z.f=u
+if(u===47){++z.e
+new P.BH(z,a,-1).$0()
+y=z.e}s=z.f
+x=s===63||s===35||s===-1?0:1}}if(x===1)for(;s=++z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+u=a.charCodeAt(s)
+z.f=u
+if(u===63||u===35)break
+z.f=-1}r=z.c!=null||z.a==="file"
+q=P.qd(a,y,z.e,null,r)
+s=z.f
+if(s===63){p=C.xB.XU(a,"#",z.e+1)
+s=z.e+1
+if(p<0){o=P.LE(a,s,w,null)
+n=null}else{o=P.LE(a,s,p,null)
+n=P.o6(a,p+1,w)}}else{n=s===35?P.o6(a,z.e+1,w):null
+o=null}w=z.a
+s=z.b
+return new P.q5(z.c,z.d,q,w,s,o,n,null,null)},iV:function(a,b,c){var z,y,x,w,v
+z=a.length
+if(b===z)c+=" at end of input."
+else{c+=" at position "+b+".\n"
+if(z>78){y=b-10
+if(y<0)y=0
+x=y+72
+if(x>z){y=z-72
+x=z}w=y!==0?"...":""
+v=x!==z?"...":""}else{y=0
+w=""
+v=""}c=c+w+J.Nj(a,y,z)+v+"\n"+C.xB.U(" ",w.length+b-y)+"^"}throw H.b(P.cD(c))},JF:function(a,b){if(a!=null&&a===P.bG(b))return
+return a},L7:function(a,b,c,d){var z,y
+if(a==null)return
+if(b===c)return""
+if(C.xB.j(a,b)===91){z=c-1
+if(C.xB.j(a,z)!==93)P.iV(a,b,"Missing end `]` to match `[` in host")
+P.Uw(a,b+1,z)
+return C.xB.Nj(a,b,c).toLowerCase()}if(!d)for(z=a.length,y=b;y<c;++y){if(y<0)H.vh(P.N(y))
+if(y>=z)H.vh(P.N(y))
+if(a.charCodeAt(y)===58){P.Uw(a,b,c)
+return"["+a+"]"}}return P.WU(a,b,c)},WU:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+for(z=b,y=z,x=null,w=!0;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+v=a.length
+if(z>=v)H.vh(P.N(z))
+u=a.charCodeAt(z)
+if(u===37){t=P.Yi(a,z,!0)
+v=t==null
+if(v&&w){z+=3
+continue}if(x==null){x=new P.Rn("")
+x.vM=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.vM=x.vM+s
+if(v){t=C.xB.Nj(a,z,z+3)
+r=3}else if(t==="%"){t="%25"
+r=1}else r=3
+x.vM+=t
+z+=r
+y=z
+w=!0}else{if(u<127){q=u>>>4
+if(q>=8)return H.e(C.aa,q)
+q=(C.aa[q]&C.jn.KI(1,u&15))!==0}else q=!1
+if(q){if(w&&65<=u&&90>=u){if(x==null){x=new P.Rn("")
+x.vM=""}if(y<z){v=C.xB.Nj(a,y,z)
+x.toString
+x.vM=x.vM+v
+y=z}w=!1}++z}else{if(u<=93){q=u>>>4
+if(q>=8)return H.e(C.rz,q)
+q=(C.rz[q]&C.jn.KI(1,u&15))!==0}else q=!1
+if(q)P.iV(a,z,"Invalid character")
+else{if((u&64512)===55296&&z+1<c){q=z+1
+if(q<0)H.vh(P.N(q))
+if(q>=v)H.vh(P.N(q))
+p=a.charCodeAt(q)
+if((p&64512)===56320){u=(65536|(u&1023)<<10|p&1023)>>>0
+r=2}else r=1}else r=1
+if(x==null){x=new P.Rn("")
+x.vM=""}s=C.xB.Nj(a,y,z)
+if(!w)s=s.toLowerCase()
+x.toString
+x.vM=x.vM+s
+v=P.mC(u)
+x.vM+=v
+z+=r
+y=z}}}}if(x==null)return J.Nj(a,b,c)
+if(y<c){s=J.Nj(a,y,c)
+x.KF(!w?s.toLowerCase():s)}return x.bu(0)},iv:function(a,b){var z,y,x,w,v,u,t,s
+if(b===0)return""
+a.toString
+z=a.length
+if(0>=z)H.vh(P.N(0))
+y=a.charCodeAt(0)
+x=y>=97
+if(!(x&&y<=122))w=y>=65&&y<=90
+else w=!0
+if(!w)P.iV(a,0,"Scheme not starting with alphabetic character")
+for(w=97<=y,v=122>=y,u=0;u<b;++u){if(u>=z)H.vh(P.N(u))
+t=a.charCodeAt(u)
+if(t<128){s=t>>>4
+if(s>=8)return H.e(C.mKy,s)
+s=(C.mKy[s]&C.jn.KI(1,t&15))!==0}else s=!1
+if(!s)P.iV(a,u,"Illegal scheme character")
+if(w&&v)x=!1}a=J.Nj(a,0,b)
+return!x?a.toLowerCase():a},ua:function(a,b,c){if(a==null)return""
+return P.Xc(a,b,c,C.to)},qd:function(a,b,c,d,e){var z,y
+z=a==null
+if(z&&!0)return""
+z=!z
+if(z);y=z?P.Xc(a,b,c,C.ZJ):C.jN.ez(d,new P.UU()).zV(0,"/")
+if(e&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
+return y},LE:function(a,b,c,d){var z,y,x
 z={}
 y=a==null
-if(y&&!0)return""
+if(y&&!0)return
 y=!y
-if(y);if(y)return P.Xc(a)
+if(y);if(y)return P.Xc(a,b,c,C.o5)
 x=P.p9("")
 z.a=!0
-C.jN.aN(b,new P.Ue(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).kJ(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.QB()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.mx(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.mx(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.mx(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.b)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
+C.jN.aN(d,new P.Ue(z,x))
+return x.vM},o6:function(a,b,c){if(a==null)return
+return P.Xc(a,b,c,C.o5)},wW:function(a){if(57>=a)return 48<=a
+a|=32
+return 97<=a&&102>=a},NJ:function(a){if(57>=a)return a-48
+return(a|32)-87},Yi:function(a,b,c){var z,y,x,w,v,u
+z=b+2
+y=a.length
+if(z>=y)return"%"
+x=b+1
+a.toString
+if(x<0)H.vh(P.N(x))
+if(x>=y)H.vh(P.N(x))
+w=a.charCodeAt(x)
+if(z<0)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(!P.wW(w)||!P.wW(v))return"%"
+u=P.NJ(w)*16+P.NJ(v)
+if(u<127){z=C.jn.GG(u,4)
+if(z>=8)return H.e(C.B2,z)
+z=(C.B2[z]&C.jn.KI(1,u&15))!==0}else z=!1
+if(z)return H.mx(c&&65<=u&&90>=u?(u|32)>>>0:u)
+if(w>=97||v>=97)return J.Nj(a,b,b+3).toUpperCase()
+return},mC:function(a){var z,y,x,w,v,u,t,s
+if(a<128){z=Array(3)
+z.fixed$length=init
+z[0]=37
+y=a>>>4
+if(y>=16)H.vh(P.N(y))
+z[1]="0123456789ABCDEF".charCodeAt(y)
+z[2]="0123456789ABCDEF".charCodeAt(a&15)}else{if(a>2047)if(a>65535){x=240
+w=4}else{x=224
+w=3}else{x=192
+w=2}y=3*w
+z=Array(y)
+z.fixed$length=init
+for(v=0;--w,w>=0;x=128){u=C.jn.ib(a,6*w)&63|x
+if(v>=y)return H.e(z,v)
+z[v]=37
+t=v+1
+s=u>>>4
+if(s>=16)H.vh(P.N(s))
+s="0123456789ABCDEF".charCodeAt(s)
+if(t>=y)return H.e(z,t)
+z[t]=s
+s=v+2
+t="0123456789ABCDEF".charCodeAt(u&15)
+if(s>=y)return H.e(z,s)
+z[s]=t
+v+=3}}return H.LY(z)},Xc:function(a,b,c,d){var z,y,x,w,v,u,t,s,r
+for(z=b,y=z,x=null;z<c;){a.toString
+if(z<0)H.vh(P.N(z))
+w=a.length
+if(z>=w)H.vh(P.N(z))
+v=a.charCodeAt(z)
+if(v<127){u=v>>>4
+if(u>=8)return H.e(d,u)
+u=(d[u]&C.jn.KI(1,v&15))!==0}else u=!1
+if(u)++z
+else{if(v===37){t=P.Yi(a,z,!1)
+if(t==null){z+=3
+continue}if("%"===t){t="%25"
+s=1}else s=3}else{if(v<=93){u=v>>>4
+if(u>=8)return H.e(C.rz,u)
+u=(C.rz[u]&C.jn.KI(1,v&15))!==0}else u=!1
+if(u){P.iV(a,z,"Invalid character")
+t=null
+s=null}else{if((v&64512)===55296){u=z+1
+if(u<c){if(u<0)H.vh(P.N(u))
+if(u>=w)H.vh(P.N(u))
+r=a.charCodeAt(u)
+if((r&64512)===56320){v=(65536|(v&1023)<<10|r&1023)>>>0
+s=2}else s=1}else s=1}else s=1
+t=P.mC(v)}}if(x==null){x=new P.Rn("")
+x.vM=""}w=C.xB.Nj(a,y,z)
+x.toString
+x.vM=x.vM+w
+x.vM+=typeof t==="string"?t:H.d(t)
+if(typeof s!=="number")return H.s(s)
+z+=s
+y=z}}if(x==null)return J.Nj(a,b,c)
+if(y<c)x.KF(J.Nj(a,y,c))
+return x.bu(0)},Ms:function(a,b){return H.n3(J.It(a,"&"),P.Fl(null,null),new P.qz(b))},Dy:function(a){var z,y
 z=new P.JV()
 y=a.split(".")
 if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+return H.VM(new H.A8(y,new P.Nw(z)),[null,null]).br(0)},Uw:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+if(c==null)c=J.q8(a)
 z=new P.x8()
 y=new P.JT(a,z)
 if(J.q8(a)<2)z.$1("address is too short")
 x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
+w=b
+u=b
+t=!1
+while(!0){s=c
 if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
+if(!(u<s))break
 s=a
+s.toString
+if(u<0)H.vh(P.N(u))
 r=J.q8(s)
 if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
+if(u>=r)H.vh(P.N(u))
+if(s.charCodeAt(u)===58){if(u===b){++u
 s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
+s.toString
+if(u<0)H.vh(P.N(u))
+if(u>=J.q8(s))H.vh(P.N(u))
+if(s.charCodeAt(u)!==58)z.$1("invalid start colon.")
+w=u}if(u===w){if(t)z.$1("only one wildcard `::` is allowed")
 J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
+t=!0}else J.bi(x,y.$2(w,u))
+w=u+1}++u}if(J.q8(x)===0)z.$1("too few parts")
+q=J.xC(w,c)
 p=J.xC(J.uY(x),-1)
 if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
+if(!q)try{J.bi(x,y.$2(w,c))}catch(o){H.Ru(o)
+try{v=P.Dy(J.Nj(a,w,c))
 s=J.lf(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
@@ -8784,10 +8878,30 @@
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.oA(x,new P.EY(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
+z.$1("invalid end of IPv6 address.")}}if(t){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
+n=Array(16)
+n.$builtinTypeInfo=[P.KN]
+u=0
+m=0
+while(!0){s=J.q8(x)
+if(typeof s!=="number")return H.s(s)
+if(!(u<s))break
+l=J.UQ(x,u)
+s=J.x(l)
+if(s.n(l,-1)){k=9-J.q8(x)
+for(j=0;j<k;++j){if(m<0||m>=16)return H.e(n,m)
+n[m]=0
+s=m+1
+if(s>=16)return H.e(n,s)
+n[s]=0
+m+=2}}else{r=s.m(l,8)
+if(m<0||m>=16)return H.e(n,m)
+n[m]=r
+r=m+1
+s=s.i(l,255)
+if(r>=16)return H.e(n,r)
+n[r]=s
+m+=2}++u}return n},jW:function(a,b,c,d){var z,y,x,w,v,u,t
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -8827,36 +8941,53 @@
 if(x+3>w)throw H.b(P.u("Truncated URI"))
 u.push(P.oh(a,x+1))
 x+=2}else if(c&&v===43)u.push(32)
-else u.push(v);++x}}t=b.IE
+else u.push(v);++x}}t=b.IW
 return new P.GY(t).WJ(u)}}},
-jY:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
+hP2:{
+"^":"TpZ:135;",
+$1:function(a){a.C(0,128)
+return!1},
 $isEH:true},
-Uo:{
-"^":"TpZ:137;a",
-$1:function(a){a=J.DP(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
+BH:{
+"^":"TpZ:17;a,b,c",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=this.a
+y=z.e
+x=this.b
+w=x.length
+if(y===w){z.f=this.c
+return}z.f=J.Pp(x,y)
+for(v=this.c,u=-1,t=-1;s=z.e,s<w;){if(s<0)H.vh(P.N(s))
+if(s>=w)H.vh(P.N(s))
+r=x.charCodeAt(s)
+z.f=r
+if(r===47||r===63||r===35)break
+if(r===64){t=z.e
+u=-1}else if(r===58)u=z.e
+else if(r===91){q=C.xB.XU(x,"]",z.e+1)
+if(q===-1){z.e=w
+z.f=v
+u=-1
+break}else z.e=q
+u=-1}++z.e
+z.f=v}p=z.e
+if(t>=0){z.b=P.ua(x,y,t)
+y=t+1}if(u>=0){o=u+1
+if(o<z.e)for(n=0;o<z.e;++o){if(o>=w)H.vh(P.N(o))
+m=x.charCodeAt(o)
+if(48>m||57<m)P.iV(x,o,"Invalid port number")
+n=n*10+(m-48)}else n=null
+z.d=P.JF(n,z.a)
+p=u}z.c=P.L7(x,y,p,!0)
+s=z.e
+if(s<w)z.f=C.xB.j(x,s)},
 $isEH:true},
-QU:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.JH,z)
-z=(C.JH[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-bm:{
-"^":"TpZ:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
+UU:{
+"^":"TpZ:12;",
+$1:function(a){return P.jW(C.jr,a,C.xM,!1)},
 $isEH:true},
 Ue:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -8866,62 +8997,12 @@
 z.KF("=")
 z.KF(P.jW(C.B2,b,C.xM,!0))},
 $isEH:true},
-Al:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"TpZ:136;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-QB:{
-"^":"TpZ:136;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.KI(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"TpZ:137;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"TpZ:137;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"TpZ:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
 Wf:{
-"^":"TpZ:138;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
+"^":"TpZ:136;",
+$2:function(a,b){return b*31+J.v1(a)&1073741823},
 $isEH:true},
 qz:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y,x,w
 z=J.U6(b)
 y=z.kJ(b,"=")
@@ -8931,38 +9012,32 @@
 J.kW(a,P.pE(x,z,!0),P.pE(w,z,!0))}return a},
 $isEH:true},
 JV:{
-"^":"TpZ:43;",
+"^":"TpZ:44;",
 $1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
 $isEH:true},
 Nw:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,139,"call"],
+return z},"$1",null,2,0,null,137,"call"],
 $isEH:true},
 x8:{
-"^":"TpZ:43;",
+"^":"TpZ:44;",
 $1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
 $isEH:true},
 JT:{
-"^":"TpZ:97;a,b",
+"^":"TpZ:96;a,b",
 $2:function(a,b){var z,y
 if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
+z=H.BU(J.Nj(this.a,a,b),16,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
 return z},
 $isEH:true},
-EY:{
-"^":"TpZ:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
 rI:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.mx(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
@@ -9018,26 +9093,26 @@
 ju:function(a){return a},
 Pd:function(a){if(!!J.x(a).$isYN)return a
 return P.o7(a,!0)},
-Gi:function(a,b){return new W.zZ(a,b)},
-z9:[function(a){return J.N1(a)},"$1","b4",2,0,13,54],
-Hx:[function(a){return J.qq(a)},"$1","HM",2,0,13,54],
-Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,55,54,56,57,58],
+v8:function(a,b){return new W.zZ(a,b)},
+w6:[function(a){return J.N1(a)},"$1","l9",2,0,12,56],
+Hx:[function(a){return J.qq(a)},"$1","Z6",2,0,12,56],
+Hw:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","SN",8,0,57,56,58,59,60],
 Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(P.u(d))
 y=z.prototype
 x=J.KE(d,"created")
 if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.m0(W.r3("article",null))
+J.aN(W.r3("article",null))
 w=z.$nativeSuperclassTag
 if(w==null)throw H.b(P.u(d))
 v=e==null
 if(v){if(!J.xC(w,"HTMLElement"))throw H.b(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(b.createElement(e) instanceof window[w]))throw H.b(P.f("extendsTag does not match base native class"))
 u=a[w]
 t={}
-t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.b4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
+t.createdCallback={value:function(f){return function(){return f(this)}}(H.tR(W.v8(x,y),1))}
+t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.l9(),1))}
+t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.Z6(),1))}
 t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.SN(),4))}
 s=Object.create(u.prototype,t)
 r=H.Va(y)
@@ -9052,7 +9127,7 @@
 return $.X3.cl(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|TR0|xc|LPc|hV|Xfs|uL|pv|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;re|TR0|xc|LPc|hV|Xfs|uL|tu|G6|Vfx|xI|eW|Dsd|eo|tuj|ak|VY|Vct|Be|SaM|JI|D13|ZP|WZq|nJ|KAf|Eg|i7|pva|Gk|cda|J3|waa|MJ|T53|DK|V9|BS|V10|Vb|V11|Ly|pR|V12|hx|V13|L4|Mb|V14|mO|DE|V15|U1|V16|H8|WS|qh|V17|oF|V18|Q6|uE|V19|Zn|V20|n5|V21|Ma|wN|V22|ds|V23|qM|ZzR|av|V24|uz|V25|kK|oa|V26|St|V27|IW|V28|Qh|V29|Oz|V30|Z4|V31|qk|V32|vj|LU|V33|CX|V34|md|V35|Bm|V36|Ya|V37|Ww|ye|V38|G1|V39|fl|V40|UK|V41|wM|V42|NK|V43|Zx|V44|F1|V45|ov|oEY|kn|V46|fI|V47|zM|V48|Rk|V49|Ti|ImK|CY|V50|nm|V51|uw|V52|Pa|V53|D2|I5|V54|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
@@ -9063,11 +9138,11 @@
 "%":"EntryArray"},
 Ps:{
 "^":"Bo;N:target%,t5:type%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"HTMLAnchorElement"},
 fY:{
 "^":"Bo;N:target%,mH:href%,aB:protocol=",
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"HTMLAreaElement"},
 rZg:{
 "^":"Bo;mH:href%,N:target%",
@@ -9143,7 +9218,7 @@
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rz:{
+rv:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 BK:{
@@ -9152,7 +9227,7 @@
 if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
 if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
 return z},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 $isBK:true,
 "%":"DOMException"},
 h4:{
@@ -9167,7 +9242,7 @@
 wN:function(a,b,c,d){},
 gqn:function(a){return a.localName},
 gKD:function(a){return a.namespaceURI},
-bu:[function(a){return a.localName},"$0","gAY",0,0,69],
+bu:[function(a){return a.localName},"$0","gAY",0,0,71],
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
@@ -9183,16 +9258,16 @@
 GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
 Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
-gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
+gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
 $ish4:true,
 $isPZ:true,
 "%":";Element"},
-Kk:{
+fC:{
 "^":"Bo;fg:height%,oc:name%,t5:type%,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
@@ -9204,7 +9279,7 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event|InputEvent"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.kd(a)},
@@ -9213,15 +9288,15 @@
 Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
 $isPZ:true,
 "%":";EventTarget"},
-asg:{
+Ao:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
 "^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
-nS:{
-"^":"rz;tT:code=",
+QU:{
+"^":"rv;tT:code=",
 "%":"FileError"},
 jH:{
 "^":"Bo;B:length=,oc:name%,N:target%",
@@ -9255,14 +9330,14 @@
 smk:function(a,b){a.title=b},
 "%":"HTMLDocument"},
 fJ:{
-"^":"waV;il:responseText=,pf:status=",
+"^":"rk;il:responseText=,pf:status=",
 gbA:function(a){return W.Pd(a.response)},
 R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
 wR:function(a,b){return a.send(b)},
 $isfJ:true,
 "%":"XMLHttpRequest"},
-waV:{
+rk:{
 "^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
 tbE:{
@@ -9284,10 +9359,10 @@
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
+HLy:{
 "^":"w6O;YK:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
 "%":"KeyboardEvent"},
-ttH:{
+In:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 Gx:{
@@ -9305,15 +9380,15 @@
 u8r:{
 "^":"Gv;mH:href=,aB:protocol=",
 RE:function(a){return a.reload()},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 "%":"Location"},
 jJ:{
 "^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-eL:{
+TF:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+yy:[function(a){return a.pause()},"$0","gX0",0,0,17],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
@@ -9342,14 +9417,14 @@
 QbE:{
 "^":"Bo;P:value%",
 "%":"HTMLMeterElement"},
-PG:{
+PGY:{
 "^":"ea;",
-$isPG:true,
+$isPGY:true,
 "%":"MIDIConnectionEvent"},
 F3S:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-yt:{
+bnE:{
 "^":"Imr;",
 EZ:function(a,b,c){return a.send(b,c)},
 wR:function(a,b){return a.send(b)},
@@ -9390,7 +9465,7 @@
 Vv:{
 "^":"Gv;N:target=,t5:type=",
 "%":"MutationRecord"},
-qT:{
+FO8:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
@@ -9409,14 +9484,14 @@
 pj:function(a){var z
 for(;z=a.firstChild,z!=null;)a.removeChild(z)},
 bu:[function(a){var z=a.nodeValue
-return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,69],
+return z==null?J.Gv.prototype.bu.call(this,a):z},"$0","gAY",0,0,71],
 mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
 mK:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-BH3:{
+yk:{
 "^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -9478,9 +9553,9 @@
 j24:{
 "^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
-zk:{
+lpR:{
 "^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$iszk:true,
+$islpR:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"hsw;",
@@ -9493,7 +9568,7 @@
 Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-y0:{
+r5:{
 "^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
 vKL:{
@@ -9528,7 +9603,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]},
 "%":"Storage"},
-KL:{
+Tp:{
 "^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
 fqq:{
@@ -9555,9 +9630,9 @@
 "^":"Bo;jb:content=",
 $isOH:true,
 "%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
+bm:{
 "^":"nx;",
-$ismw:true,
+$isbm:true,
 "%":"CDATASection|Text"},
 HR:{
 "^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
@@ -9576,7 +9651,7 @@
 "^":"ea;",
 "%":"FocusEvent|SVGZoomEvent;UIEvent"},
 SW:{
-"^":"eL;fg:height%,R:width}",
+"^":"TF;fg:height%,R:width}",
 "%":"HTMLVideoElement"},
 EKW:{
 "^":"PZ;aB:protocol=,O3:url=",
@@ -9597,18 +9672,18 @@
 kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
 return},
 X6:function(a,b,c){return this.kr(a,b,c,null)},
-bu:[function(a){return a.toString()},"$0","gAY",0,0,69],
+bu:[function(a){return a.toString()},"$0","gAY",0,0,71],
 gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
 gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isK5:true,
 $isPZ:true,
 "%":"DOMWindow|Window"},
-Bn:{
+UM:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-o5:{
+YC2:{
 "^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
-bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,69],
+bu:[function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x
 if(b==null)return!1
 z=J.x(b)
@@ -9705,7 +9780,7 @@
 z=this.MW
 if(b){z=J.Mx(z)
 y=z.ad(z,new W.tN(a))}else{z=J.Mx(z)
-y=z.ad(z,a)}for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
+y=z.ad(z,a)}for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=z.OI;z.G();)J.Mp(x.gl())},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Rz:function(a,b){var z
@@ -9721,7 +9796,7 @@
 else{if(b>=y)return H.e(z,b)
 x.insertBefore(c,z[b])}},
 Yj:function(a,b,c){throw H.b(P.SY(null))},
-V1:function(a){J.r4(this.MW)},
+V1:function(a){J.qv(this.MW)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)this.MW.removeChild(z)
 return z},
@@ -9733,7 +9808,7 @@
 $asWO:function(){return[W.h4]},
 $asQV:function(){return[W.h4]}},
 tN:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a.$1(a)!==!0},
 $isEH:true},
 TS:{
@@ -9750,7 +9825,7 @@
 gDD:function(a){return W.or(this.Sc)},
 gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
 gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
-Un:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
+S8:function(a,b){var z=C.t5.ad(this.Sn,new W.pN())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
 $isWO:true,
 $asWO:null,
@@ -9758,10 +9833,10 @@
 $isQV:true,
 $asQV:null,
 static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.Un(a,b)
+z.S8(a,b)
 return z}}},
 pN:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 QI:{
@@ -9774,8 +9849,8 @@
 t:function(a,b){var z,y
 z=$.nn()
 y=J.rY(b)
-if(z.gvc(z).Fb.x4(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.JF(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.JF(this.YO,b,!1),[null])},
+if(z.gvc(z).tg(0,y.hc(b)))if(P.F7()===!0)return H.VM(new W.mw(this.YO,z.t(0,y.hc(b)),!1),[null])
+return H.VM(new W.mw(this.YO,b,!1),[null])},
 static:{"^":"fDX"}},
 RAp:{
 "^":"Gv+lD;",
@@ -9792,15 +9867,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 Kx:{
-"^":"TpZ:13;",
-$1:[function(a){return J.lN(a)},"$1",null,2,0,null,140,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 bU2:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
 bU:{
-"^":"TpZ:13;b,c",
+"^":"TpZ:12;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -9809,10 +9884,10 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
+y.OH(z)}else x.pm(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 QR:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){if(b!=null)this.a[a]=b},
 $isEH:true},
 wi:{
@@ -9831,7 +9906,7 @@
 if(b===x)z.appendChild(c)
 else{if(b>=x)return H.e(y,b)
 z.insertBefore(c,y[b])}},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
@@ -9849,7 +9924,7 @@
 for(;y!=null;y=x){x=y.nextSibling
 if(J.xC(a.$1(y),b))z.removeChild(y)}},
 Nk:function(a,b){this.Jl(b,!0)},
-V1:function(a){J.r4(this.NL)},
+V1:function(a){J.qv(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
@@ -9885,15 +9960,15 @@
 $isQV:true,
 $asQV:function(){return[W.KV]}},
 AA:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.setItem(a,b)},
 $isEH:true},
 wQ:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.push(a)},
 $isEH:true},
 rs:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.push(b)},
 $isEH:true},
 yoo:{
@@ -9926,7 +10001,7 @@
 $asQV:function(){return[W.vKL]}},
 cf:{
 "^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
+FV:function(a,b){J.Me(b,new W.JO(this))},
 V1:function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
@@ -9948,8 +10023,8 @@
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"TpZ:80;a",
+JO:{
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -9965,38 +10040,38 @@
 gB:function(a){return this.gvc(this).length},
 FJ:function(a){return a.namespaceURI==null}},
 hZ:{
-"^":"As3;n8,Kd",
+"^":"As3;N9,Kd",
 lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.qm(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
+for(y=this.N9,y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.Jt(a))},
 Rz:function(a,b){return this.Q6(new W.ma(b))},
 Q6:function(a){return this.Kd.es(0,!1,new W.hD(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
+yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.N9,!0,null),new W.Xw()),[null,null])},
 static:{or:function(a){var z=new W.hZ(a,null)
 z.yJ(a)
 return z}}},
 Xw:{
-"^":"TpZ:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 qm:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 Jt:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 ma:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.V1(a,this.a)},
 $isEH:true},
 hD:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){return this.a.$1(b)===!0||a===!0},
 $isEH:true},
 I4:{
@@ -10019,24 +10094,24 @@
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
-JF:{
+mw:{
 "^":"RO;DK,Ph,Sg",
 WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"wS",0),null])},
+return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"wS",0),null])},
 $iswS:true},
 ie:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.So(J.l2(a),this.a)},
 $isEH:true},
-rg:{
-"^":"TpZ:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+tS:{
+"^":"TpZ:12;b",
+$1:[function(a){J.ogJ(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Uc:{
 "^":"wS;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.Hb(b),this),[H.ip(this,"wS",0)])
-return H.VM(new P.c9(new W.iND(b),z),[H.ip(z,"wS",0),null])},
+WO:function(a,b){var z=H.VM(new P.nO(new W.Al(b),this),[H.ip(this,"wS",0)])
+return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"wS",0),null])},
 KR:function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.wS,null],[P.yX,null])),[null])
 z.xd(null)
@@ -10048,14 +10123,14 @@
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
 $iswS:true},
-Hb:{
-"^":"TpZ:13;a",
+Al:{
+"^":"TpZ:12;a",
 $1:function(a){return J.So(J.l2(a),this.a)},
 $isEH:true},
-iND:{
-"^":"TpZ:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
+Hb:{
+"^":"TpZ:12;b",
+$1:[function(a){J.ogJ(a,this.b)
+return a},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Ov:{
 "^":"yX;VP,DK,Ph,u7,Sg",
@@ -10066,10 +10141,10 @@
 return},
 Fv:[function(a,b){if(this.DK==null)return;++this.VP
 this.Ns()
-if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,126,23,127],
+if(b!=null)b.YM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,125,22,126],
 gUF:function(){return this.VP>0},
 QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
+this.Zz()},"$0","gDQ",0,0,17],
 Zz:function(){var z=this.u7
 if(z!=null&&this.VP<=0)J.V5(this.DK,this.Ph,z,this.Sg)},
 Ns:function(){var z=this.u7
@@ -10080,16 +10155,16 @@
 z=this.uZ
 if(z.x4(0,b))return
 y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rW(this,b),this.pY.gGj()))},
+z.u(0,b,b.zC(y.gL0(y),new W.rW(this,b),this.pY.gGj()))},
 Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
 xO:[function(a){var z,y
 for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.pY.xO(0)},"$0","gQF",0,0,18],
+this.pY.xO(0)},"$0","gQF",0,0,17],
 xd:function(a){this.pY=P.bK(this.gQF(this),null,!0,a)}},
 rW:{
-"^":"TpZ:72;a,b",
+"^":"TpZ:74;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -10100,7 +10175,7 @@
 GT:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
 Jd:function(a){return this.GT(a,null)},
 xe:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
+oF:function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},
 Yj:function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},
 Rz:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
 Nk:function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},
@@ -10152,11 +10227,11 @@
 return!1},
 gl:function(){return this.QZ}},
 zZ:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
+return this.a(a)},"$1",null,2,0,null,56,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
@@ -10232,7 +10307,7 @@
 bMB:{
 "^":"d5G;fg:height=,yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"d5G;x=,y=",
 "%":"SVGFESpotLightElement"},
 HX:{
@@ -10244,7 +10319,7 @@
 OE5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
+l6:{
 "^":"tpr;fg:height=,x=,y=",
 "%":"SVGForeignObjectElement"},
 en:{
@@ -10262,7 +10337,7 @@
 Gr5:{
 "^":"d5G;fg:height=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-fQ:{
+MU:{
 "^":"en;fg:height=,x=,y=",
 "%":"SVGRectElement"},
 qIR:{
@@ -10277,11 +10352,11 @@
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
 gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gEr:function(a){return H.VM(new W.JF(a,C.U3.Ph,!1),[null])},
-gfs:function(a){return H.VM(new W.JF(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.JF(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.JF(a,C.Whw.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.JF(a,C.Kq.Ph,!1),[null])},
+gEr:function(a){return H.VM(new W.mw(a,C.U3.Ph,!1),[null])},
+gfs:function(a){return H.VM(new W.mw(a,C.T1.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.mw(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.mw(a,C.Whw.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.mw(a,C.Kq.Ph,!1),[null])},
 $isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"SH<"}},
@@ -10319,26 +10394,16 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-at:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
 hq:{
 "^":"a;",
 $ishq:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{N3:function(){return new H.kuS((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
 xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.eC(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,40,61,26,62],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -10352,7 +10417,7 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.iW()))}},"$1","En",2,0,12,63],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -10363,7 +10428,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.iW())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,52,63],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
 else return P.iQ(a,$.Iq(),new P.QS())},
@@ -10383,7 +10448,7 @@
 bu:[function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,69],
+return P.a.prototype.bu.call(this,this)}},"$0","gAY",0,0,71],
 V7:function(a,b){var z,y
 z=this.eh
 y=b==null?null:P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)
@@ -10400,7 +10465,7 @@
 return P.ND(new x())},XY:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(0,a))return z.t(0,a)
@@ -10411,7 +10476,7 @@
 x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,61,"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,63,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -10465,25 +10530,25 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return H.VM(new P.GD(a),[null])},
 $isEH:true},
 QS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -10516,26 +10581,26 @@
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 kh:{
-"^":"a;Nd,ii",
-hv:function(){var z,y,x,w,v,u
-z=this.Nd
+"^":"a;Pd,Ak",
+X9:function(){var z,y,x,w,v,u
+z=this.Pd
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.ii
+u=v+x+this.Ak
 z=(u&4294967295)>>>0
-this.Nd=z
-this.ii=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.Pd=z
+this.Ak=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
 j1:function(a){var z,y,x
 if(a<=0||a>4294967296)throw H.b(P.KP("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.hv()
-return(this.Nd&z)>>>0}do{this.hv()
-y=this.Nd
+if((a&z)===0){this.X9()
+return(this.Pd&z)>>>0}do{this.X9()
+y=this.Pd
 x=y%a}while(y-x+a>=4294967296)
 return x},
-mf:function(a){var z,y,x,w,v,u,t,s
+qR:function(a){var z,y,x,w,v,u,t,s
 z=J.u6(a,0)?-1:0
 do{y=J.Wx(a)
 x=y.i(a,4294967295)
@@ -10557,24 +10622,24 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.Nd*1037
+v=this.Pd*1037
 t=(v&4294967295)>>>0
-this.Nd=t
-s=(this.ii*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.ii=s
-this.Nd=(t^u)>>>0
-this.ii=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.ii===0&&this.Nd===0)this.Nd=23063
-this.hv()
-this.hv()
-this.hv()
-this.hv()},
+this.Pd=t
+s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Ak=s
+this.Pd=(t^u)>>>0
+this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.Ak===0&&this.Pd===0)this.Pd=23063
+this.X9()
+this.X9()
+this.X9()
+this.X9()},
 static:{"^":"tgM,PZi,JYU",Nh:function(a){var z=new P.kh(0,0)
-z.mf(a)
+z.qR(a)
 return z}}},
 hL:{
 "^":"a;x>,y>",
-bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z,y
 if(b==null)return!1
 if(!J.x(b).$ishL)return!1
@@ -10629,7 +10694,7 @@
 "^":"a;",
 gT8:function(a){return this.gBb(this)+this.R},
 gQG:function(a){return this.gG6(this)+this.fg},
-bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,69],
+bu:[function(a){return"Rectangle ("+this.gBb(this)+", "+this.G6+") "+this.R+" x "+this.fg},"$0","gAY",0,0,71],
 n:function(a,b){var z,y
 if(b==null)return!1
 z=J.x(b)
@@ -10682,7 +10747,7 @@
 Rz:function(a,b){return this.Rp.Rz(0,b)},
 gUQ:function(a){var z=this.Rp
 return z.gUQ(z)},
-bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this.Rp)},"$0","gAY",0,0,71],
 $isZ0:true,
 $asZ0:null}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
@@ -10705,7 +10770,7 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $iseH:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;b0B|Ui|GVy|Dg|ObS|Ipv|Pg"},
 dfL:{
 "^":"eH;",
 gbx:function(a){return C.dP},
@@ -10714,12 +10779,6 @@
 zU7:{
 "^":"Dg;",
 gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10727,15 +10786,9 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
 gbx:function(a){return C.G0},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10743,15 +10796,12 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float64Array"},
-PS:{
+xja:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10765,9 +10815,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10781,9 +10828,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10797,9 +10841,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10813,9 +10854,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10830,9 +10868,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10847,9 +10882,6 @@
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10857,7 +10889,7 @@
 $asQV:function(){return[P.KN]},
 $isAS:true,
 "%":";Uint8Array"},
-we:{
+b0B:{
 "^":"eH;",
 gB:function(a){return a.length},
 oZ:function(a,b,c,d,e){var z,y,x
@@ -10874,6 +10906,12 @@
 $isXj:true},
 Dg:{
 "^":"GVy;",
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+return a[b]},
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -10884,7 +10922,7 @@
 $isQV:true,
 $asQV:function(){return[P.CP]}},
 Ui:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
 $isyN:true,
@@ -10894,6 +10932,9 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"Ipv;",
+u:function(a,b,c){var z=a.length
+if(b>>>0!==b||b>=z)this.J2(a,b,z)
+a[b]=c},
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
 return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
@@ -10904,7 +10945,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 ObS:{
-"^":"we+lD;",
+"^":"b0B+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
 $isyN:true,
@@ -10955,7 +10996,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,112,1,103,104],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gVr",6,0,111,2,102,103],
 Z1:[function(a,b,c,d){var z,y,x
 J.Kr(b)
 z=a.a3
@@ -10964,9 +11005,9 @@
 x=R.tB(y)
 J.kW(x,"expr",z)
 J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,112,1,103,104],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,111,2,102,103],
 o5:[function(a,b){var z=J.bN(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,141,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,139,2],
 static:{Rp:function(a){var z,y,x
 z=R.tB([])
 y=P.L5(null,null,null,P.qU,W.I0)
@@ -10986,8 +11027,8 @@
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"TpZ:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -11008,7 +11049,7 @@
 if(z===!0)return
 if(a.bY!=null){a.fe=this.ct(a,C.S4,z,!0)
 a.oy=this.ct(a,C.UY,a.oy,null)
-this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,83,46,47,84],
+this.LY(a,a.jv).ml(new R.Kz(a)).YM(new R.uv(a))}},"$3","gDf",6,0,82,49,50,83],
 static:{Ola:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11030,12 +11071,12 @@
 "^":"xc+Pi;",
 $isd3:true},
 Kz:{
-"^":"TpZ:143;a",
+"^":"TpZ:141;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,93,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 uv:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:[function(){var z=this.b
 z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
 $isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
@@ -11060,7 +11101,7 @@
 "^":"pva;KV,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.KV).YM(b)},"$1","gvC",2,0,19,98],
 static:{cYO:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11081,7 +11122,7 @@
 "^":"cda;DC,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.DC).YM(b)},"$1","gvC",2,0,19,98],
 static:{TsF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11143,7 +11184,8 @@
 "^":"V9;P6,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.P6).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.P6).YM(b)},"$1","gDX",2,0,19,98],
 static:{nz:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11153,8 +11195,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
+C.p0.ZL(a)
+C.p0.XI(a)
 return a}}},
 V9:{
 "^":"uL+Pi;",
@@ -11162,7 +11204,7 @@
 "^":"",
 Hz:{
 "^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,144],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,142],
 gvH:function(a){return C.CD.cU(this.mS,4)},
 static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
@@ -11250,9 +11292,9 @@
 w=z.mS
 v=a.UL.t(0,a.Aj.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
 z=J.xC(v,"")?"-":H.d(v)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,141,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,139,143],
 X7:[function(a,b){var z=J.u1(this.WE(a,J.op(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,141,2],
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,139,143],
 My:function(a){var z,y,x,w,v
 z=a.oj
 if(z==null||a.hi==null)return
@@ -11272,8 +11314,8 @@
 a.An=w
 J.No(a.hi,J.DO(w))
 J.OE(a.hi,J.OB(a.An))
-this.Fc(a,0)},
-Fc:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+this.ps(a,0)},
+ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 z=J.UQ(a.oj,"pages")
 y=J.U6(z)
 x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
@@ -11323,8 +11365,8 @@
 P.Iw(new O.R5(a,b),null)},
 SK:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,20,99],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.z4()).YM(b)},"$1","gvC",2,0,19,98],
+YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,19,59],
 static:{"^":"nK,Os,SoT,WBO",pn:function(a){var z,y,x,w,v
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -11347,29 +11389,29 @@
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"TpZ:72;a,b",
-$0:function(){J.MU(this.a,this.b+1)},
+"^":"TpZ:74;a,b",
+$0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,145,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 z4:{
-"^":"TpZ:80;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,146,"call"],
+"^":"TpZ:79;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,2,145,"call"],
 $isEH:true},
 oc:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 UC:{
-"^":"lg;oH,vp,zz,pT,jV,AP,fn",
+"^":"Vz;oH,vp,zz,pT,jV,AP,fn",
 eE:function(a,b){var z
 if(b===0){z=this.vp
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.lg.prototype.eE.call(this,a,b)}},
+return J.O6(J.UQ(J.U8(z[a]),b))}return G.Vz.prototype.eE.call(this,a,b)}},
 Ly:{
 "^":"V11;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gYt:function(a){return a.MF},
@@ -11464,17 +11506,17 @@
 if(z==null?y!=null:z!==y){x.sxp(y)
 a.nc.sT3(!0)}else x.sT3(!x.gT3())
 J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,102,1,103,104],
+this.Jh(a)}},"$3","gQq",6,0,101,2,102,103],
 SK:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,20,99],
+J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).YM(b)},"$1","gvC",2,0,19,98],
 zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,20,99],
+J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).YM(b)},"$1","gyW",2,0,19,98],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,20,99],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,147,148],
+J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).YM(b)},"$1","gNb",2,0,19,98],
+Ed:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,146,147],
 n1:[function(a,b){var z,y,x,w,v
 z=a.Ol
 if(z==null)return
@@ -11534,23 +11576,23 @@
 a.GM.W2(a.Oc)
 this.ct(a,C.Aq,0,1)
 this.ct(a,C.ST,0,1)
-this.ct(a,C.DS,0,1)},"$1","gd0",2,0,20,57],
+this.ct(a,C.DS,0,1)},"$1","gd0",2,0,19,59],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
 x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,149,150],
+return C.CD.Sy(J.X9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,148,149],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,149,150],
+return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,148,149],
 F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=J.RE(z)
-return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,149,150],
+return J.wF((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,148,149],
 Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
 a.GQ=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
@@ -11560,7 +11602,7 @@
 z.V7("addColumn",["string","Type"])
 a.Oc.KJ.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.p0()),new G.Kt("Accumulated Instances",G.xK()),new G.Kt("Current Size",G.p0()),new G.Kt("Current Instances",G.xK()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.p0()),new G.Kt("Accumulator Instances",G.xK()),new G.Kt("Current Size",G.p0()),new G.Kt("Current Instances",G.xK())],z,[],0,!0,null,null))
+z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.ji()),new G.Kt("",G.ji()),new G.Kt("Accumulated Size (New)",G.Gt()),new G.Kt("Accumulated Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH()),new G.Kt("",G.ji()),new G.Kt("Accumulator Size (Old)",G.Gt()),new G.Kt("Accumulator Instances",G.HH()),new G.Kt("Current Size",G.Gt()),new G.Kt("Current Instances",G.HH())],z,[],0,!0,null,null))
 a.nc=z
 z.sxp(2)},
 static:{Ut:function(a){var z,y
@@ -11602,7 +11644,7 @@
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 OW:{
-"^":"TpZ:48;b,c",
+"^":"TpZ:51;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -11612,23 +11654,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"TpZ:151;d",
+"^":"TpZ:150;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"TpZ:152;e",
+"^":"TpZ:151;e",
 $2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 uS:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){},
 $isEH:true},
 Tm:{
-"^":"TpZ:13;f,UI,bK",
+"^":"TpZ:12;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -11637,7 +11679,7 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
 if(!!y.$isO4)return a
 if(!!y.$isSg)return a
@@ -11662,11 +11704,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 ib:{
-"^":"TpZ:80;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,78,21,"call"],
+"^":"TpZ:79;a,Gq",
+$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true},
 CA:{
-"^":"TpZ:48;a,b",
+"^":"TpZ:51;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -11676,19 +11718,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"TpZ:151;c",
+"^":"TpZ:150;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"TpZ:152;d",
+"^":"TpZ:151;d",
 $2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
 z[a]=b},
 $isEH:true},
 xL:{
-"^":"TpZ:13;e,f,UI,bK",
+"^":"TpZ:12;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -11721,7 +11763,7 @@
 $isSg:true},
 As3:{
 "^":"a;",
-bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,69],
+bu:[function(a){return this.lF().zV(0," ")},"$0","gAY",0,0,71],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
@@ -11729,11 +11771,11 @@
 aN:function(a,b){this.lF().aN(0,b)},
 zV:function(a,b){return this.lF().zV(0,b)},
 ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,153,31],
+return H.VM(new H.xy(z,b),[H.Oq(z,0),null])},"$1","gIr",2,0,152,30],
 ad:function(a,b){var z=this.lF()
 return H.VM(new H.U5(z,b),[H.Oq(z,0)])},
 lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,154,31],
+return H.VM(new H.oA(z,b),[H.Oq(z,0),null])},"$1","git",2,0,153,30],
 ou:function(a,b){return this.lF().ou(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -11771,20 +11813,20 @@
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 GE:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 rl:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 PR:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.rA(a,this.a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 uQ:{
-"^":"TpZ:13;",
-$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return J.Z8(a)},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 D7:{
 "^":"ark;Yn,iz",
@@ -11807,12 +11849,12 @@
 YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},
 zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
+V1:function(a){J.qv(this.iz.NL)},
 mv:function(a){var z=this.grZ(this)
 if(z!=null)J.Mp(z)
 return z},
 xe:function(a,b,c){this.iz.xe(0,b,c)},
-UG:function(a,b,c){var z,y
+oF:function(a,b,c){var z,y
 z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
@@ -11831,11 +11873,11 @@
 gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)])}},
 hT:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Mp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -11848,14 +11890,14 @@
 else if(J.xC(J.eS(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.eS(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,72],
+Gn:[function(a){return this.gus(a)},"$0","gyX",0,0,74],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.cI(z).ml(new B.Ng(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,156,157,99],
+c.$0()}},"$2","gus",4,0,155,156,98],
 static:{lu:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11870,14 +11912,14 @@
 C.hM.XI(a)
 return a}}},
 Ng:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.sTX(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.kY,z.tY,a)
-y.ct(z,C.kY,0,1)},"$1",null,2,0,null,142,"call"],
+y.ct(z,C.kY,0,1)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
@@ -11888,10 +11930,10 @@
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
 gCF:function(a){return a.Rr},
 sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,108,110],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,108,33],
-SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,20,99],
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,107,109],
+Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.eS(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,107,32],
+SK:[function(a,b){J.cI(a.Xh).YM(b)},"$1","gvC",2,0,19,98],
 static:{CoW:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11909,23 +11951,23 @@
 "^":"uL+Pi;",
 $isd3:true},
 wU:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z,y
 z=this.a
 y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,93,"call"],
+z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 cL:{
-"^":"TpZ:143;a",
+"^":"TpZ:141;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,93,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,92,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
 "^":"V13;PM,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.PM).YM(b)},"$1","gvC",2,0,19,98],
 static:{p4t:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11960,7 +12002,7 @@
 "^":"V14;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{Ch:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -11995,8 +12037,8 @@
 "^":"V15;yR,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,20,99],
-Lg:[function(a){J.cI(a.yR).YM(new E.Kv(a))},"$0","gW6",0,0,18],
+SK:[function(a,b){J.cI(a.yR).YM(b)},"$1","gvC",2,0,19,98],
+Lg:[function(a){J.cI(a.yR).YM(new E.XB(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
@@ -12004,7 +12046,7 @@
 z=a.mZ
 if(z!=null){z.ed()
 a.mZ=null}},
-static:{TiU:function(a){var z,y
+static:{hm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12019,8 +12061,8 @@
 V15:{
 "^":"uL+Pi;",
 $isd3:true},
-Kv:{
-"^":"TpZ:72;a",
+XB:{
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12028,8 +12070,8 @@
 "^":"V16;vd,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gPB:function(a){return a.vd},
 sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,20,99],
-Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,18],
+SK:[function(a,b){J.cI(a.vd).YM(b)},"$1","gvC",2,0,19,98],
+Lg:[function(a){J.cI(a.vd).YM(new E.uN(a))},"$0","gW6",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
 dQ:function(a){var z
@@ -12053,7 +12095,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 uN:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12074,7 +12116,7 @@
 return a}}},
 qh:{
 "^":"xI;tY,Pe,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
-static:{Sc:function(a){var z,y
+static:{va:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12091,7 +12133,7 @@
 "^":"V17;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{UE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12111,7 +12153,7 @@
 "^":"V18;uv,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.uv).YM(b)},"$1","gvC",2,0,19,98],
 static:{chF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12121,8 +12163,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
+C.rU.ZL(a)
+C.rU.XI(a)
 return a}}},
 V18:{
 "^":"uL+Pi;",
@@ -12146,7 +12188,7 @@
 "^":"V19;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{kf:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12166,7 +12208,7 @@
 "^":"V20;h1,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.h1).YM(b)},"$1","gvC",2,0,19,98],
 static:{iOo:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12186,8 +12228,8 @@
 "^":"V21;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
-static:{Ii1:function(a){var z,y
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
+static:{Ii:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12214,15 +12256,15 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
 "^":"V22;wT,mZ,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,20,99],
-nK:[function(a){J.cI(a.wT).YM(new E.mj(a))},"$0","guT",0,0,18],
+SK:[function(a,b){J.cI(a.wT).YM(b)},"$1","gvC",2,0,19,98],
+nK:[function(a){J.cI(a.wT).YM(new E.As(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
@@ -12245,8 +12287,8 @@
 V22:{
 "^":"uL+Pi;",
 $isd3:true},
-mj:{
-"^":"TpZ:72;a",
+As:{
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -12254,7 +12296,7 @@
 "^":"V23;Cr,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.Cr).YM(b)},"$1","gvC",2,0,19,98],
 static:{tX:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12285,8 +12327,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.OkI.ZL(a)
-C.OkI.XI(a)
+C.Wa.ZL(a)
+C.Wa.XI(a)
 return a}}},
 ZzR:{
 "^":"xI+Pi;",
@@ -12296,8 +12338,8 @@
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,20,99],
-nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,18],
+SK:[function(a,b){J.cI(a.RX).YM(b)},"$1","gvC",2,0,19,98],
+nK:[function(a){J.cI(a.RX).YM(new E.Cc(a))},"$0","guT",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
 dQ:function(a){var z
@@ -12321,7 +12363,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){var z=this.a
 if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
@@ -12406,15 +12448,15 @@
 a.fE=this.ct(a,C.aH,a.fE,v)
 J.aT(a.oi).N3(a.oi)
 J.kW(a.oi,"threshold",z)
-this.Zb(a)},"$1","gd0",2,0,20,57],
+this.Zb(a)},"$1","gd0",2,0,19,59],
 Es:function(a){var z
 Z.uL.prototype.Es.call(this,a)
 z=R.tB([])
-a.Hm=new G.iY(z,null,null)
+a.Hm=new G.xK(z,null,null)
 this.Zb(a)},
-m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,20,57],
+m5:[function(a,b){this.SK(a,null)},"$1","gb6",2,0,19,59],
 SK:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,20,99],
+J.aT(a.oi).cv(z).ml(new X.Xy(a)).YM(b)},"$1","gvC",2,0,19,98],
 Zb:function(a){if(a.oi==null)return
 this.GN(a)},
 GN:function(a){var z,y,x,w,v
@@ -12422,11 +12464,11 @@
 if(z==null)return
 try{a.Hm.mA(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 N.QM("").wF("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,100,101],
-LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,100,101],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,99,100],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,99,100],
 YF:[function(a,b,c,d){var z,y,x,w,v,u
 w=J.RE(b)
 if(!J.xC(J.eS(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
@@ -12436,8 +12478,8 @@
 if(typeof v!=="number")return v.W()
 w.qU(v-1)}catch(u){w=H.Ru(u)
 y=w
-x=new H.XO(u,null)
-N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,102,1,103,104],
+x=new H.oP(u,null)
+N.QM("").wF("toggleExpanded",y,x)}},"$3","gwJ",6,0,101,2,102,103],
 static:{"^":"B6",jD:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12463,9 +12505,9 @@
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"TpZ:111;a",
+"^":"TpZ:110;a",
 $1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,158,"call"],
+z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,157,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -12507,8 +12549,8 @@
 "^":"V27;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,159,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,159,14],
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.rf(a))},"$1","gX0",2,0,158,13],
+kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,158,13],
 static:{zr:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12518,21 +12560,21 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
+C.lk8.ZL(a)
+C.lk8.XI(a)
 return a}}},
 V27:{
 "^":"uL+Pi;",
 $isd3:true},
 rf:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 r8:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 $.Kh.x3(z.ow)
-return J.cI(z.ow)},"$1",null,2,0,null,142,"call"],
+return J.cI(z.ow)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 Qh:{
 "^":"V28;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
@@ -12547,8 +12589,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Vi.ZL(a)
-C.Vi.XI(a)
+C.rCJ.ZL(a)
+C.rCJ.XI(a)
 return a}}},
 V28:{
 "^":"uL+Pi;",
@@ -12557,7 +12599,7 @@
 "^":"V29;ow,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{RP:function(a){var z,y
+static:{TSH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12601,7 +12643,7 @@
 x=z.WL
 if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
 x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,19,59],
 static:{Oll:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -12618,7 +12660,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-p69:{
+EN:{
 "^":"a;Yi,S2",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.Yi.KJ
@@ -12661,8 +12703,8 @@
 god:function(a){return a.TO},
 sod:function(a,b){a.TO=this.ct(a,C.rB,a.TO,b)},
 vV:[function(a,b){var z=a.TO
-return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,18],
+return z.cv(J.ew(J.eS(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+tI:[function(a){a.TO.m7().ml(new L.LX(a))},"$0","gCt",0,0,17],
 Es:function(a){Z.uL.prototype.Es.call(this,a)
 a.Cn=P.rT(P.ii(0,0,0,0,0,1),this.gCt(a))},
 dQ:function(a){var z
@@ -12670,16 +12712,16 @@
 z=a.Cn
 if(z!=null){z.ed()
 a.Cn=null}},
-SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,20,99],
-Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,159,14],
-kf:[function(a,b){return a.TO.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,159,14],
+SK:[function(a,b){J.cI(a.TO).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.TO).YM(b)},"$1","gDX",2,0,19,98],
+Fv:[function(a,b){return a.TO.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,158,13],
+kf:[function(a,b){return a.TO.cv("resume").ml(new L.QY(a))},"$1","gDQ",2,0,158,13],
 static:{Qtp:function(a){var z,y,x
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=P.L5(null,null,null,P.qU,W.I0)
 x=P.qU
 x=H.VM(new V.qC(P.YM(null,null,null,x,null),null,null),[x,null])
-a.Fs=new L.p69(new G.Kf(z),null)
+a.Fs=new L.EN(new G.Kf(z),null)
 a.Cc=[]
 a.q1=!1
 a.oG=!1
@@ -12692,7 +12734,7 @@
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.Fs
@@ -12704,15 +12746,15 @@
 y.S2=v
 w.u(0,"isStacked",!0)
 y.S2.bG.u(0,"connectSteps",!1)
-y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,160,"call"],
+y.S2.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.S2.W2(y.Yi)}if(z.Cn!=null)z.Cn=P.rT(P.ii(0,0,0,0,0,1),J.J7(z))},"$1",null,2,0,null,159,"call"],
 $isEH:true},
 CV:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,142,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
-Vq:{
-"^":"TpZ:13;a",
-$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,142,"call"],
+QY:{
+"^":"TpZ:12;a",
+$1:[function(a){return J.cI(this.a.TO)},"$1",null,2,0,null,140,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -12781,8 +12823,8 @@
 new Z.xh(z,y).LE(x,0)
 z.KF("}\n")
 z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,19,59],
+static:{lL:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12818,10 +12860,10 @@
 "^":"V33;iI,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,106,107],
-SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,20,99],
-static:{as:function(a){var z,y
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.eS(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,105,106],
+SK:[function(a,b){J.cI(a.iI).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.iI).YM(b)},"$1","gDX",2,0,19,98],
+static:{SP:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -12862,16 +12904,16 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){v.cB(w)
 v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.D8,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
+Z8:function(a,b,c){return this.Y6(C.D8,a,b,c)},
+kS:function(a){return this.Z8(a,null,null)},
 dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
 Ny:function(a){return this.dL(a,null,null)},
 ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
 To:function(a){return this.ZG(a,null,null)},
 wF:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.wF(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.cd,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
+Ah:function(a,b,c){return this.Y6(C.cd,a,b,c)},
+YX:function(a){return this.Ah(a,null,null)},
 tQ:function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
@@ -12884,7 +12926,7 @@
 $isTJ:true,
 static:{"^":"Uj",QM:function(a){return $.Iu().to(0,a,new N.aO(a))}}},
 aO:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
@@ -12916,12 +12958,12 @@
 if(typeof z!=="number")return H.s(z)
 return this.P-z},
 giO:function(a){return this.P},
-bu:[function(a){return this.oc},"$0","gAY",0,0,69],
+bu:[function(a){return this.oc},"$0","gAY",0,0,71],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
+static:{"^":"V7K,tmj,Enk,LkO,tY,kH8,hlK,MHK,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,69],
+"^":"a;OR<,G1>,iJ,Fl<,fi,kc>,I4<",
+bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},"$0","gAY",0,0,71],
 $isHV:true,
 static:{"^":"xO"}}}],["","main.dart",,F,{
 "^":"",
@@ -12935,21 +12977,21 @@
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
 $.Ib().MM.ml(G.vN()).ml(new F.e448())},
 e447:{
-"^":"TpZ:162;",
+"^":"TpZ:161;",
 $1:[function(a){var z
 if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
 if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,161,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,160,"call"],
 $isEH:true},
 e448:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:[function(a){var z,y,x
 N.QM("").To("Initializing Polymer")
 try{A.YK()}catch(y){x=H.Ru(y)
 z=x
-N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,14,"call"],
+N.QM("").YX("Error initializing polymer: "+H.d(z))}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
@@ -12980,7 +13022,7 @@
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{AJm:function(a){var z,y
+static:{yU:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -13034,8 +13076,8 @@
 Kp:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,112,1,103,104],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,111,2,102,103],
+wY6:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,17],
 static:{ZC:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13081,8 +13123,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
+C.lx.ZL(a)
+C.lx.XI(a)
 return a}}},
 V38:{
 "^":"uL+Pi;",
@@ -13093,7 +13135,7 @@
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,20,57],
+GU:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","guz",2,0,19,59],
 gu6:function(a){var z=a.iy
 if(z!=null)return J.Ds(z)
 else return""},
@@ -13183,7 +13225,7 @@
 sRk:function(a,b){a.rv=this.ct(a,C.ld,a.rv,b)},
 gBk:function(a){return a.Wx},
 sBk:function(a,b){a.Wx=this.ct(a,C.p8,a.Wx,b)},
-cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,163,1,103,104],
+cz:[function(a,b,c,d){J.V1(a.rv,a.Wx)},"$3","gTA",6,0,162,2,102,103],
 static:{Ow:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13211,7 +13253,7 @@
 a.i6=z}else{z=H.VM([],[G.OS])
 y=Q.ch(null,D.Mk)
 x=new G.nD(new G.ut("targetManager"),Q.ch(null,null),null,null,null,null)
-x.Ff()
+x.XA()
 y=new G.mL(z,null,new G.ng("/vm",null,null,null,null,null),null,x,null,a,null,y,null,null)
 y.Ty(a)
 a.i6=y}},
@@ -13225,8 +13267,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
+C.YpE.ZL(a)
+C.YpE.XI(a)
 return a}}},
 V44:{
 "^":"uL+Pi;",
@@ -13246,7 +13288,7 @@
 sMT:function(a,b){a.tB=this.ct(a,C.O9,a.tB,b)},
 yY:function(a){},
 Lq:[function(a,b){if(a.tB!=null)this.Tt(a)
-else this.Q4(a)},"$1","gj8",2,0,20,57],
+else this.Q4(a)},"$1","gj8",2,0,19,59],
 Tt:function(a){var z
 if(a.tB==null)return
 z=a.kR
@@ -13259,25 +13301,25 @@
 this.yY(a)
 z=a.tB
 if(z==null){this.Q4(a)
-return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,18],
-cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,163,2,103,104],
-KN:[function(a,b){this.gi6(a).Z6
-return"#"+H.d(b)},"$1","gn0",2,0,164,165],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,166,167],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,134,21],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,168,169],
-MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,168,169],
+return}a.kR=P.rT(z,this.gwZ(a))},"$0","gwZ",0,0,17],
+cD:[function(a,b,c,d){this.gi6(a).Z6.WV(b,c,d)},"$3","gRh",6,0,162,143,102,103],
+If:[function(a,b){this.gi6(a).Z6
+return"#"+H.d(b)},"$1","gn0",2,0,163,164],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,165,166],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,14,15],
+B3:[function(a,b){return H.BU(b,null,null)},"$1","gXr",2,0,133,20],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,167,168],
+MI:[function(a,b){return J.xC(b,"Error")},"$1","gc9",2,0,167,168],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,168,169],
-RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,168,169],
-Oj:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,168,169],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,168,169],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,168,169],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,167,168],
+RU:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,167,168],
+KJa:[function(a,b){return J.xC(b,"String")},"$1","gO0",2,0,167,168],
+wm:[function(a,b){return J.xC(b,"Instance")},"$1","gnD",2,0,167,168],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,167,168],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,168,169],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,168,169],
-Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,168,169],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,167,168],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,167,168],
+Dz:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,167,168],
 static:{EE:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -13287,17 +13329,17 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}},
 Xfs:{
 "^":"xc+Pi;",
 $isd3:true}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
-Yj:{
+OC:{
 "^":"a;",
 sP:function(a,b){},
-$isYj:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+$isOC:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -13306,8 +13348,8 @@
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Oq(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,18],
-dt:[function(a){a.AP=null},"$0","gym",0,0,18],
+k0:[function(a){},"$0","gqw",0,0,17],
+Yd:[function(a){a.AP=null},"$0","gym",0,0,17],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -13315,7 +13357,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,121],
+return!0}return!1},"$0","gDx",0,0,120],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -13332,7 +13374,7 @@
 $isyj:true},
 qI:{
 "^":"yj;WA>,oc>,jL,zZ",
-bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,69],
+bu:[function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
 $isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
 N0:function(){var z,y,x,w,v,u,t,s,r,q
@@ -13362,36 +13404,36 @@
 z=new O.YC(z)
 return new P.yQ(null,null,null,null,new O.zI(z),new O.hw(z),null,null,null,null,null,null)},
 YC:{
-"^":"TpZ:170;a",
+"^":"TpZ:169;a",
 $2:function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
 a.RK(b,new O.aR(z))},
 $isEH:true},
 aR:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:[function(){this.a.a=!1
 O.N0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 zI:{
-"^":"TpZ:30;b",
+"^":"TpZ:29;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.HF(this.b,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 HF:{
-"^":"TpZ:72;c,d,e,f",
+"^":"TpZ:74;c,d,e,f",
 $0:[function(){this.c.$2(this.d,this.e)
 return this.f.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 hw:{
-"^":"TpZ:171;UI",
+"^":"TpZ:170;UI",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.iu(this.UI,b,c,d)},"$4",null,8,0,null,26,27,28,30,"call"],
 $isEH:true},
 iu:{
-"^":"TpZ:13;bK,Gq,Rm,w3",
+"^":"TpZ:12;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,67,"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
@@ -13410,26 +13452,26 @@
 if(t>=u.length)return H.e(u,t)
 u[t]=t}for(u=J.Qc(b),s=J.U6(a),v=1;v<z;++v)for(r=v-1,q=e+v-1,t=1;t<y;++t){if(q>>>0!==q||q>=d.length)return H.e(d,q)
 p=J.xC(d[q],s.t(a,J.Hn(u.g(b,t),1)))
-o=x[v]
-n=x[r]
+o=x[r]
+n=x[v]
 m=t-1
 if(p){if(v>=w)return H.e(x,v)
 if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
+if(m>=o.length)return H.e(o,m)
+p=o[m]
 if(t>=n.length)return H.e(n,t)
-p=n[t]
+n[t]=p}else{if(r>=w)return H.e(x,r)
+if(t>=o.length)return H.e(o,t)
+p=o[t]
 if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
+o=n.length
+if(m>=o)return H.e(n,m)
+m=n[m]
 if(typeof m!=="number")return m.g()
 m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
+if(t>=o)return H.e(n,t)
+n[t]=m}}return x},
 kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -13604,7 +13646,7 @@
 bu:[function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
 y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,69],
+return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},"$0","gAY",0,0,71],
 $isDA:true,
 static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
@@ -13618,12 +13660,12 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
+kM:[function(){return O.N0()},"$0","Jy",0,0,17],
 Wi:function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
 return d},
 d3:{
-"^":"a;R9:ro%,V2:dUC%,me:pt%",
+"^":"a;R9:ro%,V2:fb%,me:pt%",
 gqh:function(a){var z
 if(this.gR9(a)==null){z=this.gFW(a)
 this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
@@ -13640,11 +13682,11 @@
 $.Oo=z}z.push(a)
 $.ax=$.ax+1
 y=P.L5(null,null,null,P.IN,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
+for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.AP,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){x=J.O6(z.lo)
 w=$.cp().eA.t(0,x)
 if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
+y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","gFW",0,0,17],
+L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,17],
 HC:function(a){var z,y
 z={}
 if(this.gV2(a)==null||!this.gnz(a))return!1
@@ -13662,7 +13704,7 @@
 this.gme(a).push(b)},
 $isd3:true},
 X6:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -13672,17 +13714,17 @@
 x.a=v
 x=v}else x=w
 x.push(H.VM(new T.qI(z,a,b,y),[null]))
-J.iv(z).u(0,a,y)}},
+J.iy(z).u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
-Sk:{
+xhq:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.ls,this.DA,b)},
-bu:[function(a){return"#<"+new H.cu(H.wO(this),null).bu(0)+" value: "+H.d(this.DA)+">"},"$0","gAY",0,0,69]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+gP:function(a){return this.ra},
+sP:function(a,b){this.ra=F.Wi(this,C.ls,this.ra,b)},
+bu:[function(a){return"#<"+H.d(new H.cu(H.wO(this),null))+" value: "+H.d(this.ra)+">"},"$0","gAY",0,0,71]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
+"^":"er;b3@,iT,ao,AP,fn",
 gQV:function(){var z=this.iT
 if(z==null){z=P.bK(new Q.xb(this),null,!0,null)
 this.iT=z}z.toString
@@ -13740,7 +13782,7 @@
 z=x==null?z!=null:x!==z}else z=!1
 if(z&&y>0){z=this.ao
 H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.na(this.ao,b,c)},
+this.iH(G.K6(this,b,y,H.c1(z,b,y,null).br(0)))}H.h8(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
 z=this.ao
 y=z.length
@@ -13791,7 +13833,7 @@
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
+oF:function(a,b,c){var z,y,x,w
 if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
 if(!z.$isWO&&!0)c=z.br(c)
@@ -13801,7 +13843,7 @@
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.na(z,b,c)
+H.h8(z,b,c)
 this.On(x,z.length)
 z=this.iT
 if(z!=null){w=z.iE
@@ -13847,7 +13889,7 @@
 if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,121],
+return!0}return!1},"$0","gL6",0,0,120],
 $iswn:true,
 static:{ch:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -13880,11 +13922,11 @@
 C.Nm.sB(a,l)
 H.qG(a,n,l,a,u)
 H.qG(a,w,n,t,0)}}}}},
-uFU:{
+er:{
 "^":"ark+Pi;",
 $isd3:true},
 xb:{
-"^":"TpZ:72;a",
+"^":"TpZ:74;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -13893,7 +13935,7 @@
 bu:[function(a){var z
 if(this.aC)z="insert"
 else z=this.w5?"remove":"set"
-return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,69],
+return"#<MapChangeRecord "+z+" "+H.d(this.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},"$0","gAY",0,0,71],
 $isya:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
@@ -13943,7 +13985,7 @@
 F.Wi(this,C.Wn,y,0)
 this.G8()}z.V1(0)},
 aN:function(a,b){return this.Zp.aN(0,b)},
-bu:[function(a){return P.vW(this)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this)},"$0","gAY",0,0,71],
 G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
 this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
 $isqC:true,
@@ -13956,39 +13998,39 @@
 return y}}},
 zT:{
 "^":"TpZ;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,78,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,77,20,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IGs(function(a,b){return{func:"lb",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z=this.a
 z.nq(z,H.VM(new V.ya(a,b,null,!1,!0),[null,null]))},
 $isEH:true}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
 "^":"",
 Qw:{
-"^":"Yj;pQ,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
+"^":"OC;BS,Or,HM,cS,h5",
+Jy:function(a){return this.Or.$1(a)},
+Kv:function(a){return this.cS.$1(a)},
 TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.pQ,this.gNV()))
-this.Cg=z
+this.cS=b
+z=this.Jy(J.mu(this.BS,this.gjr()))
+this.h5=z
 return z},
-rJm:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gNV",2,0,13,58],
-xO:function(a){var z=this.pQ
+EJ:[function(a){var z=this.Jy(a)
+if(J.xC(z,this.h5))return
+this.h5=z
+return this.Kv(z)},"$1","gjr",2,0,12,60],
+xO:function(a){var z=this.BS
 if(z!=null)J.yd(z)
-this.pQ=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.pQ))
-this.Cg=z
+this.BS=null
+this.Or=null
+this.HM=null
+this.cS=null
+this.h5=null},
+gP:function(a){var z=this.Jy(J.Vm(this.BS))
+this.h5=z
 return z},
-sP:function(a,b){J.ta(this.pQ,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+sP:function(a,b){J.ta(this.BS,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Hj:function(a,b){var z,y,x,w,v
 if(a==null)return
@@ -13997,14 +14039,14 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
 if(z)return J.UQ(a,$.Mg().ep.t(0,b))
 try{z=a
 y=b
 x=$.cp().eA.t(0,y)
 if(x==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+H.d(z)))
 z=x.$1(z)
-return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Jk(a)
+return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.Lm(a)
 v=$.mX().F1(z,C.OV)
 if(!(v!=null&&v.fY===C.hU&&!v.Fo))throw w}else throw w}}z=$.Nd()
 if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
@@ -14017,10 +14059,10 @@
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
 if(z){J.kW(a,$.Mg().ep.t(0,b),c)
 return!0}try{$.cp().Cq(a,b,c)
-return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Jk(a)
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isJS){z=J.Lm(a)
 if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Nd()
 if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
@@ -14051,14 +14093,14 @@
 this.zc(this.Wf,z)
 return!0},
 tF:function(){return this.hQ(!1)},
-$isYj:true},
+$isOC:true},
 Tv:{
 "^":"a;OK",
 gB:function(a){return this.OK.length},
 gl0:function(a){return this.OK.length===0},
 gPu:function(){return!0},
 bu:[function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},"$0","gAY",0,0,69],
+return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},"$0","gAY",0,0,71],
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
@@ -14130,19 +14172,19 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return},
 $isEH:true},
 f7:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,155,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isIN?$.Mg().ep.t(0,a):a},"$1",null,2,0,null,154,"call"],
 $isEH:true},
 TV:{
 "^":"Tv;OK",
 gPu:function(){return!1},
 static:{"^":"qa"}},
 DOe:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
 ww:{
@@ -14190,7 +14232,7 @@
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
-if(s===C.dV){H.Go(t,"$isYj")
+if(s===C.dV){H.Go(t,"$isOC")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
 if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
 continue}w=this.Wf
@@ -14204,23 +14246,23 @@
 this.Aw(this.Wf,y,w)
 return!0},
 tF:function(){return this.hQ(!1)},
-$isYj:true},
+$isOC:true},
 Zu:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.GX!=null&&z.SG()},"$1",null,2,0,null,14,"call"],
+return z.GX!=null&&z.SG()},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Yj;cX<",
+"^":"OC;cX<",
 CC:function(){return this.GX.$0()},
 K0:function(a){return this.GX.$1(a)},
 cF:function(a,b){return this.GX.$2(a,b)},
 Mm:function(a,b,c){return this.GX.$3(a,b,c)},
 ga8:function(){return this.GX!=null},
 TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.Cz(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
+if(X.fy(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
 this.GX=b
 this.vA=P.J(this.gIn(),X.RI(b))
 this.NJ(0)
@@ -14243,17 +14285,17 @@
 case 3:this.Mm(a,b,c)
 break}}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
 zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
 "^":"a;kTd,JD,rS,HN,op",
 TR:function(a,b){this.JD.u(0,b.gcX(),b)
 b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.kl(b.gQV())
-if(!!z.$isd3)this.kl(z.gqh(b))},"$1","gTT",2,0,172,93],
-kl:function(a){var z,y
+dt:[function(a,b){var z=J.x(b)
+if(!!z.$iswn)this.wq(b.gQV())
+if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,171,92],
+wq:function(a){var z,y
 if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
 z=this.HN
 y=z!=null?z.Rz(0,a):null
@@ -14267,11 +14309,11 @@
 this.rS=z
 for(y=this.JD,y=H.VM(new P.ro(y),[H.Oq(y,0),H.Oq(y,1)]),x=y.Fb,w=H.Oq(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Oq(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
 if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Oq(y,0),H.Oq(y,1)]);y.G();)y.lo.ed()
-this.HN=null},"$0","gTh",0,0,18],
-t9:[function(a){var z,y
+this.HN=null},"$0","gTh",0,0,17],
+F5:[function(a){var z,y
 for(z=this.JD,z=H.VM(new P.ro(z),[H.Oq(z,0),H.Oq(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();){y=z.lo
 if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,173],
+P.rb(this.gTh(this))},"$1","gCP",2,0,19,172],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
 if(z!=null){y=z.kTd
@@ -14288,10 +14330,10 @@
 return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
 x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
+return x}return a},"$1","Ft",2,0,12,20],
 yx:{
-"^":"TpZ:80;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,131,64,"call"],
+"^":"TpZ:79;a",
+$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,130,66,"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 YG:function(a,b,c){if(a==null||$.AM()==null)return
@@ -14308,14 +14350,14 @@
 w=w.responseText
 return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isBK){y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 $.QJ().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
 return""}else throw v}},
 M8:[function(a){var z,y
 z=$.Mg().ep.t(0,a)
 if(z==null)return!1
 y=J.rY(z)
-return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+return y.C1(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,64,65],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
 x9:function(a,b){var z,y,x,w
@@ -14356,7 +14398,7 @@
 if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
 J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
 XP:{
-"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,kX,t4",
+"^":"a;FL>,t5>,Xj<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,q5,Uj>,PS<,Ve,t4",
 gZf:function(){var z,y
 z=J.Eh(this.FL,"template")
 if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
@@ -14379,7 +14421,7 @@
 this.Bj=y}}z=this.t5
 this.pI(z)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(x!=null)for(y=C.xB.Fr(x,$.wm()),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
 u=$.Mg().Nz.t(0,v)
 t=L.hk([u])
@@ -14416,7 +14458,7 @@
 this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
 f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
+this.q5=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.Mp(z.lo)},
 OL:function(){var z,y,x,w,v,u,t,s
 z=this.Qk
@@ -14424,25 +14466,25 @@
 y=H.VM(new H.U5(z,new A.ZG()),[null])
 x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
+for(z=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
 J.t3(s,H.d(w))
 z=J.RE(x)
 z.mK(x,s,z.gPZ(x))}}},
 oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
+z=J.Vj(this.FL,a)
 y=z.br(z)
 x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
+if(x!=null)C.Nm.FV(y,J.Vj(x,a))
 return y},
 Bg:function(a){return this.oP(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
+y=new A.Vi("[polymer-scope="+a+"]")
+for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.vG(J.mY(x.l6),x.T6),[H.Oq(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
+z.vM=u+"\n\n"}for(x=this.q5,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.vG(J.mY(y.l6),y.T6),[H.Oq(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
 w=z.vM+=typeof v==="string"?v:H.d(v)
 z.vM=w+"\n\n"}return z.vM},
 J3:function(a,b){var z
@@ -14471,19 +14513,19 @@
 $isXP:true,
 static:{"^":"Kb"}},
 Zd:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return!!J.x(a).$ishG},
 $isEH:true},
 Da:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return a.gvn()},
 $isEH:true},
 eY:{
-"^":"TpZ:80;a",
-$2:function(a,b){if(C.n7.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
+"^":"TpZ:79;a",
+$2:function(a,b){if(C.pv.x4(0,a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
@@ -14491,19 +14533,19 @@
 if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
 $isEH:true},
 ZG:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-ua:{
-"^":"TpZ:13;a",
+Vi:{
+"^":"TpZ:12;a",
 $1:function(a){return J.Uv(a,this.a)},
 $isEH:true},
 XUG:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"TpZ:174;a",
+"^":"TpZ:173;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 Li:{
@@ -14526,11 +14568,11 @@
 if(!y.nC(b,"on-"))return
 x=y.yn(b,3)
 z.a=x
-w=C.fE.t(0,x)
+w=C.yt.t(0,x)
 z.a=w!=null?w:z.a
-return new A.liz(z,this,a)}},
+return new A.na(z,this,a)}},
 l5:{
-"^":"TpZ:13;a,b,c,d",
+"^":"TpZ:12;a,b,c,d",
 $1:[function(a){var z,y,x,w
 z=this.a
 y=z.a
@@ -14541,10 +14583,10 @@
 if(w==null)w=J.UQ(P.XY(a),"detail")}else w=null
 y=y.gSd(a)
 z=z.a
-J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
+J.bH(z,z,this.d,[a,w,y])}else throw H.b(P.w("controller "+H.d(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,2,"call"],
 $isEH:true},
-liz:{
-"^":"TpZ:178;a,b,c",
+na:{
+"^":"TpZ:177;a,b,c",
 $3:[function(a,b,c){var z,y,x,w
 z=this.c
 y=this.b.Y2(null,b,z)
@@ -14552,10 +14594,10 @@
 w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Oq(x,0)])
 w.Zz()
 if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,175,176,177,"call"],
+return new A.d6(w,z)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
 d6:{
-"^":"Yj;Jq,ED",
+"^":"OC;Jq,ED",
 gP:function(a){return"{{ "+this.ED+" }}"},
 TR:function(a,b){return"{{ "+this.ED+" }}"},
 xO:function(a){var z=this.Jq
@@ -14579,7 +14621,7 @@
 C.Ki.ZL(a)
 C.Ki.XI(a)
 return a}}},
-jpR:{
+re:{
 "^":"Bo+zs;XG:SD=",
 $iszs:true,
 $isvy:true,
@@ -14588,7 +14630,7 @@
 $isPZ:true,
 $isKV:true},
 TR0:{
-"^":"jpR+Pi;",
+"^":"re+Pi;",
 $isd3:true},
 zs:{
 "^":"a;XG:SD=",
@@ -14657,7 +14699,7 @@
 return z},
 lj:function(a,b){var z,y,x
 if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
+for(z=J.Vj(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
 y.u(0,J.eS(x),x)}},
 wN:function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},
@@ -14673,9 +14715,9 @@
 w=$.cp().jD(a,x)
 v=y.gt5(z)
 x=J.x(v)
-u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Jk(w):v)
+u=Z.Zh(c,w,(x.n(v,C.AP)||x.n(v,C.wG))&&w!=null?J.Lm(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,179],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,178],
 B2:function(a,b){var z=a.IX.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -14704,16 +14746,16 @@
 w=J.mu(c,v.gap())
 v.dY=w
 $.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.SB(a))==null){x=P.Fl(null,null)
-J.nC(M.SB(a),x)}J.kW(J.C5(M.SB(a)),b,v)}u=a.IX.gBj()
+if($.rK&&!0){if(J.QE(M.SB(a))==null){x=P.Fl(null,null)
+J.nC(M.SB(a),x)}J.kW(J.QE(M.SB(a)),b,v)}u=a.IX.gBj()
 y=y.goc(z)
 t=$.Mg().ep.t(0,y)
 if(u!=null&&u.tg(0,t))this.JY(a,t)
 return v}},
 Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.SB(a))},
+gCd:function(a){return J.QE(M.SB(a))},
 sCd:function(a,b){J.nC(M.SB(a),b)},
-gmSA:function(a){return J.qb(M.SB(a))},
+gmSA:function(a){return J.Zz(M.SB(a))},
 d9:function(a){var z,y
 if(a.Uk===!0)return
 $.iX().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
@@ -14726,7 +14768,7 @@
 H.bQ(a.Cc,this.ghb(a))
 a.Cc=[]
 this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
+a.Uk=!0},"$0","gJg",0,0,17],
 oW:function(a){var z
 if(a.Uk===!0){$.iX().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
 return}$.iX().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
@@ -14744,34 +14786,31 @@
 for(y=H.VM(new P.fG(z),[H.Oq(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Oq(y,0)]);y.G();){v=y.fD
 x.yN(a,v)
 this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,180],
+FQ:[function(a,b,c,d){J.Me(c,new A.N4(a,b,c,d,J.JR(a.IX),P.Rd(null,null,null,null)))},"$3","gUc",6,0,179],
 HT:[function(a,b){var z,y,x,w,v
 for(z=J.mY(b);z.G();){y=z.gl()
 if(!J.x(y).$isqI)continue
 x=y.oc
 w=$.Mg().ep.t(0,x)
 v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,181,173],
+if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gGi",2,0,180,172],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=J.JR(a.IX)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.dnO()
+if(!!J.x(d).$iswn){x=$.mj()
 if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dnO()
+this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.mj()
 if(x.mL(C.t4))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.ps(new A.Y0(a,d,y))
-w.fm(0,null)
-w.y5(null)
+w=c.gQV().ht(new A.Y0(a,d,y),null,null,!1)
 x=H.d(b)+"__array"
 v=a.q9
 if(v==null){v=P.L5(null,null,null,P.qU,P.yX)
 a.q9=v}v.u(0,x,w)}},
 dvq:[function(a,b){var z,y
 for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.yd(y)}},"$1","ghb",2,0,182],
+if(y!=null)J.yd(y)}},"$1","ghb",2,0,181],
 iQ:function(a,b){var z=a.q9.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -14815,21 +14854,21 @@
 $isPZ:true,
 $isKV:true},
 bl:{
-"^":"TpZ:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 Sv:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(0,a)!==!0)z.u(0,a,new A.Te4(b).$0())
 z.t(0,a)},
 $isEH:true},
 Te4:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:function(){return this.b},
 $isEH:true},
 N4:{
-"^":"TpZ:80;a,b,c,d,e,f",
+"^":"TpZ:79;a,b,c,d,e,f",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 z=this.b
 y=J.UQ(z,a)
@@ -14845,25 +14884,25 @@
 for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
 if(!q.h(0,p))continue
 s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,94,57,"call"],
+$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,93,59,"call"],
 $isEH:true},
 Y0:{
-"^":"TpZ:13;a,b,c",
+"^":"TpZ:12;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,183,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 SX:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){var z,y
 z=this.a
 y=J.Ei(z).t(0,a)
 H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(J.du(z.IX).Y2(z,z,b)),y.Sg),[H.Oq(y,0)]).Zz()},
 $isEH:true},
 lK:{
-"^":"Yj;I6,iU,q0,Jq,dY",
+"^":"OC;I6,iU,q0,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,19,60],
 HX:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
@@ -14872,7 +14911,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,181,173],
+return}}},"$1","gXQ",2,0,180,172],
 TR:function(a,b){return J.mu(this.q0,b)},
 gP:function(a){return J.Vm(this.q0)},
 sP:function(a,b){J.ta(this.q0,b)
@@ -14898,36 +14937,36 @@
 if(z!=null){z.ed()
 this.ih=null}}},
 K3:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 if(z.ih!=null||z.lS!=null){z.nY(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
+z.Ws()}return},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 mS:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:[function(){var z=$.iF().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"TpZ:186;a,b",
+"^":"TpZ:185;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.zR(a,b,z,$.vE().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,184,56,185,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,183,58,184,"call"],
 $isEH:true},
 zR:{
-"^":"TpZ:72;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+"^":"TpZ:74;c,d,e,f",
+$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=this.c
 y=this.d
 x=this.e
 w=this.f
-v=$.rk()
+v=$.Ak()
 u=P.Fl(null,null)
 t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
 $.vE().u(0,y,t)
@@ -14938,7 +14977,7 @@
 t.I9()
 s=J.RE(z)
 r=s.Wk(z,"template")
-if(r!=null)J.NA(!!J.x(r).$isvy?r:M.SB(r),v)
+if(r!=null)J.vc(!!J.x(r).$isvy?r:M.SB(r),v)
 t.Mi()
 t.f6()
 t.OL()
@@ -14951,23 +14990,28 @@
 p=P.hK(s.gM0(z).baseURI)
 z=P.hK(q)
 o=z.Fi
-if(o!==""){n=z.ku
+if(o.length!==0){if(z.Bo!=null){n=z.ux
 m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
+l=z.IE!=null?z.gtp(z):null}else{n=""
+m=null
+l=null}k=p.KO(z.pO)
+j=z.Ev
+if(j!=null);else j=null}else{o=p.Fi
+if(z.Bo!=null){n=z.ux
 m=z.gJf(z)
-l=z.gkb(z)
+l=P.JF(z.IE!=null?z.gtp(z):null,o)
 k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
+j=z.Ev
+if(j!=null);else j=null}else{v=z.pO
 if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.yM(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
+j=z.Ev
+if(j!=null);else j=p.Ev}else{k=C.xB.nC(v,"/")?p.KO(v):p.KO(p.yM(p.pO,v))
+j=z.Ev
+if(j!=null);else j=null}n=p.ux
+m=p.Bo
+l=p.IE}}i=z.bM
+if(i!=null);else i=null
+t.t4=new P.q5(m,l,k,o,n,j,i,null,null)
 z=t.gZf()
 A.YG(z,y,w!=null?J.O6(w):null)
 if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
@@ -14975,16 +15019,16 @@
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 Md:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z=J.UQ(P.XY(document.createElement("polymer-element",null)),"__proto__")
 return!!J.x(z).$isKV?P.XY(z):z},
 $isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
 "^":"",
 q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
+"^":"wc;Hf,ro,fb,pt,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gk8:function(a){return J.ZH(a.Hf)},
 gG5:function(a){return J.fx(a.Hf)},
-sG5:function(a,b){J.NA(a.Hf,b)},
+sG5:function(a,b){J.vc(a.Hf,b)},
 V1:function(a){return J.Z8(a.Hf)},
 gUj:function(a){return J.fx(a.Hf)},
 ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
@@ -14993,11 +15037,11 @@
 this.Pa(a)
 a.Hf=M.SB(a)
 z=T.GF(null,C.qY)
-J.NA(a.Hf,new Y.zp(a,z,null))
+J.vc(a.Hf,new Y.zp(a,z,null))
 $.iF().MM.ml(new Y.lkK(a))},
 $isDT:true,
 $isvy:true,
-static:{zE:function(a){var z,y
+static:{Ifw:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -15018,21 +15062,21 @@
 $isPZ:true,
 $isKV:true},
 wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
+"^":"GLL+d3;R9:ro%,V2:fb%,me:pt%",
 $isd3:true},
 lkK:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 z.setAttribute("bind","")
-J.mI(z,new Y.Mrx(z))},"$1",null,2,0,null,14,"call"],
+J.mI(z,new Y.dv(z))},"$1",null,2,0,null,13,"call"],
 $isEH:true},
-Mrx:{
-"^":"TpZ:13;b",
+dv:{
+"^":"TpZ:12;b",
 $1:[function(a){var z,y
 z=this.b
 y=J.RE(z)
 y.lj(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
+y.Tj(z,"template-bound")},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 zp:{
 "^":"Li;dq,Mn,cJ",
@@ -15045,63 +15089,63 @@
 return y}catch(x){H.Ru(x)
 return a}},
 lP:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return a},
 $isEH:true},
 Ra:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return a},
 $isEH:true},
 wJY:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 zOQ:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 W6o:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return this.a},
 $isEH:true},
 MdQ:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
-dA:[function(a){var z=J.x(a)
+Rj:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.zg(z.gvc(a),new T.IK(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
+return z},"$1","PG",2,0,52,66],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(z.gvc(a),new T.k9(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","kR",2,0,13,65],
+return z},"$1","Bn",2,0,52,66],
+Fm:[function(a){return a},"$1","kR",2,0,12,67],
 IK:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){return J.xC(J.UQ(this.a,a),!0)},
 $isEH:true},
 k9:{
-"^":"TpZ:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,131,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){return H.d(a)+": "+H.d(J.UQ(this.a,a))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
-cP:{
+QB:{
 "^":"VE;VA,jw,iX,WK,cJ",
 US:function(a,b,c){var z,y,x,w
 z={}
-y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
+y=new Y.xv(H.VM([],[Y.qS]),P.p9(""),new P.Kg(a,0,0,null),null)
 x=new U.Fs()
 x=new T.FX(x,y,null,null)
 y=y.zl()
@@ -15112,12 +15156,12 @@
 if(M.CF(c)){y=J.x(b)
 y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
 if(y){z=J.x(w)
-if(!!z.$isDI)return new T.Xyb(this,w.gF5(),z.gkZ(w))
-else return new T.Ddj(this,w)}z.a=null
+if(!!z.$isb4)return new T.qb(this,w.gxG(),z.gkZ(w))
+else return new T.Xyb(this,w)}z.a=null
 y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.H1B(z,this,w)},
+if(y&&J.xC(b,"class"))z.a=T.PG()
+else if(y&&J.xC(b,"style"))z.a=T.Bn()
+return new T.Ddj(z,this,w)},
 CE:function(a){var z=this.WK.t(0,a)
 if(z==null)return new T.r6(this,a)
 return new T.Wb(this,a,z)},
@@ -15147,131 +15191,131 @@
 return this.iX.t(0,a)}else{y=J.RE(a)
 if(y.geT(a)==null){x=this.iX.t(0,a)
 return x!=null?x:K.dZ(b,this.jw)}else return this.Wg(y.gBy(a),b)}},
-static:{"^":"rp3",GF:function(a,b){var z,y,x
+static:{"^":"DI",GF:function(a,b){var z,y,x
 z=H.VM(new P.qo(null),[K.GK])
 y=H.VM(new P.qo(null),[P.qU])
 x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.cP(b,x,z,y,null)}}},
-Xyb:{
-"^":"TpZ:187;b,c,d",
+x.FV(0,C.c7o)
+return new T.QB(b,x,z,y,null)}}},
+qb:{
+"^":"TpZ:186;b,c,d",
 $3:[function(a,b,c){var z,y
 z=this.b
 z.WK.u(0,b,this.c)
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 z=T.kR()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
-Ddj:{
-"^":"TpZ:187;e,f",
+Xyb:{
+"^":"TpZ:186;e,f",
 $3:[function(a,b,c){var z,y
 z=this.e
 y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
 z.iX.u(0,b,y)
 if(c===!0)return T.jF(this.f,y,null)
 z=T.kR()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
-H1B:{
-"^":"TpZ:187;a,UI,bK",
+Ddj:{
+"^":"TpZ:186;a,UI,bK",
 $3:[function(a,b,c){var z,y
 z=this.UI.ey(b,a)
 if(c===!0)return T.jF(this.bK,z,this.a.a)
 y=this.a.a
 if(y==null)y=T.kR()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,175,176,177,"call"],
+return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,174,175,176,"call"],
 $isEH:true},
 r6:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z,y,x
 z=this.a
 y=this.b
 x=z.iX.t(0,y)
 if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,175,"call"],
+return K.dZ(a,z.jw)}else return z.ey(y,a)},"$1",null,2,0,null,174,"call"],
 $isEH:true},
 Wb:{
-"^":"TpZ:13;c,d,e",
+"^":"TpZ:12;c,d,e",
 $1:[function(a){var z,y,x,w
 z=this.c
 y=this.d
 x=z.iX.t(0,y)
 w=this.e
 if(x!=null)return x.t1(w,a)
-else return z.fO(y).t1(w,a)},"$1",null,2,0,null,175,"call"],
+else return z.fO(y).t1(w,a)},"$1",null,2,0,null,174,"call"],
 $isEH:true},
 tI:{
-"^":"Yj;IM,eI,kG,Tu,T7,z0,IZ",
+"^":"OC;IM,eI,kG,Tu,T7,zh,IZ",
 bh:function(a){return this.eI.$1(a)},
 tC:function(a){return this.Tu.$1(a)},
 b9:[function(a,b){var z,y
 z=this.IZ
 y=this.bh(a)
 this.IZ=y
-if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,188,189,64,190],
+if(b!==!0&&this.Tu!=null&&!J.xC(z,y))this.tC(this.IZ)},function(a){return this.b9(a,!1)},"bU","$2$skipChanges","$1","gNB",2,3,187,188,66,189],
 gP:function(a){if(this.Tu!=null)return this.IZ
 return T.jF(this.kG,this.IM,this.eI)},
 sP:function(a,b){var z,y,x,w,v
 try{z=K.FH(this.kG,b,this.IM,!1)
 this.b9(z,!0)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.kG)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v
 if(this.Tu!=null)throw H.b(P.w("already open"))
 this.Tu=b
 x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Pt(null,null)
+x.Eo(null,null)
 w=this.kG.RR(0,new K.Oy(x))
-this.z0=w
+this.zh=w
 x=w.gUO().yI(this.gNB())
 x.fm(0,new T.pI(this))
 this.T7=x
-try{x=this.z0
+try{x=this.zh
 J.okV(x,new K.Edh(this.IM))
 x.gK3()
-this.b9(this.z0.gK3(),!0)}catch(v){x=H.Ru(v)
+this.b9(this.zh.gK3(),!0)}catch(v){x=H.Ru(v)
 z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.z0)+"': "+H.d(z),y)}return this.IZ},
+y=new H.oP(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.zh)+"': "+H.d(z),y)}return this.IZ},
 xO:function(a){var z,y
 if(this.Tu==null)return
 this.T7.ed()
 this.T7=null
 this.Tu=null
-z=$.wb()
-y=this.z0
+z=$.At()
+y=this.zh
 z.toString
 J.okV(y,z)
-this.z0=null},
+this.zh=null},
 static:{jF:function(a,b,c){var z,y,x,w,v
 try{z=J.okV(a,new K.GQ(b))
 w=c==null?z:c.$1(z)
 return w}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
 pI:{
-"^":"TpZ:80;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.z0)+"': "+H.d(a),b)},"$2",null,4,0,null,1,155,"call"],
+"^":"TpZ:79;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.zh)+"': "+H.d(a),b)},"$2",null,4,0,null,2,154,"call"],
 $isEH:true},
 yy:{
 "^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
-"^":"Sk;vq,DA,AP,fn",
+"^":"xhq;vq,ra,AP,fn",
 vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
+$asxhq:function(a){return[null]},
 static:{pe:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 fg:{
 "^":"TpZ;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.ls,z.DA,a)},"$1",null,2,0,null,94,"call"],
+z.ra=F.Wi(z,C.ls,z.ra,a)},"$1",null,2,0,null,93,"call"],
 $isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IGs(function(a){return{func:"Ay",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 FH:function(a,b,c,d){var z,y,x,w,v,u,t
 z=H.VM([],[U.Ip])
@@ -15282,10 +15326,10 @@
 v=!1}else if(!!y.$iszX){w=a.gTf()
 x=a.gJn()
 v=!0}else{if(!!y.$isrX){w=a.gTf()
-x=y.goc(a)}else{if(d)throw H.b(K.zq("Expression is not assignable: "+H.d(a)))
+x=y.goc(a)}else{if(d)throw H.b(K.xn("Expression is not assignable: "+H.d(a)))
 return}v=!1}for(y=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);y.G();){u=y.lo
 J.okV(u,new K.GQ(c))
-if(d)throw H.b(K.zq("filter must implement Transformer to be assignable: "+H.d(u)))
+if(d)throw H.b(K.xn("filter must implement Transformer to be assignable: "+H.d(u)))
 else return}t=J.okV(w,new K.GQ(c))
 if(t==null)return
 if(v)J.kW(t,J.okV(x,new K.GQ(c)),b)
@@ -15297,91 +15341,91 @@
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
 x=new K.Ph(z,y)
-if(y.x4(0,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+if(y.x4(0,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
-w11:{
-"^":"TpZ:80;",
+w12:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
-w12:{
-"^":"TpZ:80;",
+w13:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
-w13:{
-"^":"TpZ:80;",
+w14:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
-w14:{
-"^":"TpZ:80;",
+w15:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.X9(a,b)},
 $isEH:true},
-w15:{
-"^":"TpZ:80;",
+w16:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.hh(a,b)},
 $isEH:true},
-w16:{
-"^":"TpZ:80;",
+w17:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
-w17:{
-"^":"TpZ:80;",
+w18:{
+"^":"TpZ:79;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
-w18:{
-"^":"TpZ:80;",
+w19:{
+"^":"TpZ:79;",
 $2:function(a,b){return a==null?b==null:a===b},
 $isEH:true},
-w19:{
-"^":"TpZ:80;",
+w20:{
+"^":"TpZ:79;",
 $2:function(a,b){return a==null?b!=null:a!==b},
 $isEH:true},
-w20:{
-"^":"TpZ:80;",
+w21:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
-w21:{
-"^":"TpZ:80;",
+w22:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
-w22:{
-"^":"TpZ:80;",
+w23:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
-w23:{
-"^":"TpZ:80;",
+w24:{
+"^":"TpZ:79;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
-w24:{
-"^":"TpZ:80;",
+w25:{
+"^":"TpZ:79;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
-w25:{
-"^":"TpZ:80;",
+w26:{
+"^":"TpZ:79;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
-w26:{
-"^":"TpZ:80;",
+w27:{
+"^":"TpZ:79;",
 $2:function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
-$isEH:true},
-w0:{
-"^":"TpZ:13;",
-$1:function(a){return a},
+throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w5:{
-"^":"TpZ:13;",
-$1:function(a){return J.jzo(a)},
+"^":"TpZ:12;",
+$1:function(a){return a},
 $isEH:true},
 w10:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
+$1:function(a){return J.jzo(a)},
+$isEH:true},
+w11:{
+"^":"TpZ:12;",
 $1:function(a){return a!==!0},
 $isEH:true},
 GK:{
 "^":"a;",
 u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
-t1:function(a,b){if(J.xC(a,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+t1:function(a,b){if(J.xC(a,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 return new K.PO(this,a,b)},
 $isGK:true,
 $isCo:true,
@@ -15392,11 +15436,11 @@
 if(J.xC(b,"this"))return this.k8
 z=$.Mg().Nz.t(0,b)
 y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
 return!!J.x(y).$iswS?B.pe(y,null):y},
 AC:function(a){return!J.xC(a,"this")},
-bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,69]},
+bu:[function(a){return"[model: "+H.d(this.k8)+"]"},"$0","gAY",0,0,71]},
 PO:{
 "^":"GK;eT>,Z0,P>",
 gk8:function(a){var z=this.eT
@@ -15407,7 +15451,7 @@
 return!!J.x(z).$iswS?B.pe(z,null):z}return this.eT.t(0,b)},
 AC:function(a){if(J.xC(this.Z0,a))return!1
 return this.eT.AC(a)},
-bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,69]},
+bu:[function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"},"$0","gAY",0,0,71]},
 Ph:{
 "^":"GK;eT>,Z3<",
 gk8:function(a){return this.eT.k8},
@@ -15417,7 +15461,7 @@
 AC:function(a){if(this.Z3.x4(0,a))return!1
 return!J.xC(a,"this")},
 bu:[function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,69]},
+return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Oq(z,0)]),"(",")")+"]"},"$0","gAY",0,0,71]},
 Ay0:{
 "^":"a;bO?,Xl<",
 gUO:function(){var z=this.k6
@@ -15439,7 +15483,7 @@
 if(y==null?z!=null:y!==z){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(y)}},
-bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,69],
+bu:[function(a){return this.KL.bu(0)},"$0","gAY",0,0,71],
 $isIp:true},
 Edh:{
 "^":"cfS;qu",
@@ -15447,7 +15491,7 @@
 me:{
 "^":"cfS;",
 xn:function(a){a.pu()},
-static:{"^":"ln"}},
+static:{"^":"b3"}},
 GQ:{
 "^":"P55;qu",
 W9:function(a){return J.ZH(this.qu)},
@@ -15461,19 +15505,19 @@
 CU:function(a){var z=J.okV(a.gTf(),this)
 if(z==null)return
 return J.UQ(z,J.okV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(z==null)return
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.eC(z,y,P.Te(null))
 x=a.gSf(a)
 v=$.Mg().Nz.t(0,x)
 return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
+tx:function(a){return a.gP(a)},
+Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).br(0)},
 o0:function(a){var z,y,x
 z=P.Fl(null,null)
 for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Oq(y,0)]);y.G();){x=y.lo
@@ -15484,7 +15528,7 @@
 z=a.gkp(a)
 y=J.okV(a.gBb(a),this)
 x=J.okV(a.gT8(a),this)
-w=$.Rab().t(0,z)
+w=$.YP().t(0,z)
 v=J.x(z)
 if(v.n(z,"&&")||v.n(z,"||")){v=y==null?!1:y
 return w.$2(v,x==null?!1:x)}else if(v.n(z,"==")||v.n(z,"!="))return w.$2(y,x)
@@ -15492,11 +15536,11 @@
 return w.$2(y,x)},
 xN:function(a){var z,y
 z=J.okV(a.gwz(),this)
-y=$.Ii().t(0,a.gkp(a))
+y=$.EU().t(0,a.gkp(a))
 if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
 return z==null?null:y.$1(z)},
 RD:function(a){return J.xC(J.okV(a.gdc(),this),!0)?J.okV(a.gSl(),this):J.okV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
+e5:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
 xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
 Oy:{
 "^":"P55;ZGj",
@@ -15514,24 +15558,24 @@
 z.sbO(x)
 y.sbO(x)
 return x},
-ZR:function(a){var z,y,x,w,v
+Y7:function(a){var z,y,x,w,v
 z=J.okV(a.gTf(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gay()
+w=this.gnG()
 x.toString
 y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(y!=null)H.bQ(y,new K.zD(v))
 return v},
-oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+tx:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.XV(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
+z=H.VM(new H.A8(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Xs(y))
 return y},
@@ -15546,7 +15590,7 @@
 ex:function(a){var z,y,x
 z=J.okV(a.gBb(a),this)
 y=J.okV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
+x=new K.UW(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
@@ -15564,22 +15608,22 @@
 y.sbO(w)
 x.sbO(w)
 return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
+e5:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
 xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
 zD:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 XV:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 Xs:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
@@ -15588,8 +15632,8 @@
 "^":"Ay0;KL,bO,tj,Xl,k6",
 Qh:function(a){this.Xl=J.ZH(a)},
 RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
+$asAy0:function(){return[U.WH]},
+$isWH:true,
 $isIp:true},
 z0:{
 "^":"Ay0;KL,bO,tj,Xl,k6",
@@ -15597,7 +15641,7 @@
 return z.gP(z)},
 Qh:function(a){var z=this.KL
 this.Xl=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
+RR:function(a,b){return b.tx(this)},
 $asAy0:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
@@ -15610,18 +15654,18 @@
 $isc0:true,
 $isIp:true},
 Hv:{
-"^":"TpZ:13;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,94,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,93,"call"],
 $isEH:true},
 ev:{
 "^":"Ay0;Rl>,KL,bO,tj,Xl,k6",
-Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
+Qh:function(a){this.Xl=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Kv())},
 RR:function(a,b){return b.o0(this)},
 $asAy0:function(){return[U.Mm]},
 $isMm:true,
 $isIp:true},
-Ku:{
-"^":"TpZ:80;",
+Kv:{
+"^":"TpZ:79;",
 $2:function(a,b){J.kW(a,J.A6(b).gXl(),b.gv4().gXl())
 return a},
 $isEH:true},
@@ -15651,12 +15695,12 @@
 $isfp:true,
 $isIp:true},
 V8:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.GC(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 GC:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 mv:{
 "^":"Ay0;wz<,KL,bO,tj,Xl,k6",
@@ -15664,7 +15708,7 @@
 return z.gkp(z)},
 Qh:function(a){var z,y
 z=this.KL
-y=$.Ii().t(0,z.gkp(z))
+y=$.EU().t(0,z.gkp(z))
 if(J.xC(z.gkp(z),"!")){z=this.wz.gXl()
 this.Xl=y.$1(z==null?!1:z)}else{z=this.wz
 this.Xl=z.gXl()==null?null:y.$1(z.gXl())}},
@@ -15672,13 +15716,13 @@
 $asAy0:function(){return[U.cJ]},
 $iscJ:true,
 $isIp:true},
-kyp:{
+UW:{
 "^":"Ay0;Bb>,T8>,KL,bO,tj,Xl,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.Rab().t(0,z.gkp(z))
+y=$.YP().t(0,z.gkp(z))
 if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gXl()
 if(z==null)z=!1
 x=this.T8.gXl()
@@ -15692,16 +15736,16 @@
 $isuku:true,
 $isIp:true},
 P8:{
-"^":"TpZ:13;a,b",
-$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"TpZ:12;a,b",
+$1:[function(a){return this.a.ub(this.b)},"$1",null,2,0,null,13,"call"],
 $isEH:true},
 WW:{
 "^":"Ay0;dc<,Sl<,ru<,KL,bO,tj,Xl,k6",
 Qh:function(a){var z=this.dc.gXl()
 this.Xl=(z==null?!1:z)===!0?this.Sl.gXl():this.ru.gXl()},
 RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
+$asAy0:function(){return[U.Dc]},
+$isDc:true,
 $isIp:true},
 vl:{
 "^":"Ay0;Tf<,KL,bO,tj,Xl,k6",
@@ -15721,12 +15765,12 @@
 $isrX:true,
 $isIp:true},
 fk:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.WKb(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 WKb:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 iT:{
 "^":"Ay0;Tf<,Jn<,KL,bO,tj,Xl,k6",
@@ -15737,26 +15781,26 @@
 x=J.U6(z)
 this.Xl=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.jai(this,a,y))},
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asAy0:function(){return[U.zX]},
 $iszX:true,
 $isIp:true},
 tE:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.zw(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.Ku(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
-zw:{
-"^":"TpZ:13;d",
-$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,84,"call"],
+Ku:{
+"^":"TpZ:12;d",
+$1:[function(a){return a.ck(this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
-jai:{
-"^":"TpZ:13;e,f,UI",
-$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,183,"call"],
+z5:{
+"^":"TpZ:12;e,f,UI",
+$1:[function(a){if(J.nE1(a,new K.ey(this.UI))===!0)this.e.ub(this.f)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 ey:{
-"^":"TpZ:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;bK",
+$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 c3:{
 "^":"Ay0;Tf<,re<,KL,bO,tj,Xl,k6",
@@ -15775,26 +15819,26 @@
 this.Xl=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
 if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.Sr(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
+RR:function(a,b){return b.Y7(this)},
 $asAy0:function(){return[U.Nb]},
 $isNb:true,
 $isIp:true},
 vQ:{
-"^":"TpZ:13;",
-$1:[function(a){return a.gXl()},"$1",null,2,0,null,46,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return a.gXl()},"$1",null,2,0,null,49,"call"],
 $isEH:true},
 Sr:{
-"^":"TpZ:191;a,b,c",
-$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,183,"call"],
+"^":"TpZ:190;a,b,c",
+$1:[function(a){if(J.nE1(a,new K.ho(this.c))===!0)this.a.ub(this.b)},"$1",null,2,0,null,182,"call"],
 $isEH:true},
 ho:{
-"^":"TpZ:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,84,"call"],
+"^":"TpZ:12;d",
+$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,83,"call"],
 $isEH:true},
 B03:{
 "^":"a;G1>",
-bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,69],
-static:{zq:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+bu:[function(a){return"EvalException: "+this.G1},"$0","gAY",0,0,71],
+static:{xn:function(a){return new K.B03(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
 Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
@@ -15816,19 +15860,19 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,192,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,191,2,49]},
 Ip:{
 "^":"a;",
 $isIp:true},
-EO:{
+WH:{
 "^":"Ip;",
 RR:function(a,b){return b.W9(this)},
-$isEO:true},
+$isWH:true},
 no:{
 "^":"Ip;P>",
-RR:function(a,b){return b.oD(this)},
+RR:function(a,b){return b.tx(this)},
 bu:[function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,69],
+return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Oq(this,0)],"$asno")
@@ -15838,7 +15882,7 @@
 c0:{
 "^":"Ip;hL<",
 RR:function(a,b){return b.Zh(this)},
-bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.hL)},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
 giO:function(a){return U.pz(this.hL)},
@@ -15846,7 +15890,7 @@
 Mm:{
 "^":"Ip;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,69],
+bu:[function(a){return"{"+H.d(this.Rl)+"}"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15856,7 +15900,7 @@
 ae:{
 "^":"Ip;G3>,v4<",
 RR:function(a,b){return b.YV(this)},
-bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,69],
+bu:[function(a){return this.G3.bu(0)+": "+H.d(this.v4)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15869,7 +15913,7 @@
 XC:{
 "^":"Ip;wz",
 RR:function(a,b){return b.LT(this)},
-bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.wz)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
@@ -15877,7 +15921,7 @@
 fp:{
 "^":"Ip;P>",
 RR:function(a,b){return b.qs(this)},
-bu:[function(a){return this.P},"$0","gAY",0,0,69],
+bu:[function(a){return this.P},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15887,7 +15931,7 @@
 cJ:{
 "^":"Ip;kp>,wz<",
 RR:function(a,b){return b.xN(this)},
-bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15900,7 +15944,7 @@
 uku:{
 "^":"Ip;kp>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
-bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15911,25 +15955,25 @@
 x=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isuku:true},
-mc:{
+Dc:{
 "^":"Ip;dc<,Sl<,ru<",
 RR:function(a,b){return b.RD(this)},
-bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isDc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
 x=J.v1(this.ru)
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
+$isDc:true},
 X7S:{
 "^":"Ip;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5:function(){var z=this.Bb
+RR:function(a,b){return b.e5(this)},
+gxG:function(){var z=this.Bb
 return z.gP(z)},
 gkZ:function(a){return this.T8},
-bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isX7S&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
 giO:function(a){var z,y
@@ -15938,14 +15982,14 @@
 y=J.v1(this.T8)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $isX7S:true,
-$isDI:true},
+$isb4:true},
 px:{
 "^":"Ip;Bb>,T8>",
 RR:function(a,b){return b.xt(this)},
-gF5:function(){var z=this.T8
+gxG:function(){var z=this.T8
 return z.gP(z)},
 gkZ:function(a){return this.Bb},
-bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.Bb)+" as "+H.d(this.T8)+")"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
 giO:function(a){var z,y
@@ -15954,11 +15998,11 @@
 y=y.giO(y)
 return U.Le(U.C0C(U.C0C(0,z),y))},
 $ispx:true,
-$isDI:true},
+$isb4:true},
 zX:{
 "^":"Ip;Tf<,Jn<",
 RR:function(a,b){return b.CU(this)},
-bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},"$0","gAY",0,0,71],
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
@@ -15969,7 +16013,7 @@
 rX:{
 "^":"Ip;Tf<,oc>",
 RR:function(a,b){return b.fV(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,69],
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.oc)},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15981,8 +16025,8 @@
 $isrX:true},
 Nb:{
 "^":"Ip;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,69],
+RR:function(a,b){return b.Y7(this)},
+bu:[function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},"$0","gAY",0,0,71],
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
@@ -15994,7 +16038,7 @@
 return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
 $isNb:true},
 lc:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return U.C0C(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
@@ -16039,7 +16083,7 @@
 this.GI(5)
 u=this.Te()
 this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
+a=new U.Dc(a,v,u)}else a=this.T1(a)
 else break}return a},
 j6:function(a,b){var z,y
 z=J.x(b)
@@ -16092,9 +16136,9 @@
 switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
 if(J.xC(z,"this")){this.Bp()
 this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
+return new U.fp("this")}else if(C.Nm.tg(C.jY,z))throw H.b(Y.RV("unexpected keyword: "+H.d(z)))
 throw H.b(Y.RV("unrecognized keyword: "+H.d(z)))
-case 2:return this.jf()
+case 2:return this.qK()
 case 1:return this.ef()
 case 6:return this.DS()
 case 7:return this.xJ()
@@ -16129,7 +16173,7 @@
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
 this.lx(9,"}")
 return new U.Mm(z)},
-jf:function(){var z,y,x
+qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
 this.rp.toString
 return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
@@ -16180,13 +16224,13 @@
 return y},
 xJ:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,66,67],
+eq:[function(a){return H.VM(new K.Bt(a),[null])},"$1","BQ",2,0,68,69],
 Aep:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isAep&&J.xC(b.vH,this.vH)&&J.xC(b.P,this.P)},
 giO:function(a){return J.v1(this.P)},
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gAY",0,0,71],
 $isAep:true},
 Bt:{
 "^":"mW;YR",
@@ -16204,13 +16248,13 @@
 $asmW:function(a){return[[K.Aep,a]]},
 $asQV:function(a){return[[K.Aep,a]]}},
 vR:{
-"^":"Dk;WS,wX,CD",
+"^":"Anv;WS,wX,CD",
 gl:function(){return this.CD},
 G:function(){var z=this.WS
 if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
 return!0}this.CD=null
 return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+$asAnv:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:function(a){switch(a){case 102:return 12
 case 110:return 10
@@ -16220,10 +16264,10 @@
 default:return a}},
 qS:{
 "^":"a;fY>,P>,nS<",
-bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,69],
+bu:[function(a){return"("+this.fY+", '"+this.P+"')"},"$0","gAY",0,0,71],
 $isqS:true},
 xv:{
-"^":"a;MV,zy,jI,x0",
+"^":"a;MV,H4,jI,x0",
 zl:function(){var z,y,x,w,v,u,t,s
 z=this.jI
 this.x0=z.G()?z.Wn:null
@@ -16251,15 +16295,15 @@
 else x=!1
 if(x){t=u+"="
 this.x0=z.G()?z.Wn:null}else t=u}else t=H.mx(v)}else t=H.mx(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
-y.push(new Y.qS(9,s,C.lx.t(0,s)))
+y.push(new Y.qS(8,t,C.w0.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.mx(this.x0)
+y.push(new Y.qS(9,s,C.w0.t(0,s)))
 this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
 WG:function(){var z,y,x,w
 z=this.x0
 y=this.jI
 x=y.G()?y.Wn:null
 this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+for(w=this.H4;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
 this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
@@ -16271,7 +16315,7 @@
 this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
-y=this.zy
+y=this.H4
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 if(!(97<=x&&x<=122))if(!(65<=x&&x<=90))w=48<=x&&x<=57||x===95||x===36||x>127
@@ -16282,12 +16326,12 @@
 y.vM+=x
 this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.jY,v))z.push(new Y.qS(10,v,0))
 else z.push(new Y.qS(2,v,0))
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
-y=this.zy
+y=this.H4
 while(!0){x=this.x0
 if(x!=null){if(typeof x!=="number")return H.s(x)
 w=48<=x&&x<=57}else w=!1
@@ -16301,7 +16345,7 @@
 else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
 qv:function(){var z,y,x,w
-z=this.zy
+z=this.H4
 z.KF(H.mx(46))
 y=this.jI
 while(!0){x=this.x0
@@ -16314,12 +16358,12 @@
 z.vM=""}},
 hA:{
 "^":"a;G1>",
-bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,69],
+bu:[function(a){return"ParseException: "+this.G1},"$0","gAY",0,0,71],
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
 P55:{
 "^":"a;",
-DV:[function(a){return J.okV(a,this)},"$1","gay",2,0,193,155]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,192,154]},
 cfS:{
 "^":"P55;",
 xn:function(a){},
@@ -16331,11 +16375,11 @@
 CU:function(a){J.okV(a.gTf(),this)
 J.okV(a.gJn(),this)
 this.xn(a)},
-ZR:function(a){var z
+Y7:function(a){var z
 J.okV(a.gTf(),this)
 if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-oD:function(a){this.xn(a)},
+tx:function(a){this.xn(a)},
 Zh:function(a){var z
 for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Oq(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
@@ -16355,7 +16399,7 @@
 J.okV(a.gSl(),this)
 J.okV(a.gru(),this)
 this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
+e5:function(a){a.Bb.RR(0,this)
 a.T8.RR(0,this)
 this.xn(a)},
 xt:function(a){a.Bb.RR(0,this)
@@ -16382,12 +16426,12 @@
 siZ:function(a,b){a.ZJ=this.ct(a,C.vs,a.ZJ,b)},
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,15,194],
-ib:[function(a,b,c){var z,y
+Nn:[function(a,b){return"line-"+H.d(b)},"$1","guS",2,0,14,43],
+mJ5:[function(a,b,c){var z,y
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#line-"+H.d(a.He))
 if(z!=null){y=!!z.scrollIntoViewIfNeeded
 if(y)z.scrollIntoViewIfNeeded()
-else z.scrollIntoView()}},"$2","gFG",4,0,195,196,197],
+else z.scrollIntoView()}},"$2","gFG",4,0,193,194,195],
 Es:function(a){var z,y
 Z.uL.prototype.Es.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector(".sourceTable")
@@ -16397,10 +16441,10 @@
 dQ:function(a){var z=a.nu
 if(z!=null){z.disconnect()
 a.nu=null}Z.uL.prototype.dQ.call(this,a)},
-GA:[function(a,b){this.mC(a)},"$1","goL",2,0,20,57],
-Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gRq",2,0,20,57],
-ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,20,57],
+GA:[function(a,b){this.mC(a)},"$1","goL",2,0,19,59],
+Yo:[function(a,b){this.mC(a)},"$1","gie",2,0,19,59],
+Ti:[function(a,b){this.mC(a)},"$1","gRq",2,0,19,59],
+ok:[function(a,b){this.mC(a)},"$1","gcY",2,0,19,59],
 mC:function(a){var z,y,x
 if(a.Oq!=null)return
 z=a.oX
@@ -16437,10 +16481,10 @@
 "^":"uL+Pi;",
 $isd3:true},
 Es:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
+J.TG(z)}},"$1",null,2,0,null,13,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
@@ -16450,10 +16494,10 @@
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gTX()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
+fX:[function(a,b){this.r6(a,null)},"$1","glD",2,0,19,59],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,19,13],
 goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -16475,8 +16519,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
+C.Yj.ZL(a)
+C.Yj.XI(a)
 return a}}},
 oEY:{
 "^":"xI+Pi;",
@@ -16491,8 +16535,8 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,20,99],
-j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,20,99],
+SK:[function(a,b){J.cI(a.Uz).YM(b)},"$1","gvC",2,0,19,98],
+j9:[function(a,b){J.eg(a.Uz).YM(b)},"$1","gDX",2,0,19,98],
 static:{UF:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -16509,7 +16553,7 @@
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,68],
+Xm:[function(a,b){return J.FW(J.O6(a),J.O6(b))},"$2","E0",4,0,70],
 Nl:function(a,b){var z,y,x,w,v,u,t,s,r,q
 if(b==null)return
 z=J.U6(b)
@@ -16624,7 +16668,7 @@
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,P.L5(null,null,null,P.KN,P.KN),null,null,null,null,null,null,P.Fl(null,null),P.Fl(null,null),null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Socket":s=new D.WP(null,null,null,null,"",!1,!1,!1,!1,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
@@ -16683,10 +16727,10 @@
 if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
 this.mQ=x
 this.bF(0,a,y)},
-Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return this.gPj(this)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
 $isaf:true},
 Bf:{
-"^":"TpZ:200;a",
+"^":"TpZ:198;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
 y=J.rY(z)
@@ -16694,25 +16738,25 @@
 y=this.a
 if(!J.xC(z,y.mQ))return D.Nl(y.P3,a)
 y.eC(a)
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 n1:{
-"^":"TpZ:72;b",
+"^":"TpZ:74;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
 boh:{
 "^":"a;",
-O5:function(a){J.Me(a,new D.P5())},
-Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,201]},
+O5:function(a){J.Me(a,new D.P5(this))},
+Ms:[function(a){return this.gwv(this).jU(this.Mq("coverage")).ml(new D.Rv(this))},"$0","gDX",0,0,199]},
 P5:{
-"^":"TpZ:13;",
+"^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,202,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,200,"call"],
 $isEH:true},
 Rv:{
-"^":"TpZ:200;a",
+"^":"TpZ:198;a",
 $1:[function(a){var z=this.a
-z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,199,"call"],
+z.O5(D.Nl(J.xC(z.gzS(),"Isolate")?z:z.gXP(),a).t(0,"coverage"))},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 xm:{
 "^":"af;"},
@@ -16723,7 +16767,7 @@
 giR:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return H.d(a)},"$1","gLc",2,0,163,196],
 gYe:function(a){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -16770,7 +16814,7 @@
 return this.B7(z).ml(new D.it(this,y))}x=this.Qy.t(0,a)
 if(x!=null)return J.cI(x)
 return this.jU(a).ml(new D.lb(this,a))},
-Ym:[function(a,b){return b},"$2","gcO",4,0,80],
+Nw:[function(a,b){return b},"$2","gcO",4,0,79],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.c5(this.gcO())
@@ -16823,74 +16867,74 @@
 "^":"xm+Pi;",
 $isd3:true},
 jy:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z,y
 z=D.Nl(a,this.a.a)
 y=this.b.Rk
 if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)},"$1",null,2,0,null,203,"call"],
+y.Iv(z)},"$1",null,2,0,null,201,"call"],
 $isEH:true},
 MZ:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,142,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,140,"call"],
 $isEH:true},
 it:{
-"^":"TpZ:13;a,b",
+"^":"TpZ:12;a,b",
 $1:[function(a){var z
 if(a==null)return this.a
 z=this.b
 if(z==null)return J.cI(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+else return a.cv(z)},"$1",null,2,0,null,6,"call"],
 $isEH:true},
 lb:{
-"^":"TpZ:200;c,d",
+"^":"TpZ:198;c,d",
 $1:[function(a){var z,y
 z=this.c
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.d,new D.QZ(y))
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 QZ:{
-"^":"TpZ:72;e",
+"^":"TpZ:74;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
-return z.N7(z.ng(a))},"$1",null,2,0,null,145,"call"],
+return z.N7(z.ng(a))},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 tm:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,23,"call"],
 $isEH:true},
 mR:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 bp:{
-"^":"TpZ:13;c",
+"^":"TpZ:12;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,87,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
 hc:{
-"^":"TpZ:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 Yu:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){J.cI(b)},
 $isEH:true},
 ER:{
 "^":"a;SP,XE>,OQ",
 eK:function(a){var z,y,x,w,v
 z=this.XE
-H.na(z,0,a)
+H.h8(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.OQ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
@@ -16927,14 +16971,16 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.lI,w=0;w<z;++w){v=this.QS
+if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
 u=new D.ER(0,v,0)
 u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
+x.push(u)}z=this.QS
+if(typeof z!=="number")return H.s(z)
+z=Array(z)
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.Hx=z
@@ -16982,7 +17028,7 @@
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gMN:function(){return this.yP},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,164,198],
+Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,163,196],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -17004,7 +17050,7 @@
 z=[]
 for(y=J.mY(J.UQ(a,"members"));y.G();){x=y.gl()
 w=J.x(x)
-if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,204,205],
+if(!!w.$isdy)z.push(w.xW(x))}return P.Ne(z,!1)},"$1","geL",2,0,202,203],
 Nze:[function(a){var z,y,x,w
 z=this.AI
 z.V1(z)
@@ -17014,7 +17060,7 @@
 if(J.xC(x.gTX(),"Object")&&J.xC(x.gi2(),!1)){w=this.Wm
 if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.jo,w,x)
 w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,206,207],
+this.nq(this,w)}this.Wm=x}}return P.Ab(this.Wm,null)},"$1","gMh",2,0,204,205],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -17116,7 +17162,7 @@
 y.V1(y)
 y.FV(0,z.t(b,"libraries"))
 y.GT(y,D.E0())},
-m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+m7:function(){return this.P3.jU("/"+H.d(this.r0)+"/profile/tag").ml(new D.O5(this))},
 aU:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
@@ -17159,7 +17205,7 @@
 "^":"PKX+Pi;",
 $isd3:true},
 iz:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
@@ -17170,36 +17216,36 @@
 a.Oo.V1(0)}},
 $isEH:true},
 KQ:{
-"^":"TpZ:200;a,b",
+"^":"TpZ:198;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.Nl(z,a)
 if(y.gUm())z.Qy.to(0,this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,199,"call"],
+return y},"$1",null,2,0,null,197,"call"],
 $isEH:true},
 Ea:{
-"^":"TpZ:72;c",
+"^":"TpZ:74;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,208,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,206,"call"],
 $isEH:true},
-AP:{
-"^":"TpZ:200;a",
+O5:{
+"^":"TpZ:198;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
 y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,158,"call"],
+return y},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 vO:{
 "^":"af;RF,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
 gM8:function(){return!1},
-bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,69],
+bu:[function(a){return P.vW(this.RF)},"$0","gAY",0,0,71],
 bF:function(a,b,c){var z,y,x
 this.kT=!c
 z=this.RF
@@ -17230,13 +17276,13 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 HC:[function(a){var z=this.RF
-return z.HC(z)},"$0","gDx",0,0,121],
+return z.HC(z)},"$0","gDx",0,0,120],
 nq:function(a,b){var z=this.RF
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,18],
-dt:[function(a){this.RF.AP=null
-return},"$0","gym",0,0,18],
+k0:[function(a){return},"$0","gqw",0,0,17],
+Yd:[function(a){this.RF.AP=null
+return},"$0","gym",0,0,17],
 gqh:function(a){var z=this.RF
 return z.gqh(z)},
 gnz:function(a){var z,y
@@ -17409,7 +17455,7 @@
 x.wf=F.Wi(x,C.yB,x.wf,z)
 y=J.ew(y.t(a,3),y.t(a,5))
 x.rT=F.Wi(x,C.hN,x.rT,y)},
-static:{"^":"jZx,xxx,Yn,SP7,S1,wXu,WVi,JQ"}},
+static:{"^":"jZx,xxx,qWF,SP7,S1O,wXu,WVi,JQ"}},
 dy:{
 "^":"cOr;Gz,ar,x8,Lh,vY,u0,J1,E8,qG,dN,yv,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gHt:function(a){return this.Gz},
@@ -17439,7 +17485,7 @@
 return z},
 gUm:function(){return!0},
 gM8:function(){return!1},
-bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,69],
+bu:[function(a){return"Service Class: "+H.d(this.GR)},"$0","gAY",0,0,71],
 bF:function(a,b,c){var z,y,x
 z=J.U6(b)
 y=z.t(b,"user_name")
@@ -17501,9 +17547,9 @@
 $isd3:true},
 Hk:{
 "^":"a;zt",
-bu:[function(a){return this.zt},"$0","gAY",0,0,72],
+bu:[function(a){return this.zt},"$0","gAY",0,0,74],
 Q2:function(){return C.Nm.tg([$.b1(),$.l3(),$.zx(),$.MQ()],this)},
-static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.YF()
+static:{"^":"Ij,jX,F0,Bs,G8,xs,ab,Sp,Et,Ll,HU,bt,wp,z3,Yb,ve",Ez:function(a){switch(a){case"kRegularFunction":return $.is()
 case"kClosureFunction":return $.xq()
 case"kGetterFunction":return $.GG()
 case"kSetterFunction":return $.Kw()
@@ -17519,7 +17565,7 @@
 case"Tag":return $.zx()
 case"Reused":return $.MQ()}return $.lC()}}},
 Kp:{
-"^":"Zqa;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"S6L;MD,EG,bV,vY,fd,ar,qG,dN,TD,NM,vf,H7,I0,XN,Ni,kE,Z4,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gEl:function(){return this.MD},
 sEl:function(a){this.MD=F.Wi(this,C.YV,this.MD,a)},
 gxH:function(){return this.EG},
@@ -17592,8 +17638,10 @@
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}else{z=H.d(z.gUx())+"."+H.d(this.bN)
 this.Ni=F.Wi(this,C.AO,this.Ni,z)}},
 $isKp:true},
-Zqa:{
-"^":"af+Pi;",
+wvY:{
+"^":"af+boh;"},
+S6L:{
+"^":"wvY+Pi;",
 $isd3:true},
 c2:{
 "^":"Pi;Rd<,a4>,x9,AP,fn",
@@ -17601,8 +17649,10 @@
 su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
 $isc2:true},
 vx:{
-"^":"S6L;Gd>,d6,I0,U9,nE,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"vix;Gd>,d6,I0,U9,nE,EG,Ge,wA,y6,FB,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
+gxH:function(){return this.EG},
+sxH:function(a){this.EG=F.Wi(this,C.If,this.EG,a)},
 gUm:function(){return!0},
 gM8:function(){return!0},
 rK:function(a){var z,y
@@ -17612,6 +17662,7 @@
 return y[z]},
 q6:function(a){return this.y6.t(0,a)},
 bF:function(a,b,c){var z,y,x,w
+D.kT(b,J.aT(this.P3))
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -17625,8 +17676,11 @@
 this.bN=this.ct(this,C.YS,this.bN,w)
 w=this.wA
 this.GR=this.ct(this,C.Tc,this.GR,w)
+if(c)return
 this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))},
+this.PT(z.t(b,"tokenPosTable"))
+z=z.t(b,"owning_library")
+this.EG=F.Wi(this,C.If,this.EG,z)},
 PT:function(a){var z,y,x,w,v,u,t,s,r,q,p
 if(a==null)return
 z=this.y6
@@ -17692,10 +17746,10 @@
 for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
 x.su9(y.t(0,x.gRd()))}},
 $isvx:true},
-wvY:{
+Vlh:{
 "^":"af+boh;"},
-S6L:{
-"^":"wvY+Pi;",
+vix:{
+"^":"Vlh+Pi;",
 $isd3:true},
 Db:{
 "^":"a;Yu<,Du<,fF<",
@@ -17709,7 +17763,7 @@
 z=this.LR
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,69],
+return y.bu(z)},"$0","gkA",0,0,71],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -17729,18 +17783,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,69],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,71],
 io:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
 if(J.xC(z.gfF(),z.gDu()))return""
-return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,209,74],
+return D.dJ(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,207,76],
 HU:[function(a){var z
 if(a==null)return""
 z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,209,74],
+return D.dJ(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,207,76],
 eQ:function(){var z,y,x,w
 y=J.It(this.L4," ")
 x=y.length
@@ -17767,7 +17821,7 @@
 static:{dJ:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,69],
+bu:[function(a){return this.uX},"$0","gAY",0,0,71],
 static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
@@ -17783,7 +17837,7 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $isD5:true},
 kx:{
-"^":"D3i;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,vg,Mb,VS,hw,va<,Oo<,mM,qH,JK,MO,ar,MH,oc*,TX@,Mk,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gfY:function(a){return this.I0},
 glt:function(){return this.xM},
 gS7:function(){return this.mM},
@@ -17797,9 +17851,9 @@
 gYG:function(){return this.MH},
 gUm:function(){return!0},
 gM8:function(){return!0},
-tx:[function(a){var z,y
+p7:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,210,211],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,208,209],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -17902,24 +17956,24 @@
 gqy:function(){return J.xC(this.I0,C.l8)},
 $iskx:true,
 static:{RA:function(a,b){return C.CD.Sy(100*J.X9(a,b),2)+"%"}}},
-D3i:{
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.zH(z.MO)
 if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,212,"call"],
+J.SK(y).ml(z.gUH())},"$1",null,2,0,null,210,"call"],
 $isEH:true},
 Cq:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 l8R:{
 "^":"a;uX",
-bu:[function(a){return this.uX},"$0","gAY",0,0,69],
+bu:[function(a){return this.uX},"$0","gAY",0,0,71],
 static:{"^":"Cnk,lTU,FJy,wr",B4:function(a){var z=J.x(a)
 if(z.n(a,"Listening"))return C.Cn
 else if(z.n(a,"Normal"))return C.lT
@@ -17928,7 +17982,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"Pqb;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
+"^":"D3i;V8@,jel,Ue,I0,vu,DB,XK,FH,L7,zw,tO,HO,u8,EC,AP,fn,P3,r0,mQ,kT,bN,GR,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -17941,7 +17995,7 @@
 giP:function(){return this.tO},
 gmd:function(){return this.HO},
 gNS:function(){return this.u8},
-gzK:function(){return this.EC},
+gVI:function(){return this.EC},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
@@ -17974,11 +18028,11 @@
 y=z.t(b,"fd")
 this.zw=F.Wi(this,C.R3,this.zw,y)
 this.V8=z.t(b,"owner")}},
-Pqb:{
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"TpZ:80;a,b",
+"^":"TpZ:79;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -18081,9 +18135,9 @@
 else this.JS.u(0,y,x)
 return z.MM},
 W4X:[function(a){this.CS()
-this.t3()},"$1","gxb",2,0,213,2],
+this.t3()},"$1","gxb",2,0,211,143],
 Wp:[function(a){this.CS()
-this.t3()},"$1","gpU",2,0,20,214],
+this.t3()},"$1","gpU",2,0,19,212],
 MLC:[function(a){var z,y
 z=this.N
 y=Date.now()
@@ -18093,7 +18147,7 @@
 y=this.eG.MM
 if(y.Gv===0){N.QM("").To("WebSocketVM connection opened: "+H.d(z.gw8()))
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(this)}},"$1","gqM",2,0,20,214],
+y.OH(this)}},"$1","gqM",2,0,19,212],
 SS:[function(a){var z,y,x,w,v
 z=C.xr.kV(J.Qd(a))
 if(z==null){N.QM("").YX("WebSocketVM got empty message")
@@ -18107,7 +18161,7 @@
 if(v==null){N.QM("").YX("Received unexpected message: "+H.d(z))
 return}y=v.gmh().MM
 if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(w)},"$1","ga9",2,0,215,2],
+y.OH(w)},"$1","ga9",2,0,213,143],
 z1:function(a){a.aN(0,new U.Fw(this))
 a.V1(0)},
 CS:function(){var z=this.S3
@@ -18125,10 +18179,10 @@
 if(!J.Vr(z.gjO(b),"/profile/tag"))N.QM("").To("GET "+H.d(z.gjO(b))+" from "+H.d(this.N.gw8()))
 this.S3.u(0,a,b)
 y=this.N.gA9()===!0?C.xr.KP(P.EF(["id",H.BU(a,null,null),"method","Dart.observatoryQuery","params",P.EF(["id",a,"query",z.gjO(b)],null,null)],null,null)):C.xr.KP(P.EF(["seq",a,"request",z.gjO(b)],null,null))
-this.bs.send(y)},"$2","gkB",4,0,216],
+this.bs.send(y)},"$2","gkB",4,0,214],
 $isKM:true},
 Fw:{
-"^":"TpZ:217;a",
+"^":"TpZ:215;a",
 $2:function(a,b){var z,y
 z=b.gmh()
 y=C.xr.KP(P.EF(["type","ServiceException","id","","kind","NetworkException","message","WebSocket disconnected"],null,null))
@@ -18150,7 +18204,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,75],
+J.KD(v,w)},"$1","gVx",2,0,19,216],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -18267,7 +18321,7 @@
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
 return z}},
-rm:[function(a,b){var z,y,x
+ws:[function(a,b){var z,y,x
 this.pj(a)
 z=a.Ll
 if(z==null){N.QM("").To("Viewing null object.")
@@ -18275,7 +18329,7 @@
 x=this.Xq(a)
 if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,13,57],
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,12,59],
 $isTi:true,
 static:{Gvt:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
@@ -18302,7 +18356,7 @@
 aV:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
 this.ct(a,C.pu,0,1)
-this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,20,57],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,19,59],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 z=J.Ds(z)
@@ -18315,7 +18369,7 @@
 if(z==null)return"NULL REF"
 return J.O6(z)},
 gWw:function(a){return J.FN(this.goc(a))},
-static:{lKH:function(a){var z,y
+static:{Jv:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -18341,7 +18395,7 @@
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
 RC:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,112,1,218,104],
+a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,111,2,217,103],
 static:{Sm:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -18359,19 +18413,19 @@
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;wq,IW,Mg,nN,ER,Ja,WI,tu",
+"^":"a;c1,BH,Mg,nN,ER,Ja,MR,tu",
 WO:function(a,b){return this.tu.$1(b)},
 bu:[function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.wq?"fields ":"")
-z.KF(this.IW?"properties ":"")
+z.KF(this.c1?"fields ":"")
+z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
 z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
+z.KF("annotations: "+H.d(this.MR))
 z.KF(this.tu!=null?"with matcher":"")
 z.KF(")")
-return z.vM},"$0","gAY",0,0,69]},
+return z.vM},"$0","gAY",0,0,71]},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo<,Dv<",
 gZI:function(){return this.fY===C.nU},
@@ -18389,7 +18443,7 @@
 z.KF(this.Fo?"static ":"")
 z.KF(this.Dv)
 z.KF(")")
-return z.vM},"$0","gAY",0,0,69],
+return z.vM},"$0","gAY",0,0,71],
 $isES:true},
 iYn:{
 "^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
@@ -18416,7 +18470,7 @@
 if(!!J.x(v).$isuq){u=w.gbx(y)
 u=$.mX().dM(u,v)}else u=!1
 if(u)return!0}}return!1},
-Cz:function(a){var z,y
+fy:function(a){var z,y
 z=H.G3()
 y=H.KT(z).BD(a)
 if(y)return 0
@@ -18451,9 +18505,9 @@
 kP:function(){throw H.b(P.FM("The \"smoke\" library has not been configured. Make sure you import and configure one of the implementations (package:smoke/mirrors.dart or package:smoke/static.dart)."))}}],["smoke.static","package:smoke/static.dart",,O,{
 "^":"",
 Oj:{
-"^":"a;h2,AH,ZGj,YKH,Yp,af<,yQ"},
+"^":"a;LH,AH,ZGj,BJ,Yp,af<,yQ"},
 fH:{
-"^":"a;eA,vk,X9",
+"^":"a;eA,vk,Si",
 jD:function(a,b){var z=this.eA.t(0,b)
 if(z==null)throw H.b(O.lA("getter \""+H.d(b)+"\" in "+H.d(a)))
 return z.$1(a)},
@@ -18462,11 +18516,11 @@
 z.$2(a,c)},
 Ck:function(a,b,c,d,e){var z,y,x,w,v,u,t
 z=null
-if(!!J.x(a).$isuq){this.X9.t(0,a)
+if(!!J.x(a).$isuq){this.Si.t(0,a)
 z=null}else{x=this.eA.t(0,b)
 z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
 y=null
-if(d){w=X.Cz(z)
+if(d){w=X.fy(z)
 if(w>3){y="we tried to adjust the arguments for calling \""+H.d(b)+"\", but we couldn't determine the exact number of arguments it expects (it is more than 3)."
 c=X.Na(c,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
 u=v>=0?v:J.q8(c)
@@ -18475,13 +18529,12 @@
 throw t}else throw t}}},
 bY:{
 "^":"a;TB,WF,AZ",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
-x=J.x(y)
-if(x.n(y,b))return!0
+dM:function(a,b){var z,y
+if(a.n(0,b)||b.n(0,C.AP))return!0
+for(z=this.TB;!J.xC(a,C.AP);a=y){y=z.t(0,a)
+if(J.xC(y,b))return!0
 if(y==null){if(!this.AZ)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+H.d(y)+")"))}}return!1},
 UK:function(a,b){var z=this.F1(a,b)
 return z!=null&&z.fY===C.hU&&!z.Fo},
 n6:function(a,b){var z,y
@@ -18498,16 +18551,16 @@
 if(y==null){if(this.AZ)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
 if(x==null){if(!this.AZ)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.wq&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
+if(!c.c1&&v.gZI())continue
+if(!c.BH&&v.gUd())continue
+if(c.ER&&J.dA(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
 if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
+u=c.MR
 if(u!=null&&!X.ZO(v.gDv(),u))continue
 z.push(v)}return z},
 F1:function(a,b){var z,y,x,w,v
-for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+for(z=this.TB,y=this.WF;!J.xC(a,C.AP);a=v){x=y.t(0,a)
 if(x!=null){w=x.t(0,b)
 if(w!=null)return w}v=z.t(0,a)
 if(v==null){if(!this.AZ)return
@@ -18519,12 +18572,12 @@
 z.Ut(a)
 return z}}},
 m8:{
-"^":"TpZ:80;a",
+"^":"TpZ:79;a",
 $2:function(a,b){this.a.Nz.u(0,b,a)},
 $isEH:true},
 tk:{
 "^":"a;GB",
-bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,69],
+bu:[function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},"$0","gAY",0,0,71],
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
@@ -18551,8 +18604,8 @@
 "^":"V51;ju,AP,fn,tB,kR,AP,fn,AP,fn,IX,q9,Cc,Uk,oq,Wz,q1,SD,oG,ZM,ZQ",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,20,99],
-static:{HI:function(a){var z,y
+SK:[function(a,b){J.cI(a.ju).YM(b)},"$1","gvC",2,0,19,98],
+static:{lt2:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
 y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
@@ -18561,8 +18614,8 @@
 a.oG=!1
 a.ZM=z
 a.ZQ=y
-C.uC.ZL(a)
-C.uC.XI(a)
+C.wB.ZL(a)
+C.wB.XI(a)
 return a}}},
 V51:{
 "^":"uL+Pi;",
@@ -18592,7 +18645,7 @@
 z=b.appendChild(J.Ha(c,a,!1))
 for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.S0(y,z,c,x?d.JW(w):null,e,f,g,null)
 if(d.ghK()){M.SB(z).bt(a)
-if(f!=null)J.NA(M.SB(z),f)}M.mV(z,d,e,g)
+if(f!=null)J.vc(M.SB(z),f)}M.mV(z,d,e,g)
 return z},
 tA:function(a){var z
 for(;z=J.TmB(a),z!=null;a=z);return a},
@@ -18611,21 +18664,21 @@
 if(y)return
 a=w.gCi()
 if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
+H4o:function(a,b,c){if(c==null)return
 return new M.hg(a,b,c)},
 pNz:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.j9(a.textContent,M.fX("text",a,b))
+if(!!z.$isbm){y=S.j9(a.textContent,M.H4o("text",a,b))
 if(y!=null)return new M.PW(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
-return S.j9(z,M.fX(b,a,c))},
+return S.j9(z,M.H4o(b,a,c))},
 F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
 y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
+new W.E9(a).aN(0,new M.fE(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
@@ -18636,11 +18689,11 @@
 x=M.rJ(a,"bind",b)
 v.fu=x
 u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.fX("bind",a,b))
+v.zy=u
+if(z!=null&&x==null&&u==null)v.fu=S.j9("{{}}",M.H4o("bind",a,b))
 return v}z=z.a
 return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
+fX:function(a,b,c,d){var z,y,x,w,v,u,t
 if(b.gqz()){z=b.HH(0)
 y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
 return b.gaW()?y:b.qm(y)}x=J.U6(b)
@@ -18658,7 +18711,7 @@
 if(u>=w)return H.e(v,u)
 v[u]=t;++u}return b.qm(v)},
 oO:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.gwD())return M.KH(a,b,c,d)
+if(b.gwD())return M.fX(a,b,c,d)
 if(b.gqz()){z=b.HH(0)
 if(z!=null)y=z.$3(d,c,!1)
 else{x=b.Pn(0)
@@ -18703,16 +18756,16 @@
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isMi)x=new M.L1(a,null,null)
-else if(!!w.$iszk)x=new M.ug(a,null,null)
+else if(!!w.$islpR)x=new M.ug(a,null,null)
 else if(!!w.$isHR)x=new M.VT(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isbm?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
 CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
+if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.lY.x4(0,z.gqn(a))===!0))z=a.tagName==="template"&&z.gKD(a)==="http://www.w3.org/2000/svg"
 else z=!0
 else z=!0
 else z=!1
@@ -18740,13 +18793,13 @@
 z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
 x=new M.BL(z,this,u)
 x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Bz(z,c):c},
+return $.rK?this.Un(z,c):c},
 Dt:[function(a){var z,y,x,w,v,u,t,s
 z=this.grF()
 y=J.RE(z)
 x=y.gBy(z)
 w=J.x(x)
-if(!!w.$iszk){v=J.C5(M.SB(x))
+if(!!w.$islpR){v=J.QE(M.SB(x))
 if(v!=null){u=J.UQ(v,"value")
 if(!!J.x(u).$isb2){t=x.value
 s=u}else{t=null
@@ -18754,15 +18807,15 @@
 s=null}}else{t=null
 s=null}y.sP(z,a==null?"":H.d(a))
 if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
+J.ta(s.gvt(),y)}},"$1","ge2",2,0,19,60]},
 BL:{
-"^":"TpZ:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
+"^":"TpZ:12;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,67,"call"],
 $isEH:true},
 b2:{
-"^":"Yj;rF<,E3,vt<,jS",
-HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
+"^":"OC;rF<,E3,vt<,jS",
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,19,60],
+Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.ta(this.vt,z)
 break
@@ -18771,11 +18824,11 @@
 x=y.gd4(z)
 J.ta(this.vt,x)
 if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.SB(w)),"checked")
+v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.SB(w)),"checked")
 if(v!=null)J.ta(v,!1)}break
 case"selectedIndex":z=J.Lr(this.rF)
 J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
+break}O.N0()},"$1","gCL",2,0,19,2],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.ta(this.vt,b)
@@ -18792,7 +18845,7 @@
 return
 case"value":J.ta(a,b==null?"":H.d(b))
 return}},IPt:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.JF(a,C.i3.Ph,!1),[null])
+if(!!z.$isQlt)return H.VM(new W.mw(a,C.i3.Ph,!1),[null])
 switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
 case"radio":case"select-multiple":case"select-one":return z.gEr(a)
 case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.v4("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
@@ -18803,11 +18856,11 @@
 z=new W.wi(z)
 return z.ad(z,new M.qx(a))}else{y=M.y9(a)
 if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
+x=J.Vj(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
 return x.ad(x,new M.y4(a))}},Fa:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 Raa:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -18824,15 +18877,15 @@
 return x.length===1?C.U3:C.Nm.gTw(x)},
 $isEH:true},
 pp:{
-"^":"TpZ:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;a",
+$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 LfS:{
-"^":"TpZ:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;b",
+$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,2,"call"],
 $isEH:true},
 qx:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -18844,12 +18897,12 @@
 return z},
 $isEH:true},
 y4:{
-"^":"TpZ:13;b",
+"^":"TpZ:12;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 LG:{
-"^":"TpZ:13;",
+"^":"TpZ:12;",
 $1:function(a){return 0},
 $isEH:true},
 L1:{
@@ -18865,7 +18918,7 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return this.Bz(b,y)}},
+return this.Un(b,y)}},
 PW:{
 "^":"a;Cd>,ks>,jb>",
 ghK:function(){return!1},
@@ -18874,7 +18927,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
+"^":"PW;qd,fu,zy,Cd,ks,jb",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
@@ -18887,9 +18940,9 @@
 Vz:function(a){},
 gmSA:function(a){var z=this.Vw
 if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.qb(!!J.x(z).$isvy?z:M.SB(z))}else z=null
+z=J.Zz(!!J.x(z).$isvy?z:M.SB(z))}else z=null
 return z},
-Bz:function(a,b){var z,y
+Un:function(a,b){var z,y
 z=this.Cd
 if(z==null){z=P.Fl(null,null)
 this.Cd=z}y=z.t(0,a)
@@ -18913,9 +18966,9 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return this.Bz(b,y)}},
+return this.Un(b,y)}},
 DT:{
-"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,M5?,le,VZ,q8,rF,Cd,Vw",
+"^":"V2;Cz?,nF,os<,xU,q4?,Bx?,ZV?,le,VZ,q8,rF,Cd,Vw",
 grF:function(){return this.rF},
 nR:function(a,b,c,d){var z
 if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
@@ -18923,10 +18976,10 @@
 J.Vs(this.rF).MW.setAttribute("ref",z)
 this.aX()
 if(d)return
-return this.Bz("ref",c)},
+return this.Un("ref",c)},
 ZZ:function(a){var z=this.os
 if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
+if(a.qd==null&&a.fu==null&&a.zy==null){z=this.os
 if(z!=null){z.xO(0)
 this.os=null}return}z=this.os
 if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
@@ -18940,14 +18993,14 @@
 z=J.NQ(!!J.x(z).$isvy?z:M.SB(z))
 this.q8=z}y=J.RE(z)
 if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.DH():c
+x=c==null?$.HT():c
 w=x.cJ
 if(w==null){w=H.VM(new P.qo(null),[null])
 x.cJ=w}v=w.t(0,z)
 if(v==null){v=M.dg(z,x)
 x.cJ.u(0,z,v)}w=this.le
 if(w==null){u=J.Do(this.rF)
-w=$.tF()
+w=$.we()
 t=w.t(0,u)
 if(t==null){t=u.implementation.createHTMLDocument("")
 $.Ks().u(0,t,!0)
@@ -19013,18 +19066,18 @@
 z=this.Bx
 return z!=null?z:H.Go(this.rF,"$isOH").content},
 bt:function(a){var z,y,x,w,v,u,t
-if(this.M5===!0)return!1
+if(this.ZV===!0)return!1
 M.oR()
 M.hb()
-this.M5=!0
+this.ZV=!0
 z=!!J.x(this.rF).$isOH
 y=!z
 if(y){x=this.rF
 w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.lY.x4(0,w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
 v=M.pZ(this.rF)
 v=!!J.x(v).$isvy?v:M.SB(v)
-v.sM5(!0)
+v.sZV(!0)
 z=!!J.x(v.grF()).$isOH
 u=!0}else{x=this.rF
 w=J.RE(x)
@@ -19037,13 +19090,13 @@
 w.gQg(x).V1(0)
 w.wg(x)
 v=!!J.x(t).$isvy?t:M.SB(t)
-v.sM5(!0)
+v.sZV(!0)
 z=!!J.x(v.grF()).$isOH}else{v=this
 z=!1}u=!1}}else{v=this
 u=!1}if(!z)v.sBx(J.bs(M.TA(v.grF())))
 if(a!=null)v.sq4(a)
 else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
+else M.Af(J.NQ(v))
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
@@ -19070,14 +19123,14 @@
 break}}return y},O1:function(a,b,c){var z,y,x,w
 z=J.NQ(a)
 if(c){J.y2(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},Af:function(a){var z,y
 z=new M.yi()
-y=J.MK(a,$.Ze())
+y=J.Vj(a,$.S1())
 if(M.CF(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.S1())+" { display: none; }")
 document.head.appendChild(z)},hb:function(){var z,y
 if($.xV===!0)return
 $.xV=!0
@@ -19085,29 +19138,29 @@
 if(!!J.x(z).$isOH){y=z.content.ownerDocument
 if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
 if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
+J.dc(z,document.baseURI)
 J.m5(a).appendChild(z)}}},
 pi:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z=this.a
 J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,219,"call"],
+z.aX()},"$1",null,2,0,null,218,"call"],
 $isEH:true},
 yi:{
-"^":"TpZ:20;",
-$1:function(a){if(!M.SB(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
+"^":"TpZ:19;",
+$1:function(a){if(!M.SB(a).bt(null))M.Af(J.NQ(!!J.x(a).$isvy?a:M.SB(a)))},
 $isEH:true},
 YJG:{
-"^":"TpZ:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,131,"call"],
+"^":"TpZ:12;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,130,"call"],
 $isEH:true},
 lPa:{
-"^":"TpZ:80;",
+"^":"TpZ:79;",
 $2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,173,14,"call"],
+for(z=J.mY(a);z.G();)M.SB(J.l2(z.gl())).aX()},"$2",null,4,0,null,172,13,"call"],
 $isEH:true},
 Ufa:{
-"^":"TpZ:72;",
+"^":"TpZ:74;",
 $0:function(){var z=document.createDocumentFragment()
 $.vH().u(0,z,new M.Fi([],null,null,null))
 return z},
@@ -19115,17 +19168,17 @@
 Fi:{
 "^":"a;u2<,Qo<,Ci<,C0<"},
 hg:{
-"^":"TpZ:13;a,b,c",
+"^":"TpZ:12;a,b,c",
 $1:function(a){return this.c.US(a,this.a,this.b)},
 $isEH:true},
-Uk:{
-"^":"TpZ:80;a,b,c,d",
+fE:{
+"^":"TpZ:79;a,b,c,d",
 $2:function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.xC(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)z=z.n(a,"bind")||z.n(a,"if")||z.n(a,"repeat")
 else z=!1
 if(z)return
-y=S.j9(b,M.fX(a,this.b,this.c))
+y=S.j9(b,M.H4o(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
@@ -19135,17 +19188,17 @@
 z.push(y)}},
 $isEH:true},
 aY:{
-"^":"Yj;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
+"^":"OC;YS,Rj,vy,S6,ky,vL,wC,D2,ts,qe,ur,VC,Wv,eY,TC",
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.wC},
 NC:function(){var z,y
 z=this.vL
 y=J.x(z)
-if(!!y.$isYj){y.xO(z)
+if(!!y.$isOC){y.xO(z)
 this.vL=null}z=this.wC
 y=J.x(z)
-if(!!y.$isYj){y.xO(z)
+if(!!y.$isOC){y.xO(z)
 this.wC=null}},
 dE:function(a,b){var z,y,x
 this.NC()
@@ -19153,12 +19206,12 @@
 y=a.qd
 x=y!=null
 this.D2=x
-this.ts=a.cw!=null
+this.ts=a.zy!=null
 if(x){this.qe=y.wD
 y=M.oO("if",y,z,b)
 this.vL=y
 if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isYj").TR(0,this.gNt())}if(this.ts===!0){y=a.cw
+return}}else H.Go(y,"$isOC").TR(0,this.gNt())}if(this.ts===!0){y=a.zy
 this.ur=y.wD
 y=M.oO("repeat",y,z,b)
 this.wC=y}else{y=a.fu
@@ -19168,11 +19221,11 @@
 this.vr(null)},
 vr:[function(a){var z,y
 if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isYj")
+if(this.qe!==!0){H.Go(z,"$isOC")
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isYj")
-y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,20,14],
+if(this.ur!==!0){H.Go(y,"$isOC")
+y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","gNt",2,0,19,13],
 Io:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
@@ -19230,7 +19283,7 @@
 if(y==null)x=$.zl()
 else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
 w=l
-v=new H.XO(g,null)
+v=new H.oP(g,null)
 l=new P.Gc(0,$.X3,null,null,null,null,null,null)
 l.$builtinTypeInfo=[null]
 new P.Zf(l).$builtinTypeInfo=[null]
@@ -19242,7 +19295,7 @@
 f=this.xS(h-1)
 e=J.TmB(u.rF)
 C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,220,221],
+e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Oq(u,0),H.Oq(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,219,220],
 Ep:[function(a){var z,y,x
 z=$.vH()
 z.toString
@@ -19250,7 +19303,7 @@
 x=(y==null?null:H.of(y,z.J4())).gu2()
 z=new H.a7(x,x.length,0,null)
 z.$builtinTypeInfo=[H.Oq(x,0)]
-for(;z.G();)J.yd(z.lo)},"$1","gMR",2,0,222],
+for(;z.G();)J.yd(z.lo)},"$1","gV6",2,0,221],
 Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
@@ -19259,7 +19312,7 @@
 if(this.ky)return
 this.Ke()
 z=this.Rj
-H.bQ(z,this.gMR())
+H.bQ(z,this.gV6())
 C.Nm.sB(z,0)
 this.NC()
 this.YS.os=null
@@ -19272,9 +19325,9 @@
 J.t3(this.rF,z)
 return}z=this.gmt()
 z.$1(J.mu(c,z))
-return $.rK?this.Bz(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
+return $.rK?this.Un(b,c):c},
+lrv:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.rF,z)},"$1","gmt",2,0,12,20]},
 VT:{
 "^":"V2;rF,Cd,Vw",
 grF:function(){return this.rF},
@@ -19287,7 +19340,7 @@
 y.E3=M.IPt(z).yI(y.gCL())
 x=y.ghZ()
 M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Bz(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
+return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
 "^":"",
 jb:{
 "^":"a;iB,wD<,UV",
@@ -19325,7 +19378,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,223,21],
+return y+H.d(z[w])},"$1","geb",2,0,222,20],
 Xb:[function(a){var z,y,x,w,v,u,t,s
 z=this.iB
 if(0>=z.length)return H.e(z,0)
@@ -19336,7 +19389,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,224,225],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,223,224],
 l3:function(a,b){this.UV=this.iB.length===5?this.geb():this.gqt()},
 static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",j9:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -19387,7 +19440,7 @@
 y=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),y,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 y.Lw()
 z.swv(0,y)}w=J.Vs(d).MW.getAttribute("href")
-$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,163,2,103,176],
+$.Kh.Z6.bo(0,w)},"$3","gkD",6,0,162,143,102,175],
 MeB:[function(a,b,c,d){var z,y,x,w
 z=$.Kh.m2
 y=a.P5
@@ -19396,7 +19449,7 @@
 z.XT()
 z.XT()
 w=z.wu.IU+".history"
-$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,163,2,103,176],
+$.Vy().setItem(w,C.xr.KP(x))},"$3","gAS",6,0,162,143,102,175],
 static:{fXx:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19431,9 +19484,9 @@
 x=new U.KM(H.VM(new P.Zf(P.Dt(null)),[null]),H.VM(new P.Zf(P.Dt(null)),[null]),d,P.L5(null,null,null,P.qU,U.U2),P.L5(null,null,null,P.qU,U.U2),0,null,"unknown","unknown",0,!1,!1,"",null,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 x.Lw()
 y.swv(0,x)
-$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,112,1,103,104],
+$.Kh.Z6.bo(0,"#/vm")},"$3","gMt",6,0,111,2,102,103],
 qf:[function(a,b,c,d){J.Kr(b)
-this.Vf(a)},"$3","gzG",6,0,112,1,103,104],
+this.Vf(a)},"$3","gzG",6,0,111,2,102,103],
 Vf:function(a){G.FI(a.YE).ml(new V.Vn(a)).OA(new V.oU(a))},
 Kq:function(a){var z=P.ii(0,0,0,0,0,1)
 a.tB=this.ct(a,C.O9,a.tB,z)},
@@ -19450,15 +19503,15 @@
 a.oG=!1
 a.ZM=y
 a.ZQ=x
-C.hj.ZL(a)
-C.hj.XI(a)
-C.hj.Kq(a)
+C.aXh.ZL(a)
+C.aXh.XI(a)
+C.aXh.Kq(a)
 return a}}},
 V53:{
 "^":"uL+Pi;",
 $isd3:true},
 Vn:{
-"^":"TpZ:13;a",
+"^":"TpZ:12;a",
 $1:[function(a){var z,y,x,w
 z=this.a
 J.Z8(z.lr)
@@ -19469,11 +19522,11 @@
 if(typeof w!=="number")return H.s(w)
 if(!(x<w))break
 c$0:{if(y.t(a,x).gw8()==null)break c$0
-J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,226,"call"],
+J.bi(z.lr,y.t(a,x))}++x}},"$1",null,2,0,null,225,"call"],
 $isEH:true},
 oU:{
-"^":"TpZ:13;b",
-$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,1,"call"],
+"^":"TpZ:12;b",
+$1:[function(a){J.Z8(this.b.lr)},"$1",null,2,0,null,2,"call"],
 $isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
@@ -19498,7 +19551,7 @@
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,20,99],
+SK:[function(a,b){J.cI(a.uB).YM(b)},"$1","gvC",2,0,19,98],
 static:{oH:function(a){var z,y
 z=P.L5(null,null,null,P.qU,W.I0)
 y=P.qU
@@ -19516,230 +19569,313 @@
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-W.QI.$isa=true
-P.FK.$isRz=true
-P.FK.$asRz=[P.FK]
-P.FK.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$isIp=true
-U.mc.$isa=true
-U.cJ.$isIp=true
-U.cJ.$isa=true
-U.uku.$isIp=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$isIp=true
-U.fp.$isa=true
-U.ae.$isIp=true
-U.ae.$isa=true
-U.Mm.$isIp=true
-U.Mm.$isa=true
-U.c0.$isIp=true
-U.c0.$isa=true
-U.no.$isIp=true
-U.no.$isa=true
-U.Nb.$isIp=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$isIp=true
-U.zX.$isa=true
-U.rX.$isIp=true
-U.rX.$isa=true
-U.EO.$isEO=true
-U.EO.$isIp=true
-U.EO.$isa=true
-P.IN.$isIN=true
-P.IN.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.TJ.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-U.U2.$isU2=true
-U.U2.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.Kp.$isaf=true
-D.Kp.$isa=true
-D.Q4.$isa=true
-D.Db.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-D.Z9.$isa=true
-W.BI.$isBI=true
-W.BI.$isea=true
-W.BI.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-W.Hy.$isHy=true
-W.Hy.$isea=true
-W.Hy.$isa=true
-P.xu.$isQV=true
-P.xu.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-W.fJ.$isa=true
-W.ew7.$isea=true
-W.ew7.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.D5.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-G.OS.$isa=true
-D.Mk.$isaf=true
-D.Mk.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-P.A5.$isa=true
-W.PG.$isea=true
-W.PG.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$ishsw=true
-W.I0.$isKV=true
-W.I0.$isa=true
-P.wS.$iswS=true
-P.wS.$isa=true
-P.yX.$isyX=true
-P.yX.$isa=true
-Y.qS.$isa=true
-U.Ip.$isIp=true
-U.Ip.$isa=true
-U.Z5.$isZ5=true
-U.Z5.$isa=true
-G.Ni.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.BpP.$isBpP=true
-P.BpP.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isyX=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isyX=true
-P.LR.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.aYy.$isaYy=true
-P.aYy.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.Xa.$isXa=true
-P.Xa.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-A.Yj.$isYj=true
-A.Yj.$isa=true
-D.wv.$iswv=true
-D.wv.$isaf=true
-D.wv.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.AR.$isAR=true
-L.AR.$isYj=true
-L.AR.$isa=true
-W.hsw.$ishsw=true
-W.hsw.$isKV=true
-W.hsw.$isa=true
+;(function(){var z=!0,y
+y=P.KN
+y.$isKN=z
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=P.CP
+y.$isCP=z
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=W.KV
+y.$isKV=z
+y.$isa=z
+W.vKL.$isa=z
+y=P.qU
+y.$isqU=z
+y.$isRz=z
+y.$asRz=[P.qU]
+y.$isa=z
+W.QI.$isa=z
+y=P.FK
+y.$isFK=z
+y.$isRz=z
+y.$asRz=[P.FK]
+y.$isa=z
+y=N.qV
+y.$isRz=z
+y.$asRz=[N.qV]
+y.$isa=z
+y=P.a6
+y.$isa6=z
+y.$isRz=z
+y.$asRz=[P.a6]
+y.$isa=z
+y=W.h4
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+P.oz.$isa=z
+P.a.$isa=z
+y=P.WO
+y.$isWO=z
+y.$isQV=z
+y.$isa=z
+P.ns.$isa=z
+y=K.Aep
+y.$isAep=z
+y.$isa=z
+y=U.Dc
+y.$isIp=z
+y.$isa=z
+y=U.cJ
+y.$isIp=z
+y.$isa=z
+y=U.uku
+y.$isIp=z
+y.$isa=z
+y=U.fp
+y.$isfp=z
+y.$isIp=z
+y.$isa=z
+y=U.ae
+y.$isIp=z
+y.$isa=z
+y=U.Mm
+y.$isIp=z
+y.$isa=z
+y=U.c0
+y.$isIp=z
+y.$isa=z
+y=U.no
+y.$isIp=z
+y.$isa=z
+y=U.Nb
+y.$isIp=z
+y.$isa=z
+y=U.zX
+y.$iszX=z
+y.$isIp=z
+y.$isa=z
+y=U.rX
+y.$isIp=z
+y.$isa=z
+y=U.WH
+y.$isWH=z
+y.$isIp=z
+y.$isa=z
+y=P.IN
+y.$isIN=z
+y.$isa=z
+y=P.uq
+y.$isuq=z
+y.$isa=z
+N.TJ.$isa=z
+y=T.yj
+y.$isyj=z
+y.$isa=z
+y=W.tV
+y.$ish4=z
+y.$isKV=z
+y.$isa=z
+y=U.U2
+y.$isU2=z
+y.$isa=z
+y=D.af
+y.$isaf=z
+y.$isa=z
+y=D.bv
+y.$isaf=z
+y.$isa=z
+D.Fc.$isa=z
+D.ER.$isa=z
+y=D.dy
+y.$isdy=z
+y.$isaf=z
+y.$isa=z
+y=D.vO
+y.$isvO=z
+y.$isaf=z
+y.$isqC=z
+y.$asqC=[null,null]
+y.$isZ0=z
+y.$asZ0=[null,null]
+y.$isa=z
+y=D.Kp
+y.$isaf=z
+y.$isa=z
+D.Q4.$isa=z
+D.Db.$isa=z
+y=D.U4
+y.$isaf=z
+y.$isa=z
+y=D.vx
+y.$isvx=z
+y.$isaf=z
+y.$isa=z
+D.c2.$isa=z
+y=G.DA
+y.$isDA=z
+y.$isa=z
+D.Z9.$isa=z
+y=W.BI
+y.$isBI=z
+y.$isea=z
+y.$isa=z
+y=W.ea
+y.$isea=z
+y.$isa=z
+y=W.Hy
+y.$isHy=z
+y.$isea=z
+y.$isa=z
+y=P.xu
+y.$isQV=z
+y.$isa=z
+y=P.a2
+y.$isa2=z
+y.$isa=z
+W.fJ.$isa=z
+y=W.ew7
+y.$isea=z
+y.$isa=z
+y=G.Y2
+y.$isY2=z
+y.$isa=z
+y=D.kx
+y.$iskx=z
+y.$isaf=z
+y.$isa=z
+D.D5.$isa=z
+F.d3.$isa=z
+A.XP.$isa=z
+y=W.AjY
+y.$isAjY=z
+y.$isea=z
+y.$isa=z
+G.OS.$isa=z
+y=D.Mk
+y.$isaf=z
+y.$isa=z
+y=W.f5
+y.$isf5=z
+y.$isea=z
+y.$isa=z
+P.A5.$isa=z
+y=W.PGY
+y.$isea=z
+y.$isa=z
+y=L.Tv
+y.$isTv=z
+y.$isa=z
+K.GK.$isa=z
+y=N.HV
+y.$isHV=z
+y.$isa=z
+H.yo.$isa=z
+H.IY.$isa=z
+H.aX.$isa=z
+y=W.I0
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z
+y=P.wS
+y.$iswS=z
+y.$isa=z
+y=P.yX
+y.$isyX=z
+y.$isa=z
+Y.qS.$isa=z
+y=U.Ip
+y.$isIp=z
+y.$isa=z
+y=U.Z5
+y.$isZ5=z
+y.$isa=z
+G.Ni.$isa=z
+y=V.qC
+y.$isqC=z
+y.$isZ0=z
+y.$isa=z
+y=P.BpP
+y.$isBpP=z
+y.$isa=z
+y=P.KA
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.LR
+y.$isLR=z
+y.$isKA=z
+y.$isNOT=z
+y.$isyX=z
+y.$isa=z
+y=P.e4y
+y.$ise4y=z
+y.$isa=z
+y=P.dl
+y.$isdl=z
+y.$isa=z
+y=P.Rz
+y.$isRz=z
+y.$isa=z
+y=P.n7
+y.$isn7=z
+y.$isa=z
+y=P.Z0
+y.$isZ0=z
+y.$isa=z
+y=P.Xa
+y.$isXa=z
+y.$isa=z
+y=P.QV
+y.$isQV=z
+y.$isa=z
+y=P.EH
+y.$isEH=z
+y.$isa=z
+y=P.b8
+y.$isb8=z
+y.$isa=z
+y=P.NOT
+y.$isNOT=z
+y.$isa=z
+y=P.ti
+y.$isti=z
+y.$isa=z
+y=P.iP
+y.$isiP=z
+y.$isRz=z
+y.$asRz=[null]
+y.$isa=z
+y=O.Hz
+y.$isHz=z
+y.$isa=z
+y=A.OC
+y.$isOC=z
+y.$isa=z
+y=D.wv
+y.$iswv=z
+y.$isaf=z
+y.$isa=z
+y=D.N7
+y.$isN7=z
+y.$isaf=z
+y.$isa=z
+y=D.EP
+y.$isEP=z
+y.$isaf=z
+y.$isa=z
+y=A.ES
+y.$isES=z
+y.$isa=z
+y=A.Wq
+y.$isWq=z
+y.$isa=z
+y=L.AR
+y.$isAR=z
+y.$isOC=z
+y.$isa=z
+y=W.hsw
+y.$ishsw=z
+y.$isKV=z
+y.$isa=z})()
 J.Qc=function(a){if(typeof a=="number")return J.P.prototype
 if(typeof a=="string")return J.O.prototype
 if(a==null)return a
@@ -19748,13 +19884,13 @@
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.U6=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.Wx=function(a){if(typeof a=="number")return J.P.prototype
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
@@ -19767,7 +19903,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.Xh.prototype
 return J.VA.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.CDU.prototype
@@ -19775,7 +19911,7 @@
 if(a.constructor==Array)return J.Q.prototype
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.m0(a)}
+return J.aN(a)}
 J.A1=function(a,b){return J.RE(a).seT(a,b)}
 J.A4=function(a,b){return J.RE(a).sjx(a,b)}
 J.A6=function(a){return J.RE(a).gG3(a)}
@@ -19795,12 +19931,13 @@
 return J.Wx(a).E(a,b)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
 J.C8=function(a){return J.RE(a).gSO(a)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
 J.CN=function(a){return J.RE(a).gd0(a)}
+J.Cg=function(a){return J.RE(a).goL(a)}
 J.Cl=function(a,b){return J.Wx(a).Z(a,b)}
 J.Cm=function(a){return J.RE(a).gvC(a)}
+J.Cr=function(a){return J.RE(a).gEQ(a)}
 J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
 J.DB=function(a){return J.RE(a).gn0(a)}
 J.DF=function(a,b){return J.RE(a).soc(a,b)}
@@ -19839,6 +19976,7 @@
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.IA=function(a){return J.RE(a).gjT(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IP=function(a){return J.RE(a).gSs(a)}
 J.IR=function(a){return J.RE(a).gYt(a)}
@@ -19854,7 +19992,6 @@
 J.JR=function(a){return J.RE(a).gcK(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
 J.Jj=function(a){return J.RE(a).gWA(a)}
-J.Jk=function(a){return J.x(a).gbx(a)}
 J.Jl=function(a,b){return J.RE(a).sML(a,b)}
 J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a){return J.RE(a).gGV(a)}
@@ -19866,28 +20003,29 @@
 J.Kl=function(a){return J.RE(a).gBP(a)}
 J.Kr=function(a){return J.RE(a).e6(a)}
 J.Ky=function(a){return J.RE(a).gRk(a)}
+J.L6=function(a){return J.RE(a).glD(a)}
 J.L9=function(a,b){return J.RE(a).sdU(a,b)}
+J.LB=function(a){return J.RE(a).gX0(a)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
 J.LM=function(a,b){return J.RE(a).szj(a,b)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a){return J.RE(a).gff(a)}
+J.Lm=function(a){return J.x(a).gbx(a)}
 J.Ln=function(a){return J.RE(a).gdU(a)}
 J.Lp=function(a){return J.RE(a).geT(a)}
 J.Lr=function(a){return J.RE(a).gMj(a)}
 J.MB=function(a){return J.RE(a).gzG(a)}
 J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MU=function(a,b){return J.RE(a).Fc(a,b)}
 J.MX=function(a,b){return J.RE(a).sPj(a,b)}
 J.Me=function(a,b){return J.w1(a).aN(a,b)}
 J.Mh=function(a){return J.RE(a).gMt(a)}
+J.Mo=function(a){return J.RE(a).gx6(a)}
 J.Mp=function(a){return J.w1(a).wg(a)}
 J.Mx=function(a){return J.RE(a).gks(a)}
 J.Mz=function(a){return J.RE(a).goE(a)}
 J.N1=function(a){return J.RE(a).Es(a)}
-J.NA=function(a,b){return J.RE(a).sG5(a,b)}
 J.NB=function(a){return J.RE(a).gHo(a)}
 J.NC=function(a){return J.RE(a).gHy(a)}
 J.NE=function(a,b){return J.RE(a).sHL(a,b)}
@@ -19901,16 +20039,13 @@
 J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.Nq=function(a){return J.RE(a).gGc(a)}
 J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
 J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P3=function(a){return J.RE(a).goL(a)}
 J.P4=function(a){return J.RE(a).gVr(a)}
-J.PB=function(a){return J.RE(a).gBV(a)}
 J.PN=function(a,b){return J.RE(a).sCI(a,b)}
 J.PP=function(a,b){return J.RE(a).snv(a,b)}
 J.PY=function(a){return J.RE(a).goN(a)}
@@ -19922,6 +20057,7 @@
 J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
 J.Q9=function(a){return J.RE(a).gf0(a)}
 J.QD=function(a,b){return J.RE(a).sM3(a,b)}
+J.QE=function(a){return J.RE(a).gCd(a)}
 J.QP=function(a){return J.RE(a).gWq(a)}
 J.QT=function(a,b){return J.RE(a).vV(a,b)}
 J.Qa=function(a){return J.RE(a).gNN(a)}
@@ -19955,8 +20091,7 @@
 J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a){return J.RE(a).gfG(a)}
 J.Tx=function(a,b){return J.RE(a).spf(a,b)}
-J.U8=function(a){return J.RE(a).gEQ(a)}
-J.U8o=function(a){return J.RE(a).gUQ(a)}
+J.U8=function(a){return J.RE(a).gUQ(a)}
 J.UA=function(a){return J.RE(a).gP2(a)}
 J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
 return J.Wx(a).w(a,b)}
@@ -19965,7 +20100,6 @@
 return J.U6(a).t(a,b)}
 J.US=function(a){return J.RE(a).gWt(a)}
 J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(a)}
 J.Uf=function(a){return J.RE(a).gDD(a)}
 J.Uv=function(a,b){return J.RE(a).WO(a,b)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
@@ -19973,6 +20107,7 @@
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.Vf=function(a){return J.RE(a).gVE(a)}
+J.Vj=function(a,b){return J.RE(a).Md(a,b)}
 J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vr=function(a,b){return J.rY(a).C1(a,b)}
@@ -19997,7 +20132,6 @@
 J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gph(a)}
 J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
 J.Z8=function(a){return J.w1(a).V1(a)}
 J.ZF=function(a){return J.RE(a).gAF(a)}
 J.ZH=function(a){return J.RE(a).gk8(a)}
@@ -20009,6 +20143,7 @@
 J.Zq=function(a){return J.RE(a).glp(a)}
 J.Zs=function(a){return J.RE(a).gcY(a)}
 J.Zv=function(a){return J.RE(a).grs(a)}
+J.Zz=function(a){return J.RE(a).gmSA(a)}
 J.a3=function(a){return J.RE(a).gBk(a)}
 J.aA=function(a){return J.RE(a).gzY(a)}
 J.aB=function(a){return J.RE(a).gql(a)}
@@ -20036,8 +20171,10 @@
 J.cs=function(a){return J.RE(a).gwJ(a)}
 J.d5=function(a){return J.Wx(a).gKy(a)}
 J.d7=function(a){return J.RE(a).giG(a)}
+J.dA=function(a){return J.RE(a).gV5(a)}
 J.dF=function(a){return J.w1(a).zH(a)}
 J.dY=function(a){return J.RE(a).ga4(a)}
+J.dc=function(a,b){return J.RE(a).smH(a,b)}
 J.de=function(a){return J.RE(a).gGd(a)}
 J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
@@ -20056,9 +20193,8 @@
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fi=function(a){return J.RE(a).gX0(a)}
+J.fi=function(a,b){return J.RE(a).ps(a,b)}
 J.fx=function(a){return J.RE(a).gG5(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
 J.h6=function(a){return J.RE(a).gML(a)}
 J.h9=function(a,b){return J.RE(a).sWA(a,b)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
@@ -20071,16 +20207,17 @@
 J.iL=function(a){return J.RE(a).gNb(a)}
 J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
+J.iY=function(a){return J.RE(a).gvc(a)}
 J.id=function(a){return J.RE(a).gR1(a)}
 J.ih=function(a){return J.RE(a).ga5(a)}
 J.io=function(a){return J.RE(a).gja(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
 J.ix=function(a){return J.RE(a).gnI(a)}
+J.iy=function(a){return J.RE(a).gV2(a)}
 J.j0=function(a){return J.RE(a).gO0(a)}
 J.j1=function(a){return J.RE(a).gZA(a)}
 J.jB=function(a){return J.RE(a).gpf(a)}
 J.jC=function(a){return J.RE(a).gSR(a)}
+J.jL=function(a){return J.RE(a).gBV(a)}
 J.jO=function(a){return J.RE(a).gkD(a)}
 J.jd=function(a,b){return J.RE(a).snZ(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
@@ -20096,7 +20233,6 @@
 return J.w1(a).u(a,b,c)}
 J.kX=function(a,b){return J.RE(a).sNb(a,b)}
 J.kZ=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
-J.ki=function(a){return J.RE(a).gqK(a)}
 J.kl=function(a,b){return J.w1(a).ez(a,b)}
 J.ks=function(a){return J.RE(a).gB1(a)}
 J.kv=function(a){return J.RE(a).gDf(a)}
@@ -20130,6 +20266,7 @@
 J.oD=function(a,b){return J.RE(a).hP(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.ogJ=function(a,b){return J.RE(a).sIt(a,b)}
 J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.op=function(a){return J.RE(a).gD7(a)}
@@ -20144,12 +20281,10 @@
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
 J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qb=function(a){return J.RE(a).gmSA(a)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
 J.ql=function(a){return J.RE(a).gaB(a)}
 J.qq=function(a){return J.RE(a).dQ(a)}
+J.qv=function(a){return J.RE(a).pj(a)}
 J.r0=function(a){return J.RE(a).gi6(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
 J.rA=function(a,b){return J.w1(a).Nk(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
@@ -20169,7 +20304,6 @@
 J.u1=function(a,b){return J.Wx(a).WZ(a,b)}
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
-J.uG=function(a,b){return J.w1(a).zV(a,b)}
 J.uH=function(a,b){return J.RE(a).sP2(a,b)}
 J.uM=function(a,b){return J.RE(a).sod(a,b)}
 J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
@@ -20184,7 +20318,9 @@
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
+J.vc=function(a,b){return J.RE(a).sG5(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
+J.w4=function(a,b){return J.RE(a).x4(a,b)}
 J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
@@ -20207,6 +20343,7 @@
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xe=function(a){return J.RE(a).gPB(a)}
 J.xo=function(a){return J.RE(a).gJN(a)}
+J.xp=function(a,b){return J.w1(a).zV(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.yH=function(a){return J.Wx(a).Vy(a)}
 J.yI=function(a){return J.RE(a).gLf(a)}
@@ -20226,6 +20363,7 @@
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zg=function(a,b){return J.w1(a).ad(a,b)}
 J.zj=function(a){return J.RE(a).gvH(a)}
+J.zk=function(a){return J.RE(a).gZm(a)}
 C.Df=X.hV.prototype
 C.Gkp=Y.q6.prototype
 C.Mw=B.G6.prototype
@@ -20244,7 +20382,7 @@
 C.ls6=X.MJ.prototype
 C.MO0=X.J3.prototype
 C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
+C.p0=N.BS.prototype
 C.Cs=O.Vb.prototype
 C.Vc=K.Ly.prototype
 C.W3=W.fJ.prototype
@@ -20254,15 +20392,15 @@
 C.Ig=E.DE.prototype
 C.x4=E.U1.prototype
 C.lX=E.qM.prototype
-C.OkI=E.av.prototype
+C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
+C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.Tl=E.oF.prototype
 C.wK=E.qh.prototype
-C.to=E.Q6.prototype
+C.rU=E.Q6.prototype
 C.wd=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Rr=E.uE.prototype
@@ -20270,11 +20408,11 @@
 C.hM=B.pR.prototype
 C.yKx=Z.hx.prototype
 C.aXP=D.Z4.prototype
-C.Vi=D.Qh.prototype
+C.rCJ=D.Qh.prototype
 C.RRl=A.fl.prototype
 C.kS=X.kK.prototype
 C.LN=N.oa.prototype
-C.F2=D.IW.prototype
+C.lk8=D.IW.prototype
 C.Ji=D.Oz.prototype
 C.OoF=D.St.prototype
 C.Xe=L.qk.prototype
@@ -20297,13 +20435,13 @@
 C.Mn=A.NK.prototype
 C.L8=A.Zx.prototype
 C.Y6=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.t5=W.yk.prototype
+C.YpE=V.F1.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iCW.prototype
 C.Ki=A.xc.prototype
 C.za=T.ov.prototype
-C.Wa=A.kn.prototype
+C.Yj=A.kn.prototype
 C.cJ0=U.fI.prototype
 C.U0=R.zM.prototype
 C.Vd=D.Rk.prototype
@@ -20311,16 +20449,16 @@
 C.HRc=Q.xI.prototype
 C.zb=Q.CY.prototype
 C.dX=K.nm.prototype
-C.uC=X.uw.prototype
-C.OKl=A.G1.prototype
+C.wB=X.uw.prototype
+C.lx=A.G1.prototype
 C.vB=J.kdQ.prototype
-C.hj=V.D2.prototype
+C.aXh=V.D2.prototype
 C.J57=V.Pa.prototype
 C.vA=X.I5.prototype
 C.dm=U.el.prototype
 C.ol=W.K5.prototype
 C.KZ=new H.hJ()
-C.OL=new U.EO()
+C.OL=new U.WH()
 C.MS=new H.FuS()
 C.Eq=new P.qn()
 C.qY=new T.yy()
@@ -20328,7 +20466,6 @@
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.v8=new P.AHi()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
@@ -20350,8 +20487,8 @@
 C.Jny=H.IL('U4')
 C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
 C.Zg=new H.tx("args")
-C.SXK=H.IL('qC')
-C.b7=new A.ES(C.Zg,C.BM,!1,C.SXK,!1,C.ucP)
+C.UZ=H.IL('qC')
+C.b7=new A.ES(C.Zg,C.BM,!1,C.UZ,!1,C.ucP)
 C.SR=new H.tx("map")
 C.MR1=H.IL('vO')
 C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
@@ -20494,7 +20631,7 @@
 C.XM=new H.tx("path")
 C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
 C.bJ=new H.tx("counters")
-C.UI=new A.ES(C.bJ,C.BM,!1,C.SXK,!1,C.ucP)
+C.UI=new A.ES(C.bJ,C.BM,!1,C.UZ,!1,C.ucP)
 C.bE=new H.tx("sampleDepth")
 C.h3=new A.ES(C.bE,C.BM,!1,C.Gh,!1,C.esx)
 C.Ys=new H.tx("pad")
@@ -20502,8 +20639,8 @@
 C.N8=new H.tx("scriptChanged")
 C.qE=new A.ES(C.N8,C.hU,!1,C.yQP,!1,C.dn)
 C.YT=new H.tx("expr")
-C.eP=H.IL('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
+C.wG=H.IL('dynamic')
+C.LC=new A.ES(C.YT,C.BM,!1,C.wG,!1,C.ucP)
 C.yB=new H.tx("instances")
 C.vZ=new A.ES(C.yB,C.BM,!1,C.MR1,!1,C.esx)
 C.xS=new H.tx("tagSelectorChanged")
@@ -20543,9 +20680,9 @@
 C.Gj=new A.ES(C.TN,C.BM,!1,C.Gh,!1,C.esx)
 C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
 C.OO=new H.tx("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.SXK,!1,C.ucP)
+C.Cf=new A.ES(C.OO,C.BM,!1,C.UZ,!1,C.ucP)
 C.O9=new H.tx("pollPeriod")
-C.q9=new A.ES(C.O9,C.BM,!1,C.eP,!1,C.esx)
+C.q9=new A.ES(C.O9,C.BM,!1,C.wG,!1,C.esx)
 C.uk=new H.tx("last")
 C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
 C.am=new H.tx("chromeTargets")
@@ -20561,7 +20698,7 @@
 C.fn=new H.tx("instance")
 C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
 C.rE=new H.tx("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.SXK,!1,C.ucP)
+C.KS=new A.ES(C.rE,C.BM,!1,C.UZ,!1,C.ucP)
 C.cg=new H.tx("anchor")
 C.ll=new A.ES(C.cg,C.BM,!1,C.Gh,!1,C.ucP)
 C.ngm=I.uL([C.J19])
@@ -20574,14 +20711,14 @@
 C.TO=new A.ES(C.kY,C.BM,!1,C.SmN,!1,C.ucP)
 C.oqo=H.IL('pD')
 C.Ul=new A.ES(C.yh,C.BM,!1,C.oqo,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
+C.Qp=new A.ES(C.AV,C.BM,!1,C.wG,!1,C.ucP)
 C.vb=new H.tx("profile")
 C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
 C.T1=H.VM(new W.FkO("click"),[W.AjY])
 C.i6=H.VM(new W.FkO("close"),[W.BI])
-C.iw=H.VM(new W.FkO("disconnect"),[W.PG])
+C.iw=H.VM(new W.FkO("disconnect"),[W.PGY])
 C.JN=H.VM(new W.FkO("error"),[W.ew7])
 C.MD=H.VM(new W.FkO("error"),[W.ea])
 C.i3=H.VM(new W.FkO("input"),[W.ea])
@@ -20642,39 +20779,6 @@
     hooks.getTag = getTagFallback;
   };
 }
-C.MA=function() {
-  function typeNameInChrome(o) {
-    var name = o.constructor.name;
-    if (name) return name;
-    var s = Object.prototype.toString.call(o);
-    return s.substring(8, s.length - 1);
-  }
-  function getUnknownTag(object, tag) {
-    if (/^HTML[A-Z].*Element$/.test(tag)) {
-      var name = Object.prototype.toString.call(object);
-      if (name == "[object Object]") return null;
-      return "HTMLElement";
-    }
-  }
-  function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
-    return getUnknownTag(object, tag);
-  }
-  function prototypeForTag(tag) {
-    if (typeof window == "undefined") return null;
-    if (typeof window[tag] == "undefined") return null;
-    var constructor = window[tag];
-    if (typeof constructor != "function") return null;
-    return constructor.prototype;
-  }
-  function discriminator(tag) { return null; }
-  var isBrowser = typeof navigator == "object";
-  return {
-    getTag: typeNameInChrome,
-    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
-    prototypeForTag: prototypeForTag,
-    discriminator: discriminator };
-}
 C.M1=function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
@@ -20704,6 +20808,39 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
+C.GM=function() {
+  function typeNameInChrome(o) {
+    var name = o.constructor.name;
+    if (name) return name;
+    var s = Object.prototype.toString.call(o);
+    return s.substring(8, s.length - 1);
+  }
+  function getUnknownTag(object, tag) {
+    if (/^HTML[A-Z].*Element$/.test(tag)) {
+      var name = Object.prototype.toString.call(object);
+      if (name == "[object Object]") return null;
+      return "HTMLElement";
+    }
+  }
+  function getUnknownTagGenericBrowser(object, tag) {
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+    return getUnknownTag(object, tag);
+  }
+  function prototypeForTag(tag) {
+    if (typeof window == "undefined") return null;
+    if (typeof window[tag] == "undefined") return null;
+    var constructor = window[tag];
+    if (typeof constructor != "function") return null;
+    return constructor.prototype;
+  }
+  function discriminator(tag) { return null; }
+  var isBrowser = typeof navigator == "object";
+  return {
+    getTag: typeNameInChrome,
+    getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+    prototypeForTag: prototypeForTag,
+    discriminator: discriminator };
+}
 C.hQ=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
@@ -20732,37 +20869,40 @@
 C.nT=new N.qV("WARNING",900)
 C.Gb=H.VM(I.uL([127,2047,65535,1114111]),[P.KN])
 C.NG=I.uL([1,6])
-C.JH=I.uL([0,0,26624,1023,0,0,65534,2047])
+C.rz=I.uL([0,0,32776,33792,1,10240,0,0])
 C.SV=new H.tx("keys")
 C.Uq=new H.tx("values")
 C.Wn=new H.tx("length")
 C.ai=new H.tx("isEmpty")
 C.nZ=new H.tx("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
+C.WK=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
+C.o5=I.uL([0,0,65490,45055,65535,34815,65534,18431])
 C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
 C.mKy=I.uL([0,0,26624,1023,65534,2047,65534,2047])
 C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
 C.pzc=H.IL('nd')
 C.Cd=I.uL([C.pzc])
 C.Fn=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
+C.jY=I.uL(["as","in","this"])
+C.to=I.uL([0,0,32722,12287,65534,34815,65534,18431])
 C.QC=I.uL(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.uL([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.B2=I.uL([0,0,24576,1023,65534,34815,65534,18431])
 C.aa=I.uL([0,0,32754,11263,65534,34815,65534,18431])
-C.ZJ=I.uL([0,0,32722,12287,65535,34815,65534,18431])
+C.ZJ=I.uL([0,0,65490,12287,65535,34815,65534,18431])
+C.jr=I.uL([0,0,32722,12287,65535,34815,65534,18431])
 C.iq=I.uL([40,41,91,93,123,125])
 C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
+C.lY=new H.Px(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.zao)
 C.Vgv=I.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
+C.yt=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
 C.rWc=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
+C.pv=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rWc)
 C.kKi=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
+C.w0=new H.Px(29,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,"!==":7,"===":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.kKi)
 C.CM=new H.Px(0,{},C.dn)
 C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.UM()},C.MEG)
+C.c7o=new H.Px(1,{enumerate:K.BQ()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.uL([C.uwj])
@@ -20982,7 +21122,7 @@
 C.rR=H.IL('wN')
 C.yS=H.IL('G6')
 C.Sb=H.IL('kn')
-C.FQ=H.IL('a')
+C.AP=H.IL('a')
 C.Yc=H.IL('iP')
 C.EZ=H.IL('oF')
 C.vw=H.IL('UK')
@@ -21036,12 +21176,12 @@
 C.NR=H.IL('nm')
 C.DD=H.IL('Zn')
 C.qF=H.IL('mO')
+C.JA3=H.IL('b0B')
 C.Ey=H.IL('wM')
 C.pF=H.IL('WS')
 C.qZ=H.IL('DE')
 C.jw=H.IL('xc')
 C.NW=H.IL('ye')
-C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
 C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
@@ -21069,10 +21209,26 @@
 C.oT=H.IL('VY')
 C.jK=H.IL('el')
 C.xM=new P.u5F(!1)
+C.NA=new P.fM(C.NU,P.oo())
+C.Xk=new P.fM(C.NU,P.Dk())
+C.F6=new P.fM(C.NU,P.zi())
+C.Rt=new P.fM(C.NU,P.wLZ())
+C.Sq=new P.fM(C.NU,P.vRP())
+C.mc=new P.fM(C.NU,P.H2())
+C.uo=new P.fM(C.NU,P.hI())
+C.pj=new P.fM(C.NU,P.W7())
+C.F2=new P.fM(C.NU,P.lw())
+C.Gu=new P.fM(C.NU,P.xd())
+C.Yl=new P.fM(C.NU,P.MM())
+C.Zc=new P.fM(C.NU,P.G2())
+C.Kk=new P.yQ(null,null,null,null,null,null,null,null,null,null,null,null)
 $.libraries_to_load = {}
-$.Vz=1
+$.VzC=null
+$.kz=1
 $.z7="$cachedFunction"
 $.eb="$cachedInvocation"
+$.zIm=null
+$.lEO=null
 $.OK=0
 $.bf=null
 $.U9=null
@@ -21089,7 +21245,9 @@
 $.S6=null
 $.k8=null
 $.X3=C.NU
+$.Sk=null
 $.Km=0
+$.xj=null
 $.Qz=null
 $.R6=null
 $.RL=!1
@@ -21108,11 +21266,7 @@
 $.vU=null
 $.xV=null
 $.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.lKH},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.TiU},C.FG,E.qh,{created:E.Sc},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.m6},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii1},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","Fv",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","WH","wB",function(){return $.jk().postMessage!==void 0})
+$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.ZFP},C.Qb,X.J3,{created:X.TsF},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.fv},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.TQ},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.fm},C.PT,M.CX,{created:M.SP},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.PF,W.yyN,{},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4t},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.Ola},C.K4,X.hV,{created:X.zy},C.vu,X.uw,{created:X.lt2},C.ca,D.Z4,{created:D.Oll},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.AW},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.Jv},C.lp,R.LU,{created:R.V4},C.oG,E.ds,{created:E.pIf},C.EG,D.Oz,{created:D.TSH},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.lL},C.ou,Z.ak,{created:Z.lW},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.ZmK},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.va},C.bC,V.D2,{created:V.NI},C.a8,A.Zx,{created:A.Ow},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.kf},C.qF,E.mO,{created:E.Ch},C.JA3,H.b0B,{"":H.m6},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.qZ,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.W1},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Yw},C.he,E.qM,{created:E.tX},C.Jm,Y.q6,{created:Y.Ifw},C.Wz,B.pR,{created:B.lu},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.Qt,A.NK,{created:A.Xii},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.ws,V.Pa,{created:V.fXx},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.cYO},C.X8,U.Ti,{created:U.Gvt},C.Lg,R.JI,{created:R.oS},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
 I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
@@ -21130,10 +21284,10 @@
 I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_storage","wZ","Vy",function(){return window.localStorage})
 I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
+I.$lazy($,"_rootMap","ln","wb",function(){return P.YM(null,null,null,null,null)})
 I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
 I.$lazy($,"webkitEvents","fDX","nn",function(){return P.EF(["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"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
+I.$lazy($,"context","Lt","Si",function(){return P.ND(self)})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
@@ -21145,7 +21299,7 @@
 I.$lazy($,"_pathRegExp","Ub","B8",function(){return new L.DOe().$0()})
 I.$lazy($,"_logger","y7Y","Nd",function(){return N.QM("observe.PathObserver")})
 I.$lazy($,"_pathCache","un","hW",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","rk",function(){return new A.Li(T.GF(null,C.qY),null)})
+I.$lazy($,"_polymerSyntax","Kb","Ak",function(){return new A.Li(T.GF(null,C.qY),null)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","vE",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","Yx","Ep",function(){return $.Si().Eg("ShadowDOMPolyfill")})
@@ -21153,23 +21307,23 @@
 return z!=null?J.UQ(z,"ShadowCSS"):null})
 I.$lazy($,"_sheetLog","dz","QJ",function(){return N.QM("polymer.stylesheet")})
 I.$lazy($,"_changedMethodQueryOptions","SC","Sz",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"_ATTRIBUTES_REGEX","mD","wm",function(){return new H.VR("\\s|,",H.v4("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
 I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","DZ","dnO",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_observeLog","DZ","mj",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","fo","ay",function(){return N.QM("polymer.events")})
 I.$lazy($,"_unbindLog","eu","iX",function(){return N.QM("polymer.unbind")})
 I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_PolymerGestures","XK","Po",function(){return J.UQ($.Si(),"PolymerGestures")})
 I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
 I.$lazy($,"_typeHandlers","lq","Rf",function(){return P.EF([C.Gh,new Z.lP(),C.GX,new Z.Ra(),C.Yc,new Z.wJY(),C.HL,new Z.zOQ(),C.yw,new Z.W6o(),C.pa,new Z.MdQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",new K.w11(),"-",new K.w12(),"*",new K.w13(),"/",new K.w14(),"%",new K.w15(),"==",new K.w16(),"!=",new K.w17(),"===",new K.w18(),"!==",new K.w19(),">",new K.w20(),">=",new K.w21(),"<",new K.w22(),"<=",new K.w23(),"||",new K.w24(),"&&",new K.w25(),"|",new K.w26()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","prp","Ii",function(){return P.EF(["+",new K.w0(),"-",new K.w5(),"!",new K.w10()],null,null)})
-I.$lazy($,"_instance","ln","wb",function(){return new K.me()})
+I.$lazy($,"_BINARY_OPERATORS","HfW","YP",function(){return P.EF(["+",new K.w12(),"-",new K.w13(),"*",new K.w14(),"/",new K.w15(),"%",new K.w16(),"==",new K.w17(),"!=",new K.w18(),"===",new K.w19(),"!==",new K.w20(),">",new K.w21(),">=",new K.w22(),"<",new K.w23(),"<=",new K.w24(),"||",new K.w25(),"&&",new K.w26(),"|",new K.w27()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","oQ","EU",function(){return P.EF(["+",new K.w5(),"-",new K.w10(),"!",new K.w11()],null,null)})
+I.$lazy($,"_instance","b3","At",function(){return new K.me()})
 I.$lazy($,"_currentIsolateMatcher","vf","fA",function(){return new H.VR("isolates/\\d+",H.v4("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"kRegularFunction","Ij","YF",function(){return new D.Hk("function")})
+I.$lazy($,"kRegularFunction","Ij","is",function(){return new D.Hk("function")})
 I.$lazy($,"kClosureFunction","jX","xq",function(){return new D.Hk("closure function")})
 I.$lazy($,"kGetterFunction","F0","GG",function(){return new D.Hk("getter function")})
 I.$lazy($,"kSetterFunction","Bs","Kw",function(){return new D.Hk("setter function")})
@@ -21188,19 +21342,19 @@
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
 I.$lazy($,"symbolConverter","qe","Mg",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","DH",function(){return new M.VE(null)})
+I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.VE(null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Raa().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","v2","tF",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(C.z5),new M.YJG()).zV(0,", ")})
+I.$lazy($,"_ownerStagingDocument","v2","we",function(){return H.VM(new P.qo(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","YO","S1",function(){return"template, "+J.kl(C.lY.gvc(C.lY),new M.YJG()).zV(0,", ")})
 I.$lazy($,"_templateObserver","joK","ik",function(){return W.Ws(new M.lPa())})
 I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.Ufa().$0()})
 I.$lazy($,"_instanceExtension","AH","vH",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_isStagingDocument","Fg","Ks",function(){return H.VM(new P.qo(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
 
-init.functionAliases={Sa:227}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Cu",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"h9",void:true},{func:"n9",void:true,args:[{func:"h9",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"h9",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aYy,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Ve",ret:P.KN,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Ag",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"wT6",ret:P.a2,args:[P.qU]},"type",{func:"B4",args:[P.e4y,P.dl]},{func:"Zg",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Yj]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Qc",args:[U.Ip]},"line",{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"px",args:[P.qU,U.U2]},"details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:226}
+init.metadata=["object","sender","e",{func:"pd",args:[P.qU]},{func:"bg",ret:P.FK},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"l4",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.BpP]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.e4y,P.dl,null,P.BpP]},"self","parent","zone",{func:"QN",args:[P.dl,P.e4y,P.dl,{func:"NT"}]},"f",{func:"aE",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]},null,null]},{func:"rl",ret:{func:"NT"},args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"XRR",ret:{func:"l4",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"Gt",ret:{func:"Ls",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"Ls",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"vl",ret:P.Xa,args:[P.dl,P.e4y,P.dl,P.a6,{func:"JX",void:true,args:[P.Xa]}]},{func:"Xg",void:true,args:[P.dl,P.e4y,P.dl,P.qU]},"line",{func:"kx",void:true,args:[P.qU]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.n7,P.Z0]},"specification","zoneValues",{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable",{func:"Hc",ret:P.KN,args:[D.af,D.af]},{func:"Br",ret:P.qU},"invocation","fractionDigits",{func:"NT"},{func:"rz",args:[P.EH]},"code","key","val",{func:"Ls",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"Af",args:[D.wv]},"vm",{func:"wk",ret:P.a2,args:[null]},"oldEvent",{func:"f4",void:true,args:[W.f5]},"obj","i","responseText",{func:"uC",args:[U.Z5,U.Z5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"PK",ret:P.qU,args:[G.Y2]},"row",{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text",{func:"KDY",ret:[P.b8,D.af],args:[null]},"limit","dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.BpP]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.BpP]},{func:"N5",void:true,args:[null,P.BpP]},"each","k",{func:"jt",void:true,args:[P.KN,P.KN]},{func:"lv",args:[P.IN,null]},{func:"Tla",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"lk",ret:P.KN,args:[null,null]},"byteString","xhr",{func:"QO",void:true,args:[W.AjY]},"result",{func:"fK",args:[D.af]},{func:"IS",ret:O.Hz},"event","response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Oj",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"kd",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"W7",void:true,args:[P.a2,null]},"expand","m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"XO",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"Ij",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.e4y,P.dl]},{func:"h2",args:[P.dl,P.e4y,P.dl,{func:"l4",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"Da",void:true,args:[P.WO,P.Z0,P.WO]},{func:"YT",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.OC]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"Hb",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.Ip,U.Ip]},{func:"Aq",args:[U.Ip]},{func:"Tz",void:true,args:[null,null]},"mutations","observer","id","map",{func:"JC",args:[V.qC]},{func:"rt",ret:P.b8},"scriptCoverage","owningIsolate",{func:"D0",ret:[P.b8,[P.WO,D.dy]],args:[D.vO]},"classList",{func:"lB",ret:[P.b8,D.dy],args:[[P.WO,D.dy]]},"classes","timer",{func:"H6",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"JQ",void:true,args:[W.BI]},"Event",{func:"WEz",void:true,args:[W.Hy]},{func:"T2",void:true,args:[P.qU,U.U2]},{func:"js",args:[P.qU,U.U2]},"msg","details","ref",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"k2G",void:true,args:[W.hsw]},{func:"Vv",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values","targets",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
@@ -21246,7 +21400,7 @@
 return}if(document.currentScript){a(document.currentScript)
 return}var z=document.scripts
 function onLoad(b){for(var x=0;x<z.length;++x){z[x].removeEventListener("load",onLoad,false)}a(b.target)}for(var y=0;y<z.length;++y){z[y].addEventListener("load",onLoad,false)}})(function(a){init.currentScript=a
-if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.wW(E.V7A(),b)},[])}else{(function(b){H.wW(E.V7A(),b)})([])}})
+if(typeof dartMainRunner==="function"){dartMainRunner(function(b){H.Ke(E.jk(),b)},[])}else{(function(b){H.Ke(E.jk(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index 4506ab0..439b6a6 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -22,6 +22,7 @@
         <library-nav-menu library="{{ function.owningLibrary }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index d6487755..efb7040 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -45,7 +45,7 @@
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
+          {{ ref['closureFunc'].name }}
         </a>
       </template>
 
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index bd54c72..b6f31ec 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -10,6 +10,7 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
+    <nav-menu link="{{ script.owningLibrary.link }}" anchor="{{ script.owningLibrary.name }}"></nav-menu>
     <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
index c953393..35414e5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.dart
@@ -17,4 +17,8 @@
   void refresh(var done) {
     function.reload().whenComplete(done);
   }
+
+  void refreshCoverage(var done) {
+    function.refreshCoverage().whenComplete(done);
+  }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 4506ab0..439b6a6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -22,6 +22,7 @@
         <library-nav-menu library="{{ function.owningLibrary }}"></library-nav-menu>
       </template>
       <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
       <nav-control></nav-control>
     </nav-bar>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index d6487755..efb7040 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -45,7 +45,7 @@
                        ref['closureFunc'] != null}}">
         <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
-          {{ ref['closureFunc']['user_name'] }}
+          {{ ref['closureFunc'].name }}
         </a>
       </template>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index bd54c72..b6f31ec 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -10,6 +10,7 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
+    <nav-menu link="{{ script.owningLibrary.link }}" anchor="{{ script.owningLibrary.name }}"></nav-menu>
     <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index a0e1fc5..e9d4adb 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -1267,7 +1267,7 @@
   static FunctionKind kUNKNOWN = new FunctionKind._internal('UNKNOWN');
 }
 
-class ServiceFunction extends ServiceObject {
+class ServiceFunction extends ServiceObject with Coverage {
   @observable Class owningClass;
   @observable Library owningLibrary;
   @observable bool isStatic;
@@ -1338,6 +1338,7 @@
   @observable String kind;
   @observable int firstTokenPos;
   @observable int lastTokenPos;
+  @observable Library owningLibrary;
   bool get canCache => true;
   bool get immutable => true;
 
@@ -1360,13 +1361,18 @@
   Map _tokenToCol = {};
 
   void _update(ObservableMap map, bool mapIsRef) {
+    _upgradeCollection(map, isolate);
     kind = map['kind'];
     _url = map['name'];
     _shortUrl = _url.substring(_url.lastIndexOf('/') + 1);
     name = _shortUrl;
     vmName = _url;
+    if (mapIsRef) {
+      return;
+    }
     _processSource(map['source']);
     _parseTokenPosTable(map['tokenPosTable']);
+    owningLibrary = map['owning_library'];
   }
 
   void _parseTokenPosTable(List<List<int>> table) {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index bd69c01..4788997 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1323,6 +1323,8 @@
 DART_EXPORT bool Dart_IsVariable(Dart_Handle handle);
 DART_EXPORT bool Dart_IsTypeVariable(Dart_Handle handle);
 DART_EXPORT bool Dart_IsClosure(Dart_Handle object);
+DART_EXPORT bool Dart_IsTypedData(Dart_Handle object);
+DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle object);
 
 
 /*
@@ -1920,6 +1922,16 @@
                                                   intptr_t length);
 
 /**
+ * Returns a ByteBuffer object for the typed data.
+ *
+ * \param type_data The TypedData object.
+ *
+ * \return The ByteBuffer object if no error occurs. Otherwise returns
+ *   an error handle.
+ */
+DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data);
+
+/**
  * Acquires access to the internal data address of a TypedData object.
  *
  * \param object The typed data object whose internal data address is to
@@ -1952,6 +1964,16 @@
  */
 DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object);
 
+/**
+ * Returns the TypedData object associated with the ByteBuffer object.
+ *
+ * \param byte_buffer The ByteBuffer object.
+ *
+ * \return The TypedData object if no error occurs. Otherwise returns
+ *   an error handle.
+ */
+DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle byte_buffer);
+
 
 /*
  * ============================================================
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index 6bfd0ce..348eef3 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -136,22 +136,6 @@
 
 
 /*
- * =================
- * Profiling support
- * =================
- */
-
-/* External pprof support for gathering and dumping symbolic
- * information that can be used for better profile reports for
- * dynamically generated code. */
-DART_EXPORT void Dart_InitPprofSupport();
-DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size);
-
-/* Support for generating symbol maps for use by the Linux perf tool. */
-DART_EXPORT void Dart_InitPerfEventsSupport(void* perf_events_file);
-
-
-/*
  * ==================
  * Verification Tools
  * ==================
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index d5683e1..8bd7e40 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -33,8 +33,6 @@
   void beginArray() {}
   void arrayElement() {}
   void endArray() {}
-  /** Called on failure to parse [source]. */
-  void fail(String source, int position, String message) {}
 }
 
 /**
@@ -487,6 +485,7 @@
   }
 
   int parseNumber(int char, int position) {
+    // Also called on any unexpected character.
     // Format:
     //  '-'?('0'|[1-9][0-9]*)('.'[0-9]+)?([eE][+-]?[0-9]+)?
     int start = position;
@@ -505,7 +504,12 @@
         char = source.codeUnitAt(position);
       }
       if (char < CHAR_0 || char > CHAR_9) {
-        fail(position, "Missing expected digit");
+        if (intSign < 0) {
+          fail(position, "Missing expected digit");
+        } else {
+          // If it doesn't even start out as a numeral.
+          fail(position, "Unexpected character");
+        }
       }
       if (char == CHAR_0) {
         position++;
@@ -558,26 +562,17 @@
       listener.handleNumber(intSign * intValue);
       return position;
     }
-    // Consider whether we can have an int/double.parse that works on part of
-    // a string, to avoid creating the substring.
-    String literal = source.substring(start, position);
     // This correctly creates -0.0 for doubles.
-    listener.handleNumber(double.parse(literal));
+    listener.handleNumber(_parseDouble(source, start, position));
     return position;
   }
 
+  static double _parseDouble(String source, int start, int end)
+      native "Double_parse";
+
   void fail(int position, [String message]) {
     if (message == null) message = "Unexpected character";
-    listener.fail(source, position, message);
-    // If the listener didn't throw, do it here.
-    String slice;
-    int sliceEnd = position + 20;
-    if (sliceEnd > source.length) {
-      slice = "'${source.substring(position)}'";
-    } else {
-      slice = "'${source.substring(position, sliceEnd)}...'";
-    }
-    throw new FormatException("Unexpected character at $position: $slice");
+    throw new FormatException(message, source, position);
   }
 }
 
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index a239a75..d8e0cbd 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -24,7 +24,7 @@
                                   [double onError(String str)]) {
     var result = _parse(str);
     if (result == null) {
-      if (onError == null) throw new FormatException(str);
+      if (onError == null) throw new FormatException("Invalid double", str);
       return onError(str);
     }
     return result;
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index 36c4d8f..7ce5ef5 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -67,8 +67,8 @@
 
   static int _native_parse(String str) native "Integer_parse";
 
-  static int _throwFormatException(String source) {
-    throw new FormatException(source);
+  static int _throwFormatException(String source, int position) {
+    throw new FormatException("", source, position);
   }
 
   /* patch */ static int parse(String source,
@@ -78,7 +78,7 @@
       int result = _parse(source);
       if (result == null) {
         if (onError == null) {
-          throw new FormatException(source);
+          throw new FormatException("", source);
         }
         return onError(source);
       }
@@ -97,12 +97,14 @@
     if (radix < 2 || radix > 36) {
       throw new RangeError("Radix $radix not in range 2..36");
     }
-    if (onError == null) {
-      onError = _throwFormatException;
-    }
     // Remove leading and trailing white space.
-    source = source.trim();
-    if (source.isEmpty) return onError(source);
+    int start = source._firstNonWhitespace();
+    int i = start;
+    if (onError == null) onError = (source) {
+      throw new FormatException("Invalid radix-$radix number", source, i);
+    };
+    if (start == source.length) return onError(source);
+    int end = source._lastNonWhitespace() + 1;
 
     bool negative = false;
     int result = 0;
@@ -118,12 +120,11 @@
       25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, NA, NA, NA, NA,  // 0x70
     ];
 
-    int i = 0;
     int code = source.codeUnitAt(i);
     if (code == 0x2d || code == 0x2b) { // Starts with a plus or minus-sign.
       negative = (code == 0x2d);
-      if (source.length == 1) return onError(source);
-      i = 1;
+      i++;
+      if (i == end) return onError(source);
       code = source.codeUnitAt(i);
     }
     do {
@@ -132,7 +133,7 @@
       if (digit >= radix) return onError(source);
       result = result * radix + digit;
       i++;
-      if (i == source.length) break;
+      if (i == end) break;
       code = source.codeUnitAt(i);
     } while (true);
     return negative ? -result : result;
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 5eb63fd..463b3de 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -16,10 +16,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, use_mirrored_compilation_error, false,
-    "Wrap compilation errors that occur during reflective access in a "
-    "MirroredCompilationError, rather than suspending the isolate.");
-
 static RawInstance* CreateMirror(const String& mirror_class_name,
                                  const Array& constructor_arguments) {
   const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
@@ -35,28 +31,6 @@
 }
 
 
-static void ThrowMirroredCompilationError(const String& message) {
-  Array& args = Array::Handle(Array::New(1));
-  args.SetAt(0, message);
-
-  Exceptions::ThrowByType(Exceptions::kMirroredCompilationError, args);
-  UNREACHABLE();
-}
-
-
-static void ThrowInvokeError(const Error& error) {
-  if (FLAG_use_mirrored_compilation_error && error.IsLanguageError()) {
-    // A compilation error that was delayed by lazy compilation.
-    const LanguageError& compilation_error = LanguageError::Cast(error);
-    String& message = String::Handle(compilation_error.FormatMessage());
-    ThrowMirroredCompilationError(message);
-    UNREACHABLE();
-  }
-  Exceptions::PropagateError(error);
-  UNREACHABLE();
-}
-
-
 // Conventions:
 // * For throwing a NSM in a class klass we use its runtime type as receiver,
 //   i.e., klass.RareType().
@@ -102,14 +76,14 @@
   const Error& error = Error::Handle(
       isolate, cls.EnsureIsFinalized(Isolate::Current()));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
     UNREACHABLE();
   }
   if (!func.HasCode()) {
     const Error& error = Error::Handle(
         isolate, Compiler::CompileFunction(isolate, func));
     if (!error.IsNull()) {
-      ThrowInvokeError(error);
+      Exceptions::PropagateError(error);
       UNREACHABLE();
     }
   }
@@ -158,7 +132,7 @@
     const Object& result =
         Object::Handle(Parser::ParseFunctionParameters(func));
     if (result.IsError()) {
-      ThrowInvokeError(Error::Cast(result));
+      Exceptions::PropagateError(Error::Cast(result));
       UNREACHABLE();
     }
     param_descriptor ^= result.raw();
@@ -350,7 +324,7 @@
 
   const Error& error = Error::Handle(cls.EnsureIsFinalized(Isolate::Current()));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
     UNREACHABLE();
   }
 
@@ -434,7 +408,7 @@
 
   Object& metadata = Object::Handle(ns.GetMetadata());
   if (metadata.IsError()) {
-    ThrowInvokeError(Error::Cast(metadata));
+    Exceptions::PropagateError(Error::Cast(metadata));
     UNREACHABLE();
   }
 
@@ -590,7 +564,7 @@
 
 static RawInstance* ReturnResult(const Object& result) {
   if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
+    Exceptions::PropagateError(Error::Cast(result));
     UNREACHABLE();
   }
   if (result.IsInstance()) {
@@ -784,7 +758,7 @@
   AbstractType& result =
       AbstractType::Handle(type.InstantiateFrom(type_args, &bound_error));
   if (!bound_error.IsNull()) {
-    ThrowInvokeError(bound_error);
+    Exceptions::PropagateError(bound_error);
     UNREACHABLE();
   }
   ASSERT(result.IsFinalized());
@@ -873,7 +847,7 @@
 
   const Object& metadata = Object::Handle(library.GetMetadata(decl));
   if (metadata.IsError()) {
-    ThrowInvokeError(Error::Cast(metadata));
+    Exceptions::PropagateError(Error::Cast(metadata));
   }
   return metadata.raw();
 }
@@ -962,7 +936,7 @@
   const Class& cls = Class::Handle(type.type_class());
   const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
   }
 
   return cls.interfaces();
@@ -979,7 +953,7 @@
   const Class& cls = Class::Handle(type.type_class());
   const Error& error = Error::Handle(cls.EnsureIsFinalized(isolate));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
   }
 
   Array& interfaces = Array::Handle(cls.interfaces());
@@ -1041,7 +1015,7 @@
 
   const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
   }
 
   const Array& fields = Array::Handle(klass.fields());
@@ -1088,7 +1062,7 @@
 
   const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate));
   if (!error.IsNull()) {
-    ThrowInvokeError(error);
+    Exceptions::PropagateError(error);
   }
 
   const Array& functions = Array::Handle(klass.functions());
@@ -1310,7 +1284,7 @@
       const Object& call_result =
           Object::Handle(DartEntry::InvokeClosure(args, args_descriptor));
       if (call_result.IsError()) {
-        ThrowInvokeError(Error::Cast(call_result));
+        Exceptions::PropagateError(Error::Cast(call_result));
         UNREACHABLE();
       }
       return call_result.raw();
@@ -1412,7 +1386,7 @@
       const Object& getter_result = Object::Handle(
           DartEntry::InvokeFunction(function, Object::empty_array()));
       if (getter_result.IsError()) {
-        ThrowInvokeError(Error::Cast(getter_result));
+        Exceptions::PropagateError(Error::Cast(getter_result));
         UNREACHABLE();
       }
       // Make room for the closure (receiver) in the argument list.
@@ -1430,7 +1404,7 @@
       const Object& call_result = Object::Handle(
           DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
       if (call_result.IsError()) {
-        ThrowInvokeError(Error::Cast(call_result));
+        Exceptions::PropagateError(Error::Cast(call_result));
         UNREACHABLE();
       }
       return call_result.raw();
@@ -1457,7 +1431,7 @@
   Object& result = Object::Handle(
       DartEntry::InvokeFunction(function, args, args_descriptor_array));
   if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
+    Exceptions::PropagateError(Error::Cast(result));
     UNREACHABLE();
   }
   return result.raw();
@@ -1511,7 +1485,7 @@
     Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
-      ThrowInvokeError(Error::Cast(result));
+      Exceptions::PropagateError(Error::Cast(result));
       UNREACHABLE();
     }
     return result.raw();
@@ -1603,7 +1577,7 @@
       redirect_type ^= redirect_type.InstantiateFrom(type_arguments,
                                                      &bound_error);
       if (!bound_error.IsNull()) {
-        ThrowInvokeError(bound_error);
+        Exceptions::PropagateError(bound_error);
         UNREACHABLE();
       }
       redirect_type ^= redirect_type.Canonicalize();
@@ -1674,7 +1648,7 @@
                                                args,
                                                args_descriptor_array));
   if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
+    Exceptions::PropagateError(Error::Cast(result));
     UNREACHABLE();
   }
 
@@ -1723,7 +1697,7 @@
       const Object& call_result = Object::Handle(
           DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
       if (call_result.IsError()) {
-        ThrowInvokeError(Error::Cast(call_result));
+        Exceptions::PropagateError(Error::Cast(call_result));
         UNREACHABLE();
       }
       return call_result.raw();
@@ -1749,7 +1723,7 @@
   const Object& result = Object::Handle(
       DartEntry::InvokeFunction(function, args, args_descriptor_array));
   if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
+    Exceptions::PropagateError(Error::Cast(result));
     UNREACHABLE();
   }
   return result.raw();
@@ -1806,7 +1780,7 @@
     const Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
-      ThrowInvokeError(Error::Cast(result));
+      Exceptions::PropagateError(Error::Cast(result));
       UNREACHABLE();
     }
     return result.raw();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index b1206cd..13bb7a9 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,7 +4,8 @@
 
 // VM-specific implementation of the dart:mirrors library.
 
-import "dart:collection";
+import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+import "dart:_internal" show LRUMap;
 
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new UnmodifiableMapView({});
@@ -298,21 +299,15 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  // TODO(18445): Use an LRU cache.
-  static var _getFieldClosures = new HashMap();
-  static var _setFieldClosures = new HashMap();
-  static var _getFieldCallCounts = new HashMap();
-  static var _setFieldCallCounts = new HashMap();
+  static var _getFieldClosures = new LRUMap.withShift(7);
+  static var _setFieldClosures = new LRUMap.withShift(7);
+  static var _getFieldCallCounts = new LRUMap.withShift(8);
+  static var _setFieldCallCounts = new LRUMap.withShift(8);
   static const _closureThreshold = 20;
-  static const _cacheSizeLimit = 255;
 
   _getFieldSlow(unwrapped) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      // Prevent unbounded cache growth.
-      _getFieldCallCounts = new HashMap();
-    }
     var callCount = _getFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -331,12 +326,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x) => x.$withoutKey', privateKey);
       }
-      if (_getFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _getFieldClosures = new HashMap();
-      }
       _getFieldClosures[unwrapped] = f;
-      _getFieldCallCounts.remove(unwrapped);  // We won't look for this again.
       return reflect(f(_reflectee));
     }
     var result = reflect(_invokeGetter(_reflectee, unwrapped));
@@ -355,9 +345,6 @@
   _setFieldSlow(unwrapped, arg) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      _setFieldCallCounts = new HashMap();
-    }
     var callCount = _setFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -376,12 +363,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x, v) => x.$withoutKey = v', privateKey);
       }
-      if (_setFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _setFieldClosures = new HashMap();
-      }
       _setFieldClosures[unwrapped] = f;
-      _setFieldCallCounts.remove(unwrapped);
       return reflect(f(_reflectee, arg));
     }
     _invokeSetter(_reflectee, unwrapped, arg);
diff --git a/runtime/lib/mirrors_patch.dart b/runtime/lib/mirrors_patch.dart
index b3eaf9a..962a1c7 100644
--- a/runtime/lib/mirrors_patch.dart
+++ b/runtime/lib/mirrors_patch.dart
@@ -101,14 +101,3 @@
   static _mangleName(String name, _MirrorReference lib)
       native "Mirrors_mangleName";
 }
-
-// TODO(rmacnak): Eliminate this class.
-class MirroredCompilationError {
-  final String message;
-
-  MirroredCompilationError(this.message);
-
-  String toString() {
-    return "Compile-time error during mirrored execution: <$message>";
-  }
-}
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index c5ed491..0550ca77 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -133,12 +133,12 @@
     int otherLength = other.length;
     int len = (thisLength < otherLength) ? thisLength : otherLength;
     for (int i = 0; i < len; i++) {
-      int thisCodePoint = this.codeUnitAt(i);
-      int otherCodePoint = other.codeUnitAt(i);
-      if (thisCodePoint < otherCodePoint) {
+      int thisCodeUnit = this.codeUnitAt(i);
+      int otherCodeUnit = other.codeUnitAt(i);
+      if (thisCodeUnit < otherCodeUnit) {
         return -1;
       }
-      if (thisCodePoint > otherCodePoint) {
+      if (thisCodeUnit > otherCodeUnit) {
         return 1;
       }
     }
@@ -280,17 +280,17 @@
   // 3000          ; White_Space # Zs       IDEOGRAPHIC SPACE
   //
   // BOM: 0xFEFF
-  static bool _isTwoByteWhitespace(int codePoint) {
-    if (codePoint < 256) return _isOneByteWhitespace(codePoint);
-    return (codePoint == 0x1680) ||
-        (codePoint == 0x180E) ||
-        ((0x2000 <= codePoint) && (codePoint <= 0x200A)) ||
-        (codePoint == 0x2028) ||
-        (codePoint == 0x2029) ||
-        (codePoint == 0x202F) ||
-        (codePoint == 0x205F) ||
-        (codePoint == 0x3000) ||
-        (codePoint == 0xFEFF);
+  static bool _isTwoByteWhitespace(int codeUnit) {
+    if (codeUnit < 256) return _isOneByteWhitespace(codeUnit);
+    return (codeUnit == 0x1680) ||
+        (codeUnit == 0x180E) ||
+        ((0x2000 <= codeUnit) && (codeUnit <= 0x200A)) ||
+        (codeUnit == 0x2028) ||
+        (codeUnit == 0x2029) ||
+        (codeUnit == 0x202F) ||
+        (codeUnit == 0x205F) ||
+        (codeUnit == 0x3000) ||
+        (codeUnit == 0xFEFF);
   }
 
   int _firstNonWhitespace() {
@@ -643,8 +643,8 @@
 
   int get hashCode native "String_getHashCode";
 
-  bool _isWhitespace(int codePoint) {
-    return _StringBase._isOneByteWhitespace(codePoint);
+  bool _isWhitespace(int codeUnit) {
+    return _StringBase._isOneByteWhitespace(codeUnit);
   }
 
   bool operator ==(Object other) {
@@ -921,8 +921,8 @@
         "_TwoByteString can only be allocated by the VM");
   }
 
-  bool _isWhitespace(int codePoint) {
-    return _StringBase._isTwoByteWhitespace(codePoint);
+  bool _isWhitespace(int codeUnit) {
+    return _StringBase._isTwoByteWhitespace(codeUnit);
   }
 
   bool operator ==(Object other) {
@@ -937,8 +937,8 @@
         "_ExternalOneByteString can only be allocated by the VM");
   }
 
-  bool _isWhitespace(int codePoint) {
-    return _StringBase._isOneByteWhitespace(codePoint);
+  bool _isWhitespace(int codeUnit) {
+    return _StringBase._isOneByteWhitespace(codeUnit);
   }
 
   bool operator ==(Object other) {
@@ -955,8 +955,8 @@
         "_ExternalTwoByteString can only be allocated by the VM");
   }
 
-  bool _isWhitespace(int codePoint) {
-    return _StringBase._isTwoByteWhitespace(codePoint);
+  bool _isWhitespace(int codeUnit) {
+    return _StringBase._isTwoByteWhitespace(codeUnit);
   }
 
   bool operator ==(Object other) {
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 0df6950..370b5ca 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -538,6 +538,8 @@
 
   _ByteBuffer(this._data);
 
+  factory _ByteBuffer._New(data) => new _ByteBuffer(data);
+
   // Forward calls to _data.
   int get lengthInBytes => _data.lengthInBytes;
   int get hashCode => _data.hashCode;
diff --git a/runtime/tests/vm/dart/mirrored_compilation_error_test.dart b/runtime/tests/vm/dart/mirrored_compilation_error_test.dart
deleted file mode 100644
index 7be51d3..0000000
--- a/runtime/tests/vm/dart/mirrored_compilation_error_test.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2013, 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.
-
-// VMOptions=--use_mirrored_compilation_error=true
-
-@notDefined
-library mirrored_compilation_error_test;
-
-import 'dart:mirrors';
-import "package:expect/expect.dart";
-
-@notDefined
-class Class<@notDefined T> {
-  @notDefined
-  var field;
-
-  @notDefined
-  method(@notDefined param) {}
-}
-
-class Class2 {
-  method() { +++; }
-  get getter { +++; }
-  set setter(x) { +++; }
-
-  static staticFunction() { +++; }
-  static get staticGetter { +++; }
-  static set staticSetter(x) { +++; }
-
-  Class2() {}
-  Class2.constructor() { +++; }
-}
-
-toplevelFunction() { +++; }
-get toplevelGetter { +++; }
-set toplevelSetter(x) { +++; }
-
-
-class G<A extends int, B extends String> {
-  G();
-  factory G.swap() = G<B,A>;  /// static type warning
-}
-
-raises(closure) {
-  Expect.throws(closure,
-                (e) => e is MirroredCompilationError,
-                'Expected a deferred compilation error');
-}
-
-bool get inCheckedMode {
-  try {
-    var i = 1;
-    String s = i;
-    return false;
-  } catch (e) {
-    return true;
-  }
-}
-
-main() {
-
-  // Metadata.
-
-  raises(() => reflectClass(Class).metadata);
-  raises(() => reflectClass(Class).typeVariables.single.metadata);
-  raises(() => reflectClass(Class).declarations[#field].metadata);
-  raises(() => reflectClass(Class).declarations[#method].metadata);
-  raises(() => reflectClass(Class).declarations[#method].parameters.single.metadata);
-  raises(() => reflectClass(Class).owner.metadata);
-
-
-  // Invocation.
-
-  InstanceMirror im = reflect(new Class2());
-  raises(() => im.invoke(#method, []));
-  raises(() => im.getField(#getter));
-  raises(() => im.setField(#setter, 'some value'));
-  // The implementation is within its right to defer the compilation even
-  // further here, so we apply the tear-off to force compilation.
-  raises(() => im.getField(#method).apply([]));
-
-  ClassMirror cm = reflectClass(Class2);
-  raises(() => cm.invoke(#staticFunction, []));
-  raises(() => cm.getField(#staticGetter));
-  raises(() => cm.setField(#staticSetter, 'some value'));
-  raises(() => cm.getField(#staticFunction).apply([]));
-  raises(() => cm.newInstance(#constructor, []));
-
-  LibraryMirror lm = reflectClass(Class2).owner;
-  raises(() => lm.invoke(#toplevelFunction, []));
-  raises(() => lm.getField(#toplevelGetter));
-  raises(() => lm.setField(#toplevelSetter, 'some value'));
-  raises(() => lm.getField(#toplevelFunction).apply([]));
-
-
-  // Bounds violation.
-
-  if (inCheckedMode) {
-    ClassMirror cm = reflect(new G<int, String>()).type;
-    raises(() => cm.newInstance(#swap, []));
-  }
-}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 451e4c0..c2a18b3 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -54,7 +54,6 @@
 cc/Service_ClassesCoverage: Skip # Dart bug 16250
 
 [ $compiler == dart2js ]
-dart/mirrored_compilation_error_test: Skip # VM-specific flag
 dart/redirection_type_shuffling_test: Skip # Depends on lazy enforcement of type bounds
 dart/byte_array_test: Skip # compilers not aware of byte arrays
 dart/byte_array_optimized_test: Skip # compilers not aware of byte arrays
@@ -81,13 +80,8 @@
 cc/JSON_JSONStream_Options: Crash # Issue 19328
 cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
-dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
-
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 dart/optimized_stacktrace_test: StaticWarning
 
-dart/mirrored_compilation_error_test: CompileTimeError, OK # This test intentionally includes invalid method bodies.
-
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 dart/byte_array_test: RuntimeError # Issue 17612
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index e2924f9..c8e859d 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1728,10 +1728,13 @@
 
 
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
+
+  LoadImmediate(TMP, reinterpret_cast<int32_t>(&kSmiCidSource) + 1);
   tst(object, Operand(kSmiTagMask));
-  LoadImmediate(result, Smi::RawValue(kSmiCid), EQ);
-  LoadClassId(result, object, NE);
-  SmiTag(result, NE);
+  mov(TMP, Operand(object), NE);
+  LoadClassId(result, TMP);
+  SmiTag(result);
 }
 
 
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index d52dd1e..4766040 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -67,11 +67,30 @@
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
-    // Create fixed object pool entry for debugger stub.
-    if (StubCode::BreakpointRuntime_entry() != NULL) {
+    // Create fixed object pool entries for debugger stubs.
+    if (StubCode::ICCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable);
-      ASSERT(index == kBreakpointRuntimeCPIndex);
+          FindExternalLabel(&StubCode::ICCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kICCallBreakpointCPIndex);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+    if (StubCode::ClosureCallBreakpoint_entry() != NULL) {
+      intptr_t index =
+          FindExternalLabel(&StubCode::ClosureCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kClosureCallBreakpointCPIndex);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+    if (StubCode::RuntimeCallBreakpoint_entry() != NULL) {
+      intptr_t index =
+          FindExternalLabel(&StubCode::RuntimeCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kRuntimeCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
@@ -1076,18 +1095,13 @@
 
 
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
-  ASSERT(result != TMP);
-  ASSERT(object != TMP);
-
-  // Make a copy of object since result and object can be the same register.
-  mov(TMP, object);
   // Load up a null object. We only need it so we can use LoadClassId on it in
   // the case that object is a Smi..
-  LoadObject(result, Object::null_object(), PP);
+  LoadObject(TMP, Object::null_object(), PP);
   // Check if the object is a Smi.
-  tsti(TMP, kSmiTagMask);
-  // If the object *is* a Smi, load the null object into tmp. o/w leave alone.
-  csel(TMP, result, TMP, EQ);
+  tsti(object, kSmiTagMask);
+  // If the object *is* a Smi, use the null object instead. o/w leave alone.
+  csel(TMP, TMP, object, EQ);
   // Loads either the cid of the object if it isn't a Smi, or the cid of null
   // if it is a Smi, which will be ignored.
   LoadClassId(result, TMP, PP);
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 9ef8746..fa76634 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -1134,7 +1134,9 @@
   void LoadPoolPointer(Register pp);
 
   // Index of constant pool entries pointing to debugger stubs.
-  static const int kBreakpointRuntimeCPIndex = 5;
+  static const int kICCallBreakpointCPIndex = 5;
+  static const int kClosureCallBreakpointCPIndex = 6;
+  static const int kRuntimeCallBreakpointCPIndex = 7;
 
   enum Patchability {
     kPatchable,
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index 8e9ca28..f76403c 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -290,6 +290,14 @@
 }
 
 
+void Assembler::cmovne(Register dst, Register src) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x0F);
+  EmitUint8(0x45);
+  EmitRegisterOperand(dst, src);
+}
+
+
 void Assembler::cmovs(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x0F);
@@ -1407,6 +1415,15 @@
 }
 
 
+void Assembler::cmpb(const Address& address, const Immediate& imm) {
+  ASSERT(imm.is_int8());
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x80);
+  EmitOperand(7, address);
+  EmitUint8(imm.value() & 0xFF);
+}
+
+
 void Assembler::testl(Register reg1, Register reg2) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0x85);
@@ -1804,6 +1821,14 @@
 }
 
 
+void Assembler::bt(Register base, Register offset) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x0F);
+  EmitUint8(0xA3);
+  EmitRegisterOperand(offset, base);
+}
+
+
 void Assembler::enter(const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitUint8(0xC8);
@@ -2696,28 +2721,22 @@
 }
 
 
-void Assembler::LoadTaggedClassIdMayBeSmi(
-    Register result, Register object, Register tmp) {
-  ASSERT(object != tmp);
-  ASSERT(result != tmp);
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  ASSERT(result != object);
+  static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
 
-  // Make a copy of object since result and object can be the same register.
-  movl(tmp, object);
-  // Load up a null object. We only need it so we can use LoadClassId on it in
-  // the case that object is a Smi.
-  movl(result, Immediate(reinterpret_cast<intptr_t>(Object::null())));
-  // Check if the object is a Smi.
-  testl(tmp, Immediate(kSmiTagMask));
-  // If the object *is* a Smi, load the null object into tmp. o/w leave alone.
-  cmove(tmp, result);
-  // Loads either the cid of the object if it isn't a Smi, or the cid of null
-  // if it is a Smi, which will be ignored.
-  LoadClassId(result, tmp);
+  // Make a dummy "Object" whose cid is kSmiCid.
+  movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1));
 
-  movl(tmp, Immediate(kSmiCid));
-  // If object is a Smi, move the Smi cid into result. o/w leave alone.
-  cmove(result, tmp);
-  // Finally, tag the result.
+  // Check if object (in tmp) is a Smi.
+  testl(object, Immediate(kSmiTagMask));
+
+  // If the object is not a Smi, use the original object to load the cid.
+  // Otherwise, the dummy object is used, and the result is kSmiCid.
+  cmovne(result, object);
+  LoadClassId(result, result);
+
+  // Tag the result.
   SmiTag(result);
 }
 
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index 42281b1..4e3fefb 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -350,6 +350,7 @@
 
   void cmovno(Register dst, Register src);
   void cmove(Register dst, Register src);
+  void cmovne(Register dst, Register src);
   void cmovs(Register dst, Register src);
   void cmovns(Register dst, Register src);
 
@@ -519,6 +520,7 @@
 
   void cmpl(const Address& address, Register reg);
   void cmpl(const Address& address, const Immediate& imm);
+  void cmpb(const Address& address, const Immediate& imm);
 
   void testl(Register reg1, Register reg2);
   void testl(Register reg, const Immediate& imm);
@@ -597,6 +599,8 @@
 
   void bsrl(Register dst, Register src);
 
+  void bt(Register base, Register offset);
+
   void enter(const Immediate& imm);
   void leave();
 
@@ -691,8 +695,7 @@
   void CompareClassId(Register object, intptr_t class_id, Register scratch);
 
   void LoadTaggedClassIdMayBeSmi(Register result,
-                                 Register object,
-                                 Register tmp);
+                                 Register object);
 
   /*
    * Misc. functionality
diff --git a/runtime/vm/assembler_ia32_test.cc b/runtime/vm/assembler_ia32_test.cc
index 099bd93..1d17e4c 100644
--- a/runtime/vm/assembler_ia32_test.cc
+++ b/runtime/vm/assembler_ia32_test.cc
@@ -179,6 +179,25 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Cmpb, assembler) {
+  Label done;
+  __ movl(EAX, Immediate(1));
+  __ pushl(Immediate(0xffffff11));
+  __ cmpb(Address(ESP, 0), Immediate(0x11));
+  __ j(EQUAL, &done, Assembler::kNearJump);
+  __ movl(EAX, Immediate(0));
+  __ Bind(&done);
+  __ popl(ECX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cmpb, test) {
+  typedef int (*CmpbCode)();
+  EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
+}
+
+
 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
   __ movl(EAX, Immediate(0));
   __ pushl(EAX);
@@ -3073,14 +3092,34 @@
 
 
 ASSEMBLER_TEST_RUN(ConditionalMovesEqual, test) {
-  typedef int (*ConditionalMovesSignCode)(int i);
-  int res = reinterpret_cast<ConditionalMovesSignCode>(test->entry())(785);
+  typedef int (*ConditionalMovesEqualCode)(int i);
+  int res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(785);
   EXPECT_EQ(1, res);
-  res = reinterpret_cast<ConditionalMovesSignCode>(test->entry())(-12);
+  res = reinterpret_cast<ConditionalMovesEqualCode>(test->entry())(-12);
   EXPECT_EQ(0, res);
 }
 
 
+// Return 1 if not equal, 0 if equal.
+ASSEMBLER_TEST_GENERATE(ConditionalMovesNotEqual, assembler) {
+  __ xorl(EAX, EAX);
+  __ movl(ECX, Immediate(1));
+  __ movl(EDX, Address(ESP, 1 * kWordSize));
+  __ cmpl(EDX, Immediate(785));
+  __ cmovne(EAX, ECX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(ConditionalMovesNotEqual, test) {
+  typedef int (*ConditionalMovesNotEqualCode)(int i);
+  int res = reinterpret_cast<ConditionalMovesNotEqualCode>(test->entry())(785);
+  EXPECT_EQ(0, res);
+  res = reinterpret_cast<ConditionalMovesNotEqualCode>(test->entry())(-12);
+  EXPECT_EQ(1, res);
+}
+
+
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
   __ movl(EDX, Immediate(1));  // Greater equal.
   __ movl(ECX, Immediate(-1));  // Less
@@ -3286,6 +3325,26 @@
   __ ret();
 }
 
+
+ASSEMBLER_TEST_GENERATE(BitTest, assembler) {
+  __ movl(EAX, Immediate(4));
+  __ movl(ECX, Immediate(2));
+  __ bt(EAX, ECX);
+  Label ok;
+  __ j(CARRY, &ok);
+  __ int3();
+  __ Bind(&ok);
+  __ movl(EAX, Immediate(1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(BitTest, test) {
+  typedef int (*BitTest)();
+  EXPECT_EQ(1, reinterpret_cast<BitTest>(test->entry())());
+}
+
+
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_IA32
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 33282d8..647ec7f 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -692,26 +692,15 @@
 
 
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
-  ASSERT(object != TMP);
-  ASSERT(result != TMP);
+  static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
 
-  // Make a copy of object since result and object can be the same register.
-  mov(TMP, object);
-  // Load up a null object. We only need it so we can use LoadClassId on it in
-  // the case that object is a Smi.
-  LoadImmediate(result, reinterpret_cast<intptr_t>(Object::null()));
-  // Check if the object is a Smi.
-  andi(CMPRES1, TMP, Immediate(kSmiTagMask));
-  // If the object *is* a Smi, load the null object into tmp. o/w leave alone.
-  movz(TMP, result, CMPRES1);
-  // Loads either the cid of the object if it isn't a Smi, or the cid of null
-  // if it is a Smi, which will be ignored.
-  LoadClassId(result, TMP);
-
-  LoadImmediate(TMP, kSmiCid);
-  // If object is a Smi, move the Smi cid into result. o/w leave alone.
+  LoadImmediate(TMP, reinterpret_cast<int32_t>(&kSmiCidSource) + 1);
+  andi(CMPRES1, object, Immediate(kSmiTagMask));
+  if (result != object) {
+    mov(result, object);
+  }
   movz(result, TMP, CMPRES1);
-  // Finally, tag the result.
+  LoadClassId(result, result);
   SmiTag(result);
 }
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 1222fe4..3b08240 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -64,11 +64,30 @@
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
-    // Create fixed object pool entry for debugger stub.
-    if (StubCode::BreakpointRuntime_entry() != NULL) {
+    // Create fixed object pool entries for debugger stubs.
+    if (StubCode::ICCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable);
-      ASSERT(index == kBreakpointRuntimeCPIndex);
+          FindExternalLabel(&StubCode::ICCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kICCallBreakpointCPIndex);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+    if (StubCode::ClosureCallBreakpoint_entry() != NULL) {
+      intptr_t index =
+          FindExternalLabel(&StubCode::ClosureCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kClosureCallBreakpointCPIndex);
+    } else {
+      object_pool_.Add(vacant, Heap::kOld);
+      patchable_pool_entries_.Add(kNotPatchable);
+    }
+    if (StubCode::RuntimeCallBreakpoint_entry() != NULL) {
+      intptr_t index =
+          FindExternalLabel(&StubCode::RuntimeCallBreakpointLabel(),
+                            kNotPatchable);
+      ASSERT(index == kRuntimeCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
@@ -1411,6 +1430,16 @@
 }
 
 
+void Assembler::cmpb(const Address& address, const Immediate& imm) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitOperandREX(7, address, REX_NONE);
+  EmitUint8(0x80);
+  EmitOperand(7, address);
+  ASSERT(imm.is_int8());
+  EmitUint8(imm.value() & 0xFF);
+}
+
+
 void Assembler::cmpl(Register reg, const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   EmitRegisterREX(reg, REX_NONE);
@@ -2144,6 +2173,15 @@
   EmitUint8(0xD0 | (reg & 7));
 }
 
+void Assembler::btq(Register base, Register offset) {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  Operand operand(base);
+  EmitOperandREX(offset, operand, REX_W);
+  EmitUint8(0x0F);
+  EmitUint8(0xA3);
+  EmitOperand(offset & 7, operand);
+}
+
 
 void Assembler::enter(const Immediate& imm) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
@@ -3352,25 +3390,22 @@
 
 
 void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
-  ASSERT(object != TMP);
-  ASSERT(result != TMP);
+  ASSERT(result != object);
 
-  // Make a copy of object since result and object can be the same register.
-  movq(TMP, object);
   // Load up a null object. We only need it so we can use LoadClassId on it in
   // the case that object is a Smi.
   LoadObject(result, Object::null_object(), PP);
   // Check if the object is a Smi.
-  testq(TMP, Immediate(kSmiTagMask));
-  // If the object *is* a Smi, load the null object into tmp. o/w leave alone.
-  cmoveq(TMP, result);
+  testq(object, Immediate(kSmiTagMask));
+  // If the object *is* a Smi, use the null object instead.
+  cmoveq(object, result);
   // Loads either the cid of the object if it isn't a Smi, or the cid of null
   // if it is a Smi, which will be ignored.
-  LoadClassId(result, TMP);
+  LoadClassId(result, object);
 
-  movq(TMP, Immediate(kSmiCid));
+  movq(object, Immediate(kSmiCid));
   // If object is a Smi, move the Smi cid into result. o/w leave alone.
-  cmoveq(result, TMP);
+  cmoveq(result, object);
   // Finally, tag the result.
   SmiTag(result);
 }
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 0f29186..3323b73 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -478,6 +478,8 @@
   void xchgl(Register dst, Register src);
   void xchgq(Register dst, Register src);
 
+  void cmpb(const Address& address, const Immediate& imm);
+
   void cmpl(Register reg, const Immediate& imm);
   void cmpl(Register reg0, Register reg1);
   void cmpl(Register reg, const Address& address);
@@ -584,6 +586,8 @@
   void notl(Register reg);
   void notq(Register reg);
 
+  void btq(Register base, Register offset);
+
   void enter(const Immediate& imm);
   void leave();
   void ret();
@@ -787,7 +791,9 @@
   }
 
   // Index of constant pool entries pointing to debugger stubs.
-  static const int kBreakpointRuntimeCPIndex = 5;
+  static const int kICCallBreakpointCPIndex = 5;
+  static const int kClosureCallBreakpointCPIndex = 6;
+  static const int kRuntimeCallBreakpointCPIndex = 7;
 
   void LoadPoolPointer(Register pp);
 
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index aac30db..5947497 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -278,6 +278,25 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Cmpb, assembler) {
+  Label done;
+  __ movq(RAX, Immediate(1));
+  __ pushq(Immediate(0xffffff11));
+  __ cmpb(Address(RSP, 0), Immediate(0x11));
+  __ j(EQUAL, &done, Assembler::kNearJump);
+  __ movq(RAX, Immediate(0));
+  __ Bind(&done);
+  __ popq(RCX);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Cmpb, test) {
+  typedef int (*CmpbCode)();
+  EXPECT_EQ(1, reinterpret_cast<CmpbCode>(test->entry())());
+}
+
+
 ASSEMBLER_TEST_GENERATE(Increment, assembler) {
   __ movq(RAX, Immediate(0));
   __ pushq(RAX);
@@ -2950,6 +2969,25 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(BitTest, assembler) {
+  __ movq(RAX, Immediate(4));
+  __ movq(R12, Immediate(2));
+  __ btq(RAX, R12);
+  Label ok;
+  __ j(CARRY, &ok);
+  __ int3();
+  __ Bind(&ok);
+  __ movq(RAX, Immediate(1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(BitTest, test) {
+  typedef int (*BitTest)();
+  EXPECT_EQ(1, reinterpret_cast<BitTest>(test->entry())());
+}
+
+
 // Return 1 if equal, 0 if not equal.
 ASSEMBLER_TEST_GENERATE(ConditionalMovesEqual, assembler) {
   __ movq(RDX, CallingConventions::kArg1Reg);
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index 6efff89..44faf75 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -80,6 +80,11 @@
   library.set_native_entry_resolver(resolver);
   library.set_native_entry_symbol_resolver(symbol_resolver);
 
+  library = Library::ConvertLibrary();
+  ASSERT(!library.IsNull());
+  library.set_native_entry_resolver(resolver);
+  library.set_native_entry_symbol_resolver(symbol_resolver);
+
   library = Library::CoreLibrary();
   ASSERT(!library.IsNull());
   library.set_native_entry_resolver(resolver);
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 4b6ffcc..5d39333 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -97,7 +97,6 @@
 // a) when bootstrap process completes (VerifyBootstrapClasses).
 // b) after the user classes are loaded (dart_api).
 bool ClassFinalizer::ProcessPendingClasses() {
-  bool retval = true;
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   HANDLESCOPE(isolate);
@@ -137,10 +136,13 @@
     class_array = GrowableObjectArray::New();
     object_store->set_pending_classes(class_array);
     VerifyImplicitFieldOffsets();  // Verification after an error may fail.
+
+    return true;
   } else {
-    retval = false;
+    return false;
   }
-  return retval;
+  UNREACHABLE();
+  return true;
 }
 
 
@@ -3032,6 +3034,18 @@
   ASSERT(field.Offset() == TypedDataView::length_offset());
   name ^= field.name();
   ASSERT(name.Equals("length"));
+
+  // Now verify field offsets of '_ByteBuffer' class.
+  cls = class_table.At(kByteBufferCid);
+  error = cls.EnsureIsFinalized(isolate);
+  ASSERT(error.IsNull());
+  fields_array ^= cls.fields();
+  ASSERT(fields_array.Length() == ByteBuffer::NumberOfFields());
+  field ^= fields_array.At(0);
+  ASSERT(field.Offset() == ByteBuffer::data_offset());
+  name ^= field.name();
+  expected_name ^= String::New("_data");
+  ASSERT(String::EqualsIgnoringPrivateKey(name, expected_name));
 #endif
 }
 
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index 3e5eaa3..be21a85 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -18,13 +18,17 @@
   data.SetTokenPos(token_index);
   data.try_index = try_index;
   list_.Add(data);
+  if (try_index >= 0) {
+    has_try_index_ = true;
+  }
 }
 
 
 RawPcDescriptors* DescriptorList::FinalizePcDescriptors(uword entry_point) {
   intptr_t num_descriptors = Length();
   const PcDescriptors& descriptors =
-      PcDescriptors::Handle(PcDescriptors::New(num_descriptors));
+      PcDescriptors::Handle(PcDescriptors::New(num_descriptors,
+                                               has_try_index_));
   for (intptr_t i = 0; i < num_descriptors; i++) {
     descriptors.AddDescriptor(i,
                               (entry_point + PcOffset(i)),
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index dda6b0b..f453b29 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -30,8 +30,8 @@
     }
   };
 
-  explicit DescriptorList(intptr_t initial_capacity) : list_(initial_capacity) {
-  }
+  explicit DescriptorList(intptr_t initial_capacity)
+      : list_(initial_capacity), has_try_index_(false) {}
   ~DescriptorList() { }
 
   intptr_t Length() const {
@@ -54,7 +54,7 @@
     return list_[index].DeoptReason();
   }
   intptr_t TryIndex(intptr_t index) const {
-    return list_[index].try_index;
+    return (has_try_index_) ? list_[index].try_index : -1;
   }
 
   void AddDescriptor(RawPcDescriptors::Kind kind,
@@ -67,6 +67,7 @@
 
  private:
   GrowableArray<struct PcDesc> list_;
+  bool has_try_index_;
   DISALLOW_COPY_AND_ASSIGN(DescriptorList);
 };
 
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index c54ca6c..5592f67 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -259,8 +259,8 @@
   int call_count = 0;
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kUnoptStaticCall);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    stackmap_table_builder->AddEntry(rec.pc - code.EntryPoint(),
+    const uword pc = iter.NextPc();
+    stackmap_table_builder->AddEntry(pc - code.EntryPoint(),
                                      stack_bitmap,
                                      0);
     ++call_count;
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 8485008..1939a28 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -123,6 +123,7 @@
 
   const intptr_t classTableSize = 1 << RawObject::kClassIdTagSize;
   for (intptr_t i = 0; i < classTableSize; i++) {
+    StackZone zone(Isolate::Current());
     val = lib.Evaluate(expression, Array::empty_array(), Array::empty_array());
   }
 
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index 2eb0d5e..f4ee0fe 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -21,7 +21,7 @@
 class CoverageFilterAll : public CoverageFilter {
  public:
   bool ShouldOutputCoverageFor(const Library& lib,
-                               const String& script_url,
+                               const Script& script,
                                const Class& cls,
                                const Function& func) const {
     return true;
@@ -95,11 +95,11 @@
       RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
   while (iter.HasNext()) {
     HANDLESCOPE(isolate);
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    intptr_t deopt_id = rec.deopt_id;
-    const ICData* ic_data = (*ic_data_array)[deopt_id];
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    const ICData* ic_data = (*ic_data_array)[rec.deopt_id()];
     if (!ic_data->IsNull()) {
-      intptr_t token_pos = rec.token_pos;
+      const intptr_t token_pos = rec.token_pos();
       // Filter out descriptors that do not map to tokens in the source code.
       if ((token_pos < begin_pos) || (token_pos > end_pos)) {
         continue;
@@ -155,7 +155,7 @@
     function ^= functions.At(i);
     script = function.script();
     saved_url = script.url();
-    if (!filter->ShouldOutputCoverageFor(lib, saved_url, cls, function)) {
+    if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
       i++;
       continue;
     }
@@ -175,6 +175,10 @@
         pos_to_line.Clear();
         break;
       }
+      if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
+        i++;
+        continue;
+      }
       CompileAndAdd(function, hits_arr, pos_to_line);
       if (function.HasImplicitClosureFunction()) {
         function = function.ImplicitClosureFunction();
@@ -196,7 +200,7 @@
       function ^= closures.At(i);
       script = function.script();
       saved_url = script.url();
-      if (!filter->ShouldOutputCoverageFor(lib, saved_url, cls, function)) {
+      if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
         i++;
         continue;
       }
diff --git a/runtime/vm/coverage.h b/runtime/vm/coverage.h
index 5cc1ec1..cdeb0a6 100644
--- a/runtime/vm/coverage.h
+++ b/runtime/vm/coverage.h
@@ -26,7 +26,7 @@
 class CoverageFilter : public ValueObject {
  public:
   virtual bool ShouldOutputCoverageFor(const Library& lib,
-                                       const String& script_url,
+                                       const Script& script,
                                        const Class& cls,
                                        const Function& func) const = 0;
   virtual ~CoverageFilter() {}
diff --git a/runtime/vm/coverage_test.cc b/runtime/vm/coverage_test.cc
index 6219212..0d2f775 100644
--- a/runtime/vm/coverage_test.cc
+++ b/runtime/vm/coverage_test.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-static void ExecuteScript(const char* script) {
+static RawObject* ExecuteScript(const char* script) {
   Dart_Handle h_lib = TestCase::LoadTestScript(script, NULL);
   EXPECT_VALID(h_lib);
   Library& lib = Library::Handle();
@@ -16,25 +16,44 @@
   EXPECT(!lib.IsNull());
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
+  return Api::UnwrapHandle(h_lib);
 }
 
 
+class FunctionCoverageFilter : public CoverageFilter {
+ public:
+  explicit FunctionCoverageFilter(const Function& func) : func_(func) {}
+  bool ShouldOutputCoverageFor(const Library& lib,
+                               const Script& script,
+                               const Class& cls,
+                               const Function& func) const {
+    return func.raw() == func_.raw();
+  }
+ private:
+  const Function& func_;
+};
+
+
 TEST_CASE(Coverage_Empty) {
   const char* kScript =
       "main() {\n"
       "}";
 
   Isolate* isolate = Isolate::Current();
-  ExecuteScript(kScript);
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
 
   JSONStream js;
   CodeCoverage::PrintJSON(isolate, &js, NULL);
 
-  EXPECT_SUBSTRING(
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd  "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[]}", js.ToCString());
+      "\"kind\":\"script\"},\"hits\":[]}", lib.index());
+  EXPECT_SUBSTRING(buf, js.ToCString());
 }
 
 
@@ -54,27 +73,70 @@
       "}\n";
 
   Isolate* isolate = Isolate::Current();
-  ExecuteScript(kScript);
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
 
   JSONStream js;
   CodeCoverage::PrintJSON(isolate, &js, NULL);
 
+  char buf[1024];
   // Coverage data is printed per class, i.e., there should be two sections
   // for test-lib in the JSON data.
 
   // Data for the actual class Foo.
-  EXPECT_SUBSTRING(
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", js.ToCString());
+      "\"kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", lib.index());
+  EXPECT_SUBSTRING(buf, js.ToCString());
 
   // Data for the fake class containing main().
-  EXPECT_SUBSTRING(
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd  "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[10,1,11,1]}", js.ToCString());
+      "\"kind\":\"script\"},\"hits\":[10,1,11,1]}", lib.index());
+  EXPECT_SUBSTRING(buf, js.ToCString());
+}
+
+
+TEST_CASE(Coverage_FilterFunction) {
+  const char* kScript =
+      "class Foo {\n"
+      "  var x;\n"
+      "  var y;\n"
+      "  Foo(this.x);\n"
+      "  Foo.other(this.x, this.y);\n"
+      "  Foo.yetAnother();\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "}\n";
+
+  Isolate* isolate = Isolate::Current();
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(String::New("Foo"))));
+  ASSERT(!cls.IsNull());
+  const Function& func = Function::Handle(
+      cls.LookupFunction(String::Handle(String::New("Foo.yetAnother"))));
+  ASSERT(!func.IsNull());
+
+  JSONStream js;
+  FunctionCoverageFilter filter(func);
+  CodeCoverage::PrintJSON(isolate, &js, &filter);
+  // Only expect coverage data for Foo.yetAnother() on line 6.
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[6,0]}", lib.index());
+  EXPECT_SUBSTRING(buf, js.ToCString());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 15c4783..d418d12 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1855,6 +1855,20 @@
 }
 
 
+DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) {
+  TRACE_API_CALL(CURRENT_FUNC);
+  intptr_t cid = Api::ClassId(handle);
+  return RawObject::IsTypedDataClassId(cid) ||
+      RawObject::IsExternalTypedDataClassId(cid);
+}
+
+
+DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) {
+  TRACE_API_CALL(CURRENT_FUNC);
+  return Api::ClassId(handle) == kByteBufferCid;
+}
+
+
 // --- Instances ----
 
 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) {
@@ -3086,7 +3100,7 @@
   // Create the argument list.
   const Array& args = Array::Handle(isolate, Array::New(2));
   // Factories get type arguments.
-  args.SetAt(0, TypeArguments::Handle(isolate));
+  args.SetAt(0, Object::null_type_arguments());
   args.SetAt(1, Smi::Handle(isolate, Smi::New(length)));
 
   // Invoke the constructor and return the new object.
@@ -3136,7 +3150,7 @@
   const intptr_t num_args = 3;
   const Array& args = Array::Handle(isolate, Array::New(num_args + 1));
   // Factories get type arguments.
-  args.SetAt(0, TypeArguments::Handle(isolate));
+  args.SetAt(0, Object::null_type_arguments());
   const ExternalTypedData& array =
       Api::UnwrapExternalTypedDataHandle(isolate, ext_data);
   args.SetAt(1, array);
@@ -3276,6 +3290,57 @@
 }
 
 
+static RawObject* GetByteBufferConstructor(Isolate* isolate,
+                                           const String& class_name,
+                                           const String& constructor_name,
+                                           intptr_t num_args) {
+  const Library& lib =
+      Library::Handle(isolate->object_store()->typed_data_library());
+  ASSERT(!lib.IsNull());
+  const Class& cls = Class::Handle(
+      isolate, lib.LookupClassAllowPrivate(class_name));
+  ASSERT(!cls.IsNull());
+  return ResolveConstructor(CURRENT_FUNC,
+                            cls,
+                            class_name,
+                            constructor_name,
+                            num_args);
+}
+
+
+DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  intptr_t class_id = Api::ClassId(typed_data);
+  if (!RawObject::IsExternalTypedDataClassId(class_id) &&
+      !RawObject::IsTypedDataViewClassId(class_id) &&
+      !RawObject::IsTypedDataClassId(class_id)) {
+    RETURN_TYPE_ERROR(isolate, typed_data, 'TypedData');
+  }
+  Object& result = Object::Handle(isolate);
+  result = GetByteBufferConstructor(isolate,
+                                    Symbols::_ByteBuffer(),
+                                    Symbols::_ByteBufferDot_New(),
+                                    1);
+  ASSERT(!result.IsNull());
+  ASSERT(result.IsFunction());
+  const Function& factory = Function::Cast(result);
+  ASSERT(!factory.IsConstructor());
+
+  // Create the argument list.
+  const Array& args = Array::Handle(isolate, Array::New(2));
+  // Factories get type arguments.
+  args.SetAt(0, Object::null_type_arguments());
+  const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(typed_data));
+  args.SetAt(1, obj);
+
+  // Invoke the factory constructor and return the new object.
+  result = DartEntry::InvokeFunction(factory, args);
+  ASSERT(result.IsInstance() || result.IsNull() || result.IsError());
+  return Api::NewHandle(isolate, result.raw());
+}
+
+
 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object,
                                                   Dart_TypedData_Type* type,
                                                   void** data,
@@ -3356,6 +3421,19 @@
 }
 
 
+DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle object) {
+  Isolate* isolate = Isolate::Current();
+  CHECK_ISOLATE(isolate);
+  intptr_t class_id = Api::ClassId(object);
+  if (class_id != kByteBufferCid) {
+    RETURN_TYPE_ERROR(isolate, object, 'ByteBuffer');
+  }
+  const Instance& instance = Api::UnwrapInstanceHandle(isolate, object);
+  ASSERT(!instance.IsNull());
+  return Api::NewHandle(isolate, ByteBuffer::Data(instance));
+}
+
+
 // ---  Invoking Constructors, Methods, and Field accessors ---
 
 static RawObject* ResolveConstructor(const char* current_func,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 648b642..90ac918 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1429,6 +1429,9 @@
   EXPECT_EQ(Dart_TypedData_kInvalid,
             Dart_GetTypeOfExternalTypedData(byte_array1));
   EXPECT(Dart_IsList(byte_array1));
+  EXPECT(!Dart_IsTypedData(Dart_True()));
+  EXPECT(Dart_IsTypedData(byte_array1));
+  EXPECT(!Dart_IsByteBuffer(byte_array1));
 
   intptr_t length = 0;
   Dart_Handle result = Dart_ListLength(byte_array1, &length);
@@ -1490,6 +1493,50 @@
 }
 
 
+TEST_CASE(ByteBufferAccess) {
+  EXPECT(!Dart_IsByteBuffer(Dart_True()));
+  Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
+  EXPECT_VALID(byte_array);
+  // Set through the List API.
+  for (intptr_t i = 0; i < 10; ++i) {
+    EXPECT_VALID(Dart_ListSetAt(byte_array, i, Dart_NewInteger(i + 1)));
+  }
+  Dart_Handle byte_buffer = Dart_NewByteBuffer(byte_array);
+  EXPECT_VALID(byte_buffer);
+  EXPECT(Dart_IsByteBuffer(byte_buffer));
+  EXPECT(!Dart_IsTypedData(byte_buffer));
+
+  Dart_Handle byte_buffer_data = Dart_GetDataFromByteBuffer(byte_buffer);
+  EXPECT_VALID(byte_buffer_data);
+  EXPECT(!Dart_IsByteBuffer(byte_buffer_data));
+  EXPECT(Dart_IsTypedData(byte_buffer_data));
+
+  intptr_t length = 0;
+  Dart_Handle result = Dart_ListLength(byte_buffer_data, &length);
+  EXPECT_VALID(result);
+  EXPECT_EQ(10, length);
+
+  for (intptr_t i = 0; i < 10; ++i) {
+    // Get through the List API.
+    Dart_Handle integer_obj = Dart_ListGetAt(byte_buffer_data, i);
+    EXPECT_VALID(integer_obj);
+    int64_t int64_t_value = -1;
+    EXPECT_VALID(Dart_IntegerToInt64(integer_obj, &int64_t_value));
+    EXPECT_EQ(i + 1, int64_t_value);
+  }
+
+  // Some negative tests.
+  result = Dart_NewByteBuffer(Dart_True());
+  EXPECT(Dart_IsError(result));
+  result = Dart_NewByteBuffer(byte_buffer);
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetDataFromByteBuffer(Dart_False());
+  EXPECT(Dart_IsError(result));
+  result = Dart_GetDataFromByteBuffer(byte_array);
+  EXPECT(Dart_IsError(result));
+}
+
+
 static int kLength = 16;
 
 static void ByteDataNativeFunction(Dart_NativeArguments args) {
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 1760ae7..b715e51 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -380,6 +380,11 @@
 }
 
 
+intptr_t ApiMessageReader::NextAvailableObjectId() const {
+  return backward_references_.length() + kMaxPredefinedObjectIds;
+}
+
+
 Dart_CObject* ApiMessageReader::ReadObjectRef() {
   int64_t value64 = Read<int64_t>();
   if ((value64 & kSmiTagMask) == 0) {
@@ -402,10 +407,14 @@
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
 
+  intptr_t object_id = SerializedHeaderData::decode(value);
+  if (object_id == kOmittedObjectId) {
+    object_id = NextAvailableObjectId();
+  }
+
   // Reading of regular dart instances has limited support in order to
   // read typed data views.
   if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
-    intptr_t object_id = SerializedHeaderData::decode(value);
     Dart_CObject_Internal* object =
         AllocateDartCObjectInternal(Dart_CObject_Internal::kUninitialized);
     AddBackRef(object_id, object, kIsNotDeserialized);
@@ -416,7 +425,6 @@
     return object;
   }
   ASSERT((class_header & kSmiTagMask) != 0);
-  intptr_t object_id = SerializedHeaderData::decode(value);
   intptr_t class_id = LookupInternalClass(class_header);
   if ((class_id == kArrayCid) || (class_id == kImmutableArrayCid)) {
     ASSERT(GetBackRef(object_id) == NULL);
@@ -751,7 +759,12 @@
     return ReadIndexedObject(SerializedHeaderData::decode(value));
   }
   ASSERT(SerializedHeaderTag::decode(value) == kInlined);
-  return ReadInlinedObject(SerializedHeaderData::decode(value));
+
+  intptr_t object_id = SerializedHeaderData::decode(value);
+  if (object_id == kOmittedObjectId) {
+    object_id = NextAvailableObjectId();
+  }
+  return ReadInlinedObject(object_id);
 }
 
 
diff --git a/runtime/vm/dart_api_message.h b/runtime/vm/dart_api_message.h
index a2faf44..c1ab9f2 100644
--- a/runtime/vm/dart_api_message.h
+++ b/runtime/vm/dart_api_message.h
@@ -120,6 +120,8 @@
   // Get an object from the backward references list.
   Dart_CObject* GetBackRef(intptr_t id);
 
+  intptr_t NextAvailableObjectId() const;
+
   Dart_CObject_Internal* AsInternal(Dart_CObject* object) {
     ASSERT(object->type >= Dart_CObject_kNumberOfTypes);
     return reinterpret_cast<Dart_CObject_Internal*>(object);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 8cdec8d..6fd0c2a 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -179,8 +179,9 @@
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle(code.raw())),
       function_(Function::ZoneHandle(code.function())),
+      token_pos_initialized_(false),
       token_pos_(-1),
-      desc_rec_(NULL),
+      try_index_(-1),
       line_number_(-1),
       column_number_(-1),
       context_level_(-1),
@@ -354,17 +355,19 @@
 }
 
 
-// Compute token_pos_ and pc_desc_index_.
+// Compute token_pos_ and try_index_ and token_pos_initialized_.
 intptr_t ActivationFrame::TokenPos() {
-  if (token_pos_ < 0) {
+  if (!token_pos_initialized_) {
+    token_pos_initialized_ = true;
     token_pos_ = Scanner::kNoSourcePos;
     GetPcDescriptors();
     PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind);
     while (iter.HasNext()) {
-      const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-      if (rec.pc == pc_) {
-        desc_rec_ = &rec;
-        token_pos_ = rec.token_pos;
+      RawPcDescriptors::PcDescriptorRec rec;
+      iter.NextRec(&rec);
+      if (rec.pc() == pc_) {
+        try_index_ = rec.try_index();
+        token_pos_ = rec.token_pos();
         break;
       }
     }
@@ -374,11 +377,10 @@
 
 
 intptr_t ActivationFrame::TryIndex() {
-  if (desc_rec_ == NULL) {
-    return -1;
-  } else {
-    return desc_rec_->try_index;
+  if (!token_pos_initialized_) {
+    TokenPos();  // Side effect: computes token_pos_initialized_, try_index_.
   }
+  return try_index_;
 }
 
 
@@ -427,7 +429,9 @@
     // TODO(hausner): What to do if there is no descriptor entry
     // for the code position of the frame? For now say we are at context
     // level 0.
-    if (desc_rec_ == NULL) {
+    TokenPos();
+    if (token_pos_ == -1) {
+      // No PcDescriptor.
       return context_level_;
     }
     ASSERT(!pc_desc_.IsNull());
@@ -928,15 +932,15 @@
 
 
 static bool HasTokenPos(const RawPcDescriptors::PcDescriptorRec& rec) {
-  return rec.token_pos != Scanner::kNoSourcePos;
+  return rec.token_pos() != Scanner::kNoSourcePos;
 }
 
 
 CodeBreakpoint::CodeBreakpoint(const Code& code,
                                const RawPcDescriptors::PcDescriptorRec& rec)
     : code_(code.raw()),
-      token_pos_(rec.token_pos),
-      pc_(rec.pc),
+      token_pos_(rec.token_pos()),
+      pc_(rec.pc()),
       line_number_(-1),
       is_enabled_(false),
       src_bpt_(NULL),
@@ -1201,9 +1205,10 @@
   PcDescriptors& desc = PcDescriptors::Handle(isolate, code.pc_descriptors());
   PcDescriptors::Iterator iter(desc, kSafepointKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
     if (HasTokenPos(rec)) {
-      CodeBreakpoint* bpt = GetCodeBreakpoint(rec.pc);
+      CodeBreakpoint* bpt = GetCodeBreakpoint(rec.pc());
       if (bpt != NULL) {
         // There is already a breakpoint for this address. Make sure
         // it is enabled.
@@ -1252,8 +1257,8 @@
       PcDescriptors::Handle(isolate, code.pc_descriptors());
   PcDescriptors::Iterator iter(pc_desc, RawPcDescriptors::kClosureCall);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.pc == pc) {
+    const uword rec_pc = iter.NextPc();
+    if (rec_pc == pc) {
       is_closure_call = true;
       break;
     }
@@ -1544,17 +1549,15 @@
   ASSERT(!code.IsNull());
   PcDescriptors& desc = PcDescriptors::Handle(code.pc_descriptors());
   intptr_t best_fit_pos = INT_MAX;
-  const RawPcDescriptors::PcDescriptorRec* best_fit_rec = NULL;
   uword lowest_pc = kUwordMax;
-  const RawPcDescriptors::PcDescriptorRec* lowest_pc_rec = NULL;
-
-  const RawPcDescriptors::PcDescriptorRec* rec = NULL;
+  intptr_t lowest_pc_token_pos = INT_MAX;
   PcDescriptors::Iterator iter(desc, kSafepointKind);
   while (iter.HasNext()) {
-    rec = &iter.Next();
-    intptr_t desc_token_pos = rec->token_pos;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    intptr_t desc_token_pos = rec.token_pos();
     ASSERT(desc_token_pos >= 0);
-    if (HasTokenPos(*rec)) {
+    if (HasTokenPos(rec)) {
       if ((desc_token_pos < requested_token_pos) ||
           (desc_token_pos > last_token_pos)) {
         // This descriptor is outside the desired token range.
@@ -1564,24 +1567,23 @@
         // So far, this descriptor has the lowest token position after
         // the first acceptable token position.
         best_fit_pos = desc_token_pos;
-        best_fit_rec = rec;
       }
-      if (rec->pc < lowest_pc) {
+      if (rec.pc() < lowest_pc) {
         // This descriptor so far has the lowest code address.
-        lowest_pc = rec->pc;
-        lowest_pc_rec = rec;
+        lowest_pc = rec.pc();
+        lowest_pc_token_pos = desc_token_pos;
       }
     }
   }
-  if (lowest_pc_rec != NULL) {
+  if (lowest_pc_token_pos != INT_MAX) {
     // We found the pc descriptor that has the lowest execution address.
     // This is the first possible breakpoint after the requested token
     // position. We use this instead of the nearest PC descriptor
     // measured in token index distance.
-    best_fit_rec = lowest_pc_rec;
+    return lowest_pc_token_pos;
   }
-  if (best_fit_rec != NULL) {
-    return best_fit_rec->token_pos;
+  if (best_fit_pos != INT_MAX) {
+    return best_fit_pos;
   }
   // We didn't find a safe point in the given token range. Try and find
   // a safe point in the remaining source code of the function.
@@ -1603,24 +1605,25 @@
   // Find the safe point with the lowest compiled code address
   // that maps to the token position of the source breakpoint.
   PcDescriptors::Iterator iter(desc, kSafepointKind);
-  const RawPcDescriptors::PcDescriptorRec* lowest_rec = NULL;
+  RawPcDescriptors::PcDescriptorRec lowest_rec;
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    intptr_t desc_token_pos = rec.token_pos;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    intptr_t desc_token_pos = rec.token_pos();
     if ((desc_token_pos == bpt->token_pos_) && HasTokenPos(rec)) {
-      if (rec.pc < lowest_pc) {
-        lowest_pc = rec.pc;
-        lowest_rec = &rec;
+      if (rec.pc() < lowest_pc) {
+        lowest_pc = rec.pc();
+        lowest_rec = rec;
       }
     }
   }
-  if (lowest_rec == NULL) {
+  if (lowest_pc == kUwordMax) {
     return;
   }
-  CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec->pc);
+  CodeBreakpoint* code_bpt = GetCodeBreakpoint(lowest_rec.pc());
   if (code_bpt == NULL) {
     // No code breakpoint for this code exists; create one.
-    code_bpt = new CodeBreakpoint(code, *lowest_rec);
+    code_bpt = new CodeBreakpoint(code, lowest_rec);
     RegisterCodeBreakpoint(code_bpt);
   }
   code_bpt->set_src_bpt(bpt);
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index a8833d6..e193e48 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -211,8 +211,9 @@
   Context& ctx_;
   const Code& code_;
   const Function& function_;
+  bool token_pos_initialized_;
   intptr_t token_pos_;
-  const RawPcDescriptors::PcDescriptorRec* desc_rec_;
+  intptr_t try_index_;
 
   intptr_t line_number_;
   intptr_t column_number_;
diff --git a/runtime/vm/debugger_api_impl.cc b/runtime/vm/debugger_api_impl.cc
index cabf9e7..05ee325 100644
--- a/runtime/vm/debugger_api_impl.cc
+++ b/runtime/vm/debugger_api_impl.cc
@@ -697,7 +697,8 @@
       ASSERT(!cls.IsNull());
       const Library& lib = Library::Handle(isolate, cls.library());
       ASSERT(!lib.IsNull());
-      const Script& script = Script::Handle(cls.script());
+      // Note func.script() is not the same as cls.script() for eval functions.
+      const Script& script = Script::Handle(func.script());
       ASSERT(!script.IsNull());
       location->script_url = Api::NewHandle(isolate, script.url());
       location->library_id = lib.index();
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 4ce3f12..5868293 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -2029,6 +2029,51 @@
 }
 
 
+static void UnhandledExceptionHandler(Dart_IsolateId isolate_id,
+                                      Dart_Handle exception_object,
+                                      Dart_StackTrace trace) {
+  breakpoint_hit_counter++;
+}
+
+
+// Check that the debugger is not called when an exception is
+// caught by Dart code.
+TEST_CASE(Debug_BreakOnUnhandledException) {
+  const char* kScriptChars =
+      "main() {                        \n"
+      "  try {                         \n"
+      "    throw 'broccoli';           \n"
+      "  } catch (e) {                 \n"
+      "    return 'carrots';           \n"
+      "  }                             \n"
+      "  return 'zucchini';            \n"
+      "}                               \n";
+
+  LoadScript(kScriptChars);
+  Dart_FinalizeLoading();
+  Dart_SetExceptionThrownHandler(&UnhandledExceptionHandler);
+  breakpoint_hit_counter = 0;
+
+  // Check that the debugger is not called since the exception
+  // is handled.
+  Dart_SetExceptionPauseInfo(kPauseOnUnhandledExceptions);
+  Dart_Handle res = Invoke("main");
+  EXPECT_VALID(res);
+  EXPECT(Dart_IsString(res));
+  EXPECT_STREQ("carrots", ToCString(res));
+  EXPECT_EQ(0, breakpoint_hit_counter);
+
+  // Check that the debugger is called when "break on all
+  // exceptions" is turned on.
+  Dart_SetExceptionPauseInfo(kPauseOnAllExceptions);
+  Dart_Handle res2 = Invoke("main");
+  EXPECT_VALID(res2);
+  EXPECT(Dart_IsString(res2));
+  EXPECT_STREQ("carrots", ToCString(res2));
+  EXPECT_EQ(1, breakpoint_hit_counter);
+}
+
+
 TEST_CASE(Debug_GetClosureInfo) {
   const char* kScriptChars =
       "void foo() { return 43; } \n"
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index 65458fa..3be4d1e 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -46,12 +46,22 @@
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kUnoptStaticCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+        break;
+      }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        CodePatcher::PatchStaticCallAt(pc_, code,
-                                       StubCode::BreakpointRuntimeEntryPoint());
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+        break;
+      }
+      case RawPcDescriptors::kRuntimeCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 3fb7b88..2a74ad6 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -53,15 +53,33 @@
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kUnoptStaticCall: {
+        int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
+        ASSERT((offset > 0) && ((offset & 0x7) == 0));
+        saved_value_ = static_cast<uword>(offset);
+        const uint32_t stub_offset =
+            InstructionPattern::OffsetFromPPIndex(
+                Assembler::kICCallBreakpointCPIndex);
+        CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
+        break;
+      }
       case RawPcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset & 0x7) == 0));
         saved_value_ = static_cast<uword>(offset);
         const uint32_t stub_offset =
             InstructionPattern::OffsetFromPPIndex(
-                Assembler::kBreakpointRuntimeCPIndex);
+                Assembler::kClosureCallBreakpointCPIndex);
+        CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
+        break;
+      }
+      case RawPcDescriptors::kRuntimeCall: {
+        int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
+        ASSERT((offset > 0) && ((offset & 0x7) == 0));
+        saved_value_ = static_cast<uword>(offset);
+        const uint32_t stub_offset =
+            InstructionPattern::OffsetFromPPIndex(
+                Assembler::kRuntimeCallBreakpointCPIndex);
         CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
         break;
       }
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 470c333..8798e38 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -50,12 +50,22 @@
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kUnoptStaticCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+        break;
+      }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        CodePatcher::PatchStaticCallAt(pc_, code,
-                                       StubCode::BreakpointRuntimeEntryPoint());
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+        break;
+      }
+      case RawPcDescriptors::kRuntimeCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index b54a5e9..7caa461 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -46,12 +46,22 @@
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kUnoptStaticCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+        break;
+      }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        CodePatcher::PatchStaticCallAt(pc_, code,
-                                       StubCode::BreakpointRuntimeEntryPoint());
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+        break;
+      }
+      case RawPcDescriptors::kRuntimeCall: {
+        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+        CodePatcher::PatchStaticCallAt(
+            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 97fd052..b76469e 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -55,15 +55,33 @@
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
-      case RawPcDescriptors::kUnoptStaticCall:
-      case RawPcDescriptors::kRuntimeCall:
+      case RawPcDescriptors::kUnoptStaticCall: {
+        int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
+        ASSERT((offset > 0) && ((offset % 8) == 7));
+        saved_value_ = static_cast<uword>(offset);
+        const uint32_t stub_offset =
+            InstructionPattern::OffsetFromPPIndex(
+                Assembler::kICCallBreakpointCPIndex);
+        CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
+        break;
+      }
       case RawPcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset % 8) == 7));
         saved_value_ = static_cast<uword>(offset);
         const uint32_t stub_offset =
             InstructionPattern::OffsetFromPPIndex(
-                Assembler::kBreakpointRuntimeCPIndex);
+                Assembler::kClosureCallBreakpointCPIndex);
+        CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
+        break;
+      }
+      case RawPcDescriptors::kRuntimeCall: {
+        int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
+        ASSERT((offset > 0) && ((offset % 8) == 7));
+        saved_value_ = static_cast<uword>(offset);
+        const uint32_t stub_offset =
+            InstructionPattern::OffsetFromPPIndex(
+                Assembler::kRuntimeCallBreakpointCPIndex);
         CodePatcher::SetPoolOffsetAt(pc_, stub_offset);
         break;
       }
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index ccd7316..ba12b63 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -890,6 +890,77 @@
 };
 
 
+class DeoptUint32RegisterInstr: public DeoptInstr {
+ public:
+  explicit DeoptUint32RegisterInstr(intptr_t reg_as_int)
+      : reg_(static_cast<Register>(reg_as_int)) {}
+
+  virtual intptr_t source_index() const { return static_cast<intptr_t>(reg_); }
+  virtual DeoptInstr::Kind kind() const { return kUint32Register; }
+
+  virtual const char* ToCString() const {
+    return Isolate::Current()->current_zone()->PrintToString(
+        "uint32 %s", Assembler::RegisterName(reg_));
+  }
+
+  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
+    uint32_t low = static_cast<uint32_t>(deopt_context->RegisterValue(reg_));
+    int64_t value = Utils::LowHighTo64Bits(low, 0);
+    if (Smi::IsValid(value)) {
+      *dest_addr = reinterpret_cast<intptr_t>(
+          Smi::New(static_cast<intptr_t>(value)));
+    } else {
+      *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
+      deopt_context->DeferMintMaterialization(
+          value, reinterpret_cast<RawMint**>(dest_addr));
+    }
+  }
+
+ private:
+  const Register reg_;
+
+  DISALLOW_COPY_AND_ASSIGN(DeoptUint32RegisterInstr);
+};
+
+
+class DeoptUint32StackSlotInstr : public DeoptInstr {
+ public:
+  explicit DeoptUint32StackSlotInstr(intptr_t source_index)
+      : stack_slot_index_(source_index) {
+    ASSERT(stack_slot_index_ >= 0);
+  }
+
+  virtual intptr_t source_index() const { return stack_slot_index_; }
+  virtual DeoptInstr::Kind kind() const { return kUint32StackSlot; }
+
+  virtual const char* ToCString() const {
+    return Isolate::Current()->current_zone()->PrintToString(
+        "uint32 s%" Pd "", stack_slot_index_);
+  }
+
+  void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
+    intptr_t source_index =
+       deopt_context->source_frame_size() - stack_slot_index_ - 1;
+    uint32_t* source_addr = reinterpret_cast<uint32_t*>(
+        deopt_context->GetSourceFrameAddressAt(source_index));
+    int64_t value = Utils::LowHighTo64Bits(*source_addr, 0);
+    if (Smi::IsValid(value)) {
+      *dest_addr = reinterpret_cast<intptr_t>(
+          Smi::New(static_cast<intptr_t>(value)));
+    } else {
+      *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
+      deopt_context->DeferMintMaterialization(
+          value, reinterpret_cast<RawMint**>(dest_addr));
+    }
+  }
+
+ private:
+  const intptr_t stack_slot_index_;  // First argument is 0, always >= 0.
+
+  DISALLOW_COPY_AND_ASSIGN(DeoptUint32StackSlotInstr);
+};
+
+
 // Deoptimization instruction moving an XMM register.
 class DeoptFloat32x4FpuRegisterInstr: public DeoptInstr {
  public:
@@ -1299,6 +1370,10 @@
       bool flip = DeoptMintStackSlotRegisterInstr::Flip::decode(source_index);
       return new DeoptMintStackSlotRegisterInstr(slot, reg_as_int, flip);
     }
+    case kUint32Register:
+      return new DeoptUint32RegisterInstr(source_index);
+    case kUint32StackSlot:
+      return new DeoptUint32StackSlotInstr(source_index);
     case kFloat32x4FpuRegister:
         return new DeoptFloat32x4FpuRegisterInstr(source_index);
     case kFloat64x2FpuRegister:
@@ -1427,8 +1502,12 @@
     intptr_t object_table_index = FindOrAddObjectInTable(source_loc.constant());
     deopt_instr = new(isolate()) DeoptConstantInstr(object_table_index);
   } else if (source_loc.IsRegister()) {
-    ASSERT(value->definition()->representation() == kTagged);
-    deopt_instr = new(isolate()) DeoptRegisterInstr(source_loc.reg());
+    if (value->definition()->representation() == kUnboxedUint32) {
+      deopt_instr = new(isolate()) DeoptUint32RegisterInstr(source_loc.reg());
+    } else {
+      ASSERT(value->definition()->representation() == kTagged);
+      deopt_instr = new(isolate()) DeoptRegisterInstr(source_loc.reg());
+    }
   } else if (source_loc.IsFpuRegister()) {
     if (value->definition()->representation() == kUnboxedDouble) {
       deopt_instr = new(isolate()) DeoptFpuRegisterInstr(source_loc.fpu_reg());
@@ -1444,9 +1523,14 @@
           new(isolate()) DeoptFloat64x2FpuRegisterInstr(source_loc.fpu_reg());
     }
   } else if (source_loc.IsStackSlot()) {
-    ASSERT(value->definition()->representation() == kTagged);
-    intptr_t source_index = CalculateStackIndex(source_loc);
-    deopt_instr = new(isolate()) DeoptStackSlotInstr(source_index);
+    if (value->definition()->representation() == kUnboxedUint32) {
+      intptr_t source_index = CalculateStackIndex(source_loc);
+      deopt_instr = new(isolate()) DeoptUint32StackSlotInstr(source_index);
+    } else {
+      ASSERT(value->definition()->representation() == kTagged);
+      intptr_t source_index = CalculateStackIndex(source_loc);
+      deopt_instr = new(isolate()) DeoptStackSlotInstr(source_index);
+    }
   } else if (source_loc.IsDoubleStackSlot()) {
     ASSERT(value->definition()->representation() == kUnboxedDouble);
     intptr_t source_index = CalculateStackIndex(source_loc);
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 889ce1d..9fcda82 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -237,6 +237,8 @@
     kMintRegisterPair,
     kMintStackSlotPair,
     kMintStackSlotRegister,
+    kUint32Register,
+    kUint32StackSlot,
     kPcMarker,
     kPp,
     kCallerFp,
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index 66c834d..05fdfab 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -241,6 +241,7 @@
     case 0xA5: return "shld";
     case 0xAC:  // Fall through.
     case 0xAD: return "shrd";
+    case 0xA3: return "bt";
     case 0xAB: return "bts";
     case 0xBD: return "bsr";
     case 0xB1: return "cmpxchg";
@@ -1412,8 +1413,8 @@
         } else {
           data += 2;
           if (f0byte == 0xAB || f0byte == 0xA4 || f0byte == 0xA5 ||
-              f0byte == 0xAC || f0byte == 0xAD) {
-            // shrd, shld, bts
+              f0byte == 0xAC || f0byte == 0xAD || f0byte == 0xA3) {
+            // shrd, shld, bts, bt
             Print(f0mnem);
             int mod, regop, rm;
             GetModRm(*data, &mod, &regop, &rm);
@@ -1421,7 +1422,7 @@
             data += PrintRightOperand(data);
             Print(",");
             PrintCPURegister(regop);
-            if (f0byte == 0xAB) {
+            if (f0byte == 0xAB || f0byte == 0xA3) {
               // Done.
             } else if (f0byte == 0xA5 || f0byte == 0xAD) {
               Print(",cl");
@@ -1819,7 +1820,7 @@
   ASSERT(instr_len > 0);  // Ensure progress.
 
   return instr_len;
-}
+}  // NOLINT
 
 
 void Disassembler::DecodeInstruction(char* hex_buffer, intptr_t hex_size,
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index bc267ef..2e95096 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -280,12 +280,11 @@
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
 
-  // The following three operations are part of the 'epilogue' of the
-  // CallToRuntime, CallBootstrapCFunction, and CallNativeCFunction stubs.
-  // In the case of an exception, we skip the epilogues and must set the
-  // correct state here.
-  isolate->set_vm_tag(VMTag::kScriptTagId);
-  isolate->set_top_exit_frame_info(0);
+  // The following operation is part of the 'epilogue' of the CallToRuntime,
+  // CallBootstrapCFunction, and CallNativeCFunction stubs. In the case of an
+  // exception, we skip the epilogues and must set the correct state here.
+  // The other operations performed as part of the 'epilogue' are handled
+  // by the simulator's Longjmp or the JumpToExceptionHandler stub.
   isolate->set_top_context(Context::null());
 
 #if defined(USING_SIMULATOR)
@@ -298,7 +297,7 @@
   // object (may be raw null) in the kStackTraceObjectReg register.
 
   Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer,
-                                raw_exception, raw_stacktrace);
+                                raw_exception, raw_stacktrace, isolate);
 #else
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous frames.
@@ -311,7 +310,8 @@
   // Call a stub to set up the exception object in kExceptionObjectReg,
   // to set up the stacktrace object in kStackTraceObjectReg, and to
   // continue execution at the given pc in the given frame.
-  typedef void (*ExcpHandler)(uword, uword, uword, RawObject*, RawObject*);
+  typedef void (*ExcpHandler)(uword, uword, uword, RawObject*, RawObject*,
+                              Isolate*);
   ExcpHandler func = reinterpret_cast<ExcpHandler>(
       StubCode::JumpToExceptionHandlerEntryPoint());
 
@@ -321,7 +321,7 @@
                                 stack_pointer - current_sp);
 
   func(program_counter, stack_pointer, frame_pointer,
-       raw_exception, raw_stacktrace);
+       raw_exception, raw_stacktrace, isolate);
 #endif
   UNREACHABLE();
 }
@@ -747,10 +747,6 @@
       class_name = &Symbols::AbstractClassInstantiationError();
       constructor_name = &Symbols::DotCreate();
       break;
-    case kMirroredCompilationError:
-      library = Library::MirrorsLibrary();
-      class_name = &Symbols::MirroredCompilationError();
-      break;
   }
 
   return DartLibraryCalls::InstanceCreate(library,
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 4b3330c..5e87e3b 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -65,7 +65,6 @@
     kType,
     kFallThrough,
     kAbstractClassInstantiation,
-    kMirroredCompilationError,
   };
 
   static void ThrowByType(ExceptionType type, const Array& arguments);
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index 406e2d3..e5f0865 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -1150,9 +1150,20 @@
   // Normalize same-as-first-input output if input is specified as
   // fixed register.
   if (locs->out(0).IsUnallocated() &&
-      (locs->out(0).policy() == Location::kSameAsFirstInput) &&
-      (locs->in(0).IsMachineRegister())) {
-    locs->set_out(0, locs->in(0));
+      (locs->out(0).policy() == Location::kSameAsFirstInput)) {
+    if (locs->in(0).IsPairLocation()) {
+      // Pair input, pair output.
+      PairLocation* in_pair = locs->in(0).AsPairLocation();
+      ASSERT(in_pair->At(0).IsMachineRegister() ==
+             in_pair->At(1).IsMachineRegister());
+      if (in_pair->At(0).IsMachineRegister() &&
+          in_pair->At(1).IsMachineRegister()) {
+        locs->set_out(0, Location::Pair(in_pair->At(0), in_pair->At(1)));
+      }
+    } else if (locs->in(0).IsMachineRegister()) {
+      // Single input, single output.
+      locs->set_out(0, locs->in(0));
+    }
   }
 
   const bool output_same_as_first_input =
@@ -2753,6 +2764,9 @@
   if (definition_rep == kUnboxedMint) {
     // kUnboxedMint is split into two ranges, each of which are kUntagged.
     return kUntagged;
+  } else if (definition_rep == kUnboxedUint32) {
+    // kUnboxedUint32 is untagged.
+    return kUntagged;
   }
   return definition_rep;
 }
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index ddd63cb..118093e 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1215,7 +1215,6 @@
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
-  __ LoadImmediate(R4, 0);
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1307,7 +1306,6 @@
     UNIMPLEMENTED();
   }
   ExternalLabel target_label(label_address);
-  __ LoadImmediate(R4, 0);
   __ LoadObject(R5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1317,6 +1315,7 @@
   __ Drop(argument_count);
 #if defined(DEBUG)
   __ LoadImmediate(R4, kInvalidObjectPointer);
+  __ LoadImmediate(R5, kInvalidObjectPointer);
 #endif
 }
 
@@ -1384,8 +1383,6 @@
       __ BranchLinkPatchable(
           &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ LoadImmediate(R4, 0);
-      __ LoadImmediate(R5, 0);
       __ BranchLinkPatchable(
           &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 786c164..8162630 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1220,7 +1220,6 @@
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
-  __ LoadImmediate(R4, 0, kNoPP);
   __ LoadObject(R5, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1312,7 +1311,6 @@
     UNIMPLEMENTED();
   }
   ExternalLabel target_label(label_address);
-  __ LoadImmediate(R4, 0, kNoPP);
   __ LoadObject(R5, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1320,6 +1318,7 @@
                    RawPcDescriptors::kUnoptStaticCall,
                    locs);
 #if defined(DEBUG)
+  __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP);
   __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP);
 #endif
   __ Drop(argument_count);
@@ -1389,8 +1388,6 @@
       __ BranchLinkPatchable(
           &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ LoadImmediate(R4, 0, kNoPP);
-      __ LoadImmediate(R5, 0, kNoPP);
       __ BranchLinkPatchable(
           &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 3e7f69f..bf43fde 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1188,7 +1188,6 @@
     UNIMPLEMENTED();
   }
   ExternalLabel target_label(label_address);
-  __ movl(EDX, Immediate(0));
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1197,6 +1196,7 @@
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
+  __ movl(ECX, Immediate(kInvalidObjectPointer));
   __ movl(EDX, Immediate(kInvalidObjectPointer));
 #endif
 }
@@ -1249,7 +1249,6 @@
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
-  __ movl(EDX, Immediate(0));
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1277,8 +1276,8 @@
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
   Label load_cache;
-  __ movl(EAX, Address(ESP, (argument_count - 1) * kWordSize));
-  __ LoadTaggedClassIdMayBeSmi(EAX, EAX, EBX);
+  __ movl(EBX, Address(ESP, (argument_count - 1) * kWordSize));
+  __ LoadTaggedClassIdMayBeSmi(EAX, EBX);
 
   // EAX: class ID of the receiver (smi).
   __ Bind(&load_cache);
@@ -1393,8 +1392,6 @@
     if (is_optimizing()) {
       __ call(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ movl(EDX, Immediate(0));
-      __ movl(ECX, Immediate(0));
       __ call(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 8041aa5..319a8dd 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1253,7 +1253,6 @@
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ TraceSimMsg("InstanceCall");
-  __ LoadImmediate(S4, 0);
   __ LoadObject(S5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1348,7 +1347,6 @@
     UNIMPLEMENTED();
   }
   ExternalLabel target_label(label_address);
-  __ LoadImmediate(S4, 0);
   __ LoadObject(S5, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1357,6 +1355,7 @@
                    locs);
 #if defined(DEBUG)
   __ LoadImmediate(S4, kInvalidObjectPointer);
+  __ LoadImmediate(S5, kInvalidObjectPointer);
 #endif
   __ Drop(argument_count);
 }
@@ -1432,8 +1431,6 @@
       __ BranchLinkPatchable(
           &stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ LoadImmediate(S4, 0);
-      __ LoadImmediate(S5, 0);
       __ BranchLinkPatchable(
           &stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index a601029..289414e 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1225,7 +1225,6 @@
     UNIMPLEMENTED();
   }
   ExternalLabel target_label(label_address);
-  __ movq(R10, Immediate(0));
   __ LoadObject(RBX, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1234,6 +1233,7 @@
                    locs);
   __ Drop(argument_count);
 #if defined(DEBUG)
+  __ movq(RBX, Immediate(kInvalidObjectPointer));
   __ movq(R10, Immediate(kInvalidObjectPointer));
 #endif
 }
@@ -1286,7 +1286,6 @@
                                          intptr_t token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
-  __ movq(R10, Immediate(0));
   __ LoadObject(RBX, ic_data, PP);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1313,8 +1312,8 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  __ movq(RAX, Address(RSP, (argument_count - 1) * kWordSize));
-  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+  __ movq(RBX, Address(RSP, (argument_count - 1) * kWordSize));
+  __ LoadTaggedClassIdMayBeSmi(RAX, RBX);
 
   // RAX: class ID of the receiver (smi).
   __ LoadObject(RBX, cache, PP);
@@ -1429,8 +1428,6 @@
     if (is_optimizing()) {
       __ CallPatchable(&stub_code->OptimizedIdenticalWithNumberCheckLabel());
     } else {
-      __ movq(R10, Immediate(0));
-      __ movq(RBX, Immediate(0));
       __ CallPatchable(&stub_code->UnoptimizedIdenticalWithNumberCheckLabel());
     }
     if (token_pos != Scanner::kNoSourcePos) {
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index c11fe36..361a67e 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -1319,6 +1319,7 @@
       RedefinitionInstr(actual->Copy(isolate()));
   redefinition->set_ssa_temp_index(
       owner_->caller_graph()->alloc_ssa_temp_index());
+  redefinition->UpdateType(CompileType::FromCid(receiver_cid));
   redefinition->InsertAfter(callee_graph->graph_entry()->normal_entry());
   Definition* stub = (*call_data.parameter_stubs)[0];
   stub->ReplaceUsesWith(redefinition);
@@ -1433,40 +1434,20 @@
     // 1. Guard the body with a class id check.
     if ((i == (inlined_variants_.length() - 1)) &&
         non_inlined_variants_.is_empty()) {
-      // If it is the last variant use a check class or check smi
-      // instruction which can deoptimize, followed unconditionally by the
-      // body.  Check a redefinition of the receiver, to prevent the check
-      // from being hoisted.
-      RedefinitionInstr* redefinition =
-          new(isolate()) RedefinitionInstr(new(isolate()) Value(receiver));
-      redefinition->set_ssa_temp_index(
+      // If it is the last variant use a check class id instruction which can
+      // deoptimize, followed unconditionally by the body.
+      RedefinitionInstr* cid_redefinition =
+          new RedefinitionInstr(new(isolate()) Value(load_cid));
+      cid_redefinition->set_ssa_temp_index(
           owner_->caller_graph()->alloc_ssa_temp_index());
-      cursor = AppendInstruction(cursor, redefinition);
-      if (inlined_variants_[i].cid == kSmiCid) {
-        CheckSmiInstr* check_smi =
-            new CheckSmiInstr(new Value(redefinition),
-                              call_->deopt_id(),
-                              call_->token_pos());
-        check_smi->InheritDeoptTarget(isolate(), call_);
-        cursor = AppendInstruction(cursor, check_smi);
-      } else {
-        const ICData& old_checks = call_->ic_data();
-        const ICData& new_checks = ICData::ZoneHandle(
-            ICData::New(Function::Handle(old_checks.owner()),
-                        String::Handle(old_checks.target_name()),
-                        Array::Handle(old_checks.arguments_descriptor()),
-                        old_checks.deopt_id(),
-                        1));  // Number of args tested.
-        new_checks.AddReceiverCheck(inlined_variants_[i].cid,
-                                    *inlined_variants_[i].target);
-        CheckClassInstr* check_class =
-            new CheckClassInstr(new Value(redefinition),
-                                call_->deopt_id(),
-                                new_checks,
-                                call_->token_pos());
-        check_class->InheritDeoptTarget(isolate(), call_);
-        cursor = AppendInstruction(cursor, check_class);
-      }
+      cursor = AppendInstruction(cursor, cid_redefinition);
+      CheckClassIdInstr* check_class_id = new(isolate()) CheckClassIdInstr(
+          new(isolate()) Value(cid_redefinition),
+          inlined_variants_[i].cid,
+          call_->deopt_id());
+      check_class_id->InheritDeoptTarget(isolate(), call_);
+      cursor = AppendInstruction(cursor, check_class_id);
+
       // The next instruction is the first instruction of the inlined body.
       // Handle the two possible cases (unshared and shared subsequent
       // predecessors) separately.
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 3eddfed..fa5db4d 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -44,6 +44,8 @@
 DEFINE_FLAG(bool, truncating_left_shift, true,
     "Optimize left shift to truncate if possible");
 DEFINE_FLAG(bool, use_cha, true, "Use class hierarchy analysis.");
+DEFINE_FLAG(bool, trace_integer_ir_selection, false,
+    "Print integer IR selection optimization pass.");
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, source_lines);
 DECLARE_FLAG(bool, trace_type_check_elimination);
@@ -608,10 +610,12 @@
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
     converted = new(I) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
-
   } else if ((from == kUnboxedMint) && (to == kTagged)) {
     converted = new(I) BoxIntegerInstr(use->CopyWithType());
-
+  } else if ((from == kUnboxedMint) && (to == kUnboxedUint32)) {
+    converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
+  } else if ((from == kUnboxedUint32) && (to == kUnboxedMint)) {
+    converted = new(I) UnboxedIntConverterInstr(from, to, use->CopyWithType());
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
@@ -1655,10 +1659,9 @@
   intptr_t deopt_id = Isolate::kNoDeoptId;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
       (array_cid == kTypedDataUint32ArrayCid)) {
-    // Set deopt_id if we can optimistically assume that the result is Smi.
-    // Assume mixed Mint/Smi if this instruction caused deoptimization once.
-    deopt_id = ic_data.HasDeoptReasons() ?
-        Isolate::kNoDeoptId : call->deopt_id();
+    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
+    // generate Mint on 32-bit architectures.
+    deopt_id = (kSmiBits < 32) ? Isolate::kNoDeoptId : call->deopt_id();
   }
 
   // Array load and return.
@@ -3567,10 +3570,9 @@
   intptr_t deopt_id = Isolate::kNoDeoptId;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
       (array_cid == kTypedDataUint32ArrayCid)) {
-    // Set deopt_id if we can optimistically assume that the result is Smi.
-    // Assume mixed Mint/Smi if this instruction caused deoptimization once.
-    deopt_id = ic_data.HasDeoptReasons() ?
-        Isolate::kNoDeoptId : call->deopt_id();
+    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
+    // generate Mint on 32-bit architectures.
+    deopt_id = (kSmiBits < 32) ? Isolate::kNoDeoptId : call->deopt_id();
   }
 
   *last = new(I) LoadIndexedInstr(new(I) Value(array),
@@ -3649,10 +3651,9 @@
     }
     case kTypedDataInt32ArrayCid:
     case kTypedDataUint32ArrayCid:
-      // We don't have ICData for the value stored, so we optimistically assume
-      // smis first. If we ever deoptimized here, we require to unbox the value
-      // before storing to handle the mint case, too.
-      if (!i_call->ic_data()->HasDeoptReasons()) {
+    // Prevent excessive deoptimization, assume full 32 bits used, and therefore
+    // generate Mint on 32-bit architectures.
+    if (kSmiBits >= 32) {
         value_check = ICData::New(flow_graph_->parsed_function().function(),
                                   i_call->function_name(),
                                   Object::empty_array(),  // Dummy args. descr.
@@ -4515,7 +4516,290 @@
 }
 
 
-// Range analysis for smi values.
+// Replaces Mint IL instructions with Uint32 IL instructions
+// when possible. Uses output of RangeAnalysis.
+class IntegerInstructionSelector : public ValueObject {
+ public:
+  explicit IntegerInstructionSelector(FlowGraph* flow_graph)
+      : flow_graph_(flow_graph),
+        isolate_(NULL) {
+    ASSERT(flow_graph_ != NULL);
+    isolate_ = flow_graph_->isolate();
+    ASSERT(isolate_ != NULL);
+    selected_uint32_defs_ =
+        new(I) BitVector(flow_graph_->current_ssa_temp_index());
+  }
+
+  void Select();
+
+ private:
+  bool IsPotentialUint32Definition(Definition* def);
+  void FindPotentialUint32Definitions();
+  bool IsUint32NarrowingDefinition(Definition* def);
+  void FindUint32NarrowingDefinitions();
+  bool AllUsesAreUint32Narrowing(Value* list_head);
+  bool CanBecomeUint32(Definition* def);
+  void Propagate();
+  Definition* ConstructReplacementFor(Definition* def);
+  void ReplaceInstructions();
+
+  Isolate* isolate() const { return isolate_; }
+
+  GrowableArray<Definition*> potential_uint32_defs_;
+  BitVector* selected_uint32_defs_;
+
+  FlowGraph* flow_graph_;
+  Isolate* isolate_;
+};
+
+
+void IntegerInstructionSelector::Select() {
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("---- starting integer ir selection -------\n");
+  }
+  FindPotentialUint32Definitions();
+  FindUint32NarrowingDefinitions();
+  Propagate();
+  ReplaceInstructions();
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("---- after integer ir selection -------\n");
+    FlowGraphPrinter printer(*flow_graph_);
+    printer.PrintBlocks();
+  }
+}
+
+
+bool IntegerInstructionSelector::IsPotentialUint32Definition(Definition* def) {
+  // TODO(johnmccutchan): Consider Smi operations, to avoid unnecessary tagging
+  // & untagged of intermediate results.
+  // TODO(johnmccutchan): Consider phis.
+  return def->IsBoxInteger()   ||   // BoxMint.
+         def->IsUnboxInteger() ||   // UnboxMint.
+         def->IsBinaryMintOp() ||
+         def->IsShiftMintOp()  ||
+         def->IsUnaryMintOp();
+}
+
+
+void IntegerInstructionSelector::FindPotentialUint32Definitions() {
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("++++ Finding potential Uint32 definitions:\n");
+  }
+
+  for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
+       !block_it.Done();
+       block_it.Advance()) {
+    BlockEntryInstr* block = block_it.Current();
+
+    for (ForwardInstructionIterator instr_it(block);
+         !instr_it.Done();
+         instr_it.Advance()) {
+      Instruction* current = instr_it.Current();
+      Definition* defn = current->AsDefinition();
+      if ((defn != NULL) && (defn->ssa_temp_index() != -1)) {
+        if (IsPotentialUint32Definition(defn)) {
+          if (FLAG_trace_integer_ir_selection) {
+           OS::Print("Adding %s\n", current->ToCString());
+          }
+          potential_uint32_defs_.Add(defn);
+        }
+      }
+    }
+  }
+}
+
+
+// BinaryMintOp masks and stores into unsigned typed arrays that truncate the
+// value into a Uint32 range.
+bool IntegerInstructionSelector::IsUint32NarrowingDefinition(Definition* def) {
+  if (def->IsBinaryMintOp()) {
+    BinaryMintOpInstr* op = def->AsBinaryMintOp();
+    // Must be a mask operation.
+    if (op->op_kind() != Token::kBIT_AND) {
+      return false;
+    }
+    Range* range = op->range();
+    if ((range == NULL) ||
+        !range->IsWithin(0, static_cast<int64_t>(kMaxUint32))) {
+      return false;
+    }
+    return true;
+  }
+  // TODO(johnmccutchan): Add typed array stores.
+  return false;
+}
+
+
+void IntegerInstructionSelector::FindUint32NarrowingDefinitions() {
+  ASSERT(selected_uint32_defs_ != NULL);
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("++++ Selecting Uint32 definitions:\n");
+    OS::Print("++++ Initial set:\n");
+  }
+  for (intptr_t i = 0; i < potential_uint32_defs_.length(); i++) {
+    Definition* defn = potential_uint32_defs_[i];
+    if (IsUint32NarrowingDefinition(defn)) {
+      if (FLAG_trace_integer_ir_selection) {
+        OS::Print("Adding %s\n", defn->ToCString());
+      }
+      selected_uint32_defs_->Add(defn->ssa_temp_index());
+    }
+  }
+}
+
+
+bool IntegerInstructionSelector::AllUsesAreUint32Narrowing(Value* list_head) {
+  for (Value::Iterator it(list_head);
+       !it.Done();
+       it.Advance()) {
+    Value* use = it.Current();
+    Definition* defn = use->instruction()->AsDefinition();
+    if ((defn == NULL) ||
+        (defn->ssa_temp_index() == -1) ||
+        !selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool IntegerInstructionSelector::CanBecomeUint32(Definition* def) {
+  ASSERT(IsPotentialUint32Definition(def));
+  if (def->IsBoxInteger()) {
+    // If a BoxInteger's input is a candidate, the box is a candidate.
+    BoxIntegerInstr* box = def->AsBoxInteger();
+    Definition* box_input = box->value()->definition();
+    return selected_uint32_defs_->Contains(box_input->ssa_temp_index());
+  }
+  // A right shift with an input outside of Uint32 range cannot be converted
+  // because we need the high bits.
+  if (def->IsShiftMintOp()) {
+    ShiftMintOpInstr* op = def->AsShiftMintOp();
+    if (op->op_kind() == Token::kSHR) {
+      Definition* shift_input = op->left()->definition();
+      ASSERT(shift_input != NULL);
+      Range* range = shift_input->range();
+      if ((range == NULL) ||
+          !range->IsWithin(0, static_cast<int64_t>(kMaxUint32))) {
+        return false;
+      }
+    }
+  }
+  if (!def->HasUses()) {
+    // No uses, skip.
+    return false;
+  }
+  return AllUsesAreUint32Narrowing(def->input_use_list()) &&
+         AllUsesAreUint32Narrowing(def->env_use_list());
+}
+
+
+void IntegerInstructionSelector::Propagate() {
+  ASSERT(selected_uint32_defs_ != NULL);
+  bool changed = true;
+  intptr_t iteration = 0;
+  while (changed) {
+    if (FLAG_trace_integer_ir_selection) {
+      OS::Print("+++ Iteration: %" Pd "\n", iteration++);
+    }
+    changed = false;
+    for (intptr_t i = 0; i < potential_uint32_defs_.length(); i++) {
+      Definition* defn = potential_uint32_defs_[i];
+      if (selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
+        // Already marked as a candidate, skip.
+        continue;
+      }
+      if (defn->IsConstant()) {
+        // Skip constants.
+        continue;
+      }
+      if (CanBecomeUint32(defn)) {
+        if (FLAG_trace_integer_ir_selection) {
+          OS::Print("Adding %s\n", defn->ToCString());
+        }
+        // Found a new candidate.
+        selected_uint32_defs_->Add(defn->ssa_temp_index());
+        // Haven't reached fixed point yet.
+        changed = true;
+      }
+    }
+  }
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("Reached fixed point\n");
+  }
+}
+
+
+Definition* IntegerInstructionSelector::ConstructReplacementFor(
+    Definition* def) {
+  // Should only see mint definitions.
+  ASSERT(IsPotentialUint32Definition(def));
+  // Should not see constant instructions.
+  ASSERT(!def->IsConstant());
+  if (def->IsBinaryMintOp()) {
+    BinaryMintOpInstr* op = def->AsBinaryMintOp();
+    Token::Kind op_kind = op->op_kind();
+    Value* left = op->left()->CopyWithType();
+    Value* right = op->right()->CopyWithType();
+    intptr_t deopt_id = op->DeoptimizationTarget();
+    return new(I) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+  } else if (def->IsBoxInteger()) {
+    BoxIntegerInstr* box = def->AsBoxInteger();
+    Value* value = box->value()->CopyWithType();
+    return new(I) BoxUint32Instr(value);
+  } else if (def->IsUnboxInteger()) {
+    UnboxIntegerInstr* unbox = def->AsUnboxInteger();
+    Value* value = unbox->value()->CopyWithType();
+    intptr_t deopt_id = unbox->deopt_id();
+    return new(I) UnboxUint32Instr(value, deopt_id);
+  } else if (def->IsUnaryMintOp()) {
+    UnaryMintOpInstr* op = def->AsUnaryMintOp();
+    Token::Kind op_kind = op->op_kind();
+    Value* value = op->value()->CopyWithType();
+    intptr_t deopt_id = op->DeoptimizationTarget();
+    return new(I) UnaryUint32OpInstr(op_kind, value, deopt_id);
+  } else if (def->IsShiftMintOp()) {
+    ShiftMintOpInstr* op = def->AsShiftMintOp();
+    Token::Kind op_kind = op->op_kind();
+    Value* left = op->left()->CopyWithType();
+    Value* right = op->right()->CopyWithType();
+    intptr_t deopt_id = op->DeoptimizationTarget();
+    return new(I) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+  }
+  UNREACHABLE();
+  return NULL;
+}
+
+
+void IntegerInstructionSelector::ReplaceInstructions() {
+  if (FLAG_trace_integer_ir_selection) {
+    OS::Print("++++ Replacing instructions:\n");
+  }
+  for (intptr_t i = 0; i < potential_uint32_defs_.length(); i++) {
+    Definition* defn = potential_uint32_defs_[i];
+    if (!selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
+      // Not a candidate.
+      continue;
+    }
+    Definition* replacement = ConstructReplacementFor(defn);
+    ASSERT(replacement != NULL);
+    if (FLAG_trace_integer_ir_selection) {
+      OS::Print("Replacing %s with %s\n", defn->ToCString(),
+                                          replacement->ToCString());
+    }
+    defn->ReplaceWith(replacement, NULL);
+    ASSERT(flow_graph_->VerifyUseLists());
+  }
+}
+
+void FlowGraphOptimizer::SelectIntegerInstructions() {
+  IntegerInstructionSelector iis(flow_graph_);
+  iis.Select();
+}
+
+
+// Range analysis for integer values.
 class RangeAnalysis : public ValueObject {
  public:
   explicit RangeAnalysis(FlowGraph* flow_graph)
@@ -4624,6 +4908,8 @@
   CollectValues();
   InsertConstraints();
   InferRanges();
+  IntegerInstructionSelector iis(flow_graph_);
+  iis.Select();
   RemoveConstraints();
 }
 
@@ -7862,6 +8148,8 @@
 
 void ConstantPropagator::VisitCheckClass(CheckClassInstr* instr) { }
 
+void ConstantPropagator::VisitCheckClassId(CheckClassIdInstr* instr) { }
+
 void ConstantPropagator::VisitGuardFieldClass(GuardFieldClassInstr* instr) { }
 
 void ConstantPropagator::VisitGuardFieldLength(GuardFieldLengthInstr* instr) { }
@@ -8485,6 +8773,24 @@
 }
 
 
+void ConstantPropagator::TruncateInteger(Definition* defn, int64_t mask) {
+  const Object& value = defn->constant_value();
+  if (IsNonConstant(value)) {
+    return;
+  }
+  ASSERT(IsConstant(value));
+  if (!value.IsInteger()) {
+    return;
+  }
+  const Integer& value_int = Integer::Cast(value);
+  int64_t truncated = value_int.AsInt64Value() & mask;
+  Instance& result = Integer::ZoneHandle(I, Integer::New(truncated));
+  result = result.CheckAndCanonicalize(NULL);
+  ASSERT(!result.IsNull());
+  SetValue(defn, result);
+}
+
+
 void ConstantPropagator::VisitBinarySmiOp(BinarySmiOpInstr* instr) {
   HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
 }
@@ -8917,6 +9223,42 @@
 }
 
 
+void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
+  // TODO(kmillikin): Handle box operation.
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitUnboxUint32(UnboxUint32Instr* instr) {
+  // TODO(kmillikin): Handle unbox operation.
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitUnboxedIntConverter(
+    UnboxedIntConverterInstr* instr) {
+  SetValue(instr, non_constant_);
+}
+
+
+void ConstantPropagator::VisitBinaryUint32Op(BinaryUint32OpInstr* instr) {
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+  TruncateInteger(instr, static_cast<int64_t>(0xFFFFFFFF));
+}
+
+
+void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
+  HandleBinaryOp(instr, instr->op_kind(), *instr->left(), *instr->right());
+  TruncateInteger(instr, static_cast<int64_t>(0xFFFFFFFF));
+}
+
+
+void ConstantPropagator::VisitUnaryUint32Op(UnaryUint32OpInstr* instr) {
+  // TODO(kmillikin): Handle unary operations.
+  SetValue(instr, non_constant_);
+}
+
+
 void ConstantPropagator::Analyze() {
   GraphEntryInstr* entry = graph_->graph_entry();
   reachable_->Add(entry->preorder_number());
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index 7f0e220..3aecb91 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -43,6 +43,8 @@
 
   void InferIntRanges();
 
+  void SelectIntegerInstructions();
+
   void AnalyzeTryCatch();
 
   bool TryInlineRecognizedMethod(intptr_t receiver_cid,
@@ -356,6 +358,8 @@
                       const Value& left,
                       const Value& right);
 
+  void TruncateInteger(Definition* instr, int64_t mask);
+
   virtual void VisitBlocks() { UNREACHABLE(); }
 
 #define DECLARE_VISIT(type) virtual void Visit##type(type##Instr* instr);
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 9a68f26..9f3e942 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -276,6 +276,15 @@
 }
 
 
+void FlowGraphTypePropagator::VisitCheckClassId(CheckClassIdInstr* check) {
+  LoadClassIdInstr* load_cid =
+      check->value()->definition()->OriginalDefinition()->AsLoadClassId();
+  if (load_cid != NULL) {
+    SetCid(load_cid->object()->definition(), check->cid());
+  }
+}
+
+
 void FlowGraphTypePropagator::VisitGuardFieldClass(
     GuardFieldClassInstr* guard) {
   const intptr_t cid = guard->field().guarded_cid();
@@ -1327,5 +1336,4 @@
   return CompileType::FromCid(definition_cid_);
 }
 
-
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_type_propagator.h b/runtime/vm/flow_graph_type_propagator.h
index 95b19bf..60bad97 100644
--- a/runtime/vm/flow_graph_type_propagator.h
+++ b/runtime/vm/flow_graph_type_propagator.h
@@ -29,6 +29,7 @@
   virtual void VisitJoinEntry(JoinEntryInstr* instr);
   virtual void VisitCheckSmi(CheckSmiInstr* instr);
   virtual void VisitCheckClass(CheckClassInstr* instr);
+  virtual void VisitCheckClassId(CheckClassIdInstr* instr);
   virtual void VisitGuardFieldClass(GuardFieldClassInstr* instr);
 
   // Current reaching type of the definition. Valid only during dominator tree
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 181b017..01f345c 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -862,6 +862,28 @@
 }
 
 
+void BinaryUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+}
+
+
+void ShiftUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  left()->PrintTo(f);
+  f->Print(", ");
+  right()->PrintTo(f);
+}
+
+
+void UnaryUint32OpInstr::PrintOperandsTo(BufferFormatter* f) const {
+  f->Print("%s, ", Token::Str(op_kind()));
+  value()->PrintTo(f);
+}
+
+
 void UnarySmiOpInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("%s, ", Token::Str(op_kind()));
   value()->PrintTo(f);
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 552fcfa..e23603f 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -95,11 +95,19 @@
 }
 
 
+static int LowestFirst(const intptr_t* a, const intptr_t* b) {
+  return *a - *b;
+}
+
+
 CheckClassInstr::CheckClassInstr(Value* value,
                                  intptr_t deopt_id,
                                  const ICData& unary_checks,
                                  intptr_t token_pos)
-    : unary_checks_(unary_checks), licm_hoisted_(false), token_pos_(token_pos) {
+    : unary_checks_(unary_checks),
+      cids_(unary_checks.NumberOfChecks()),
+      licm_hoisted_(false),
+      token_pos_(token_pos) {
   ASSERT(unary_checks.IsZoneHandle());
   // Expected useful check data.
   ASSERT(!unary_checks_.IsNull());
@@ -110,6 +118,10 @@
   // Otherwise use CheckSmiInstr.
   ASSERT((unary_checks_.NumberOfChecks() != 1) ||
          (unary_checks_.GetReceiverClassIdAt(0) != kSmiCid));
+  for (intptr_t i = 0; i < unary_checks.NumberOfChecks(); ++i) {
+    cids_.Add(unary_checks.GetReceiverClassIdAt(i));
+  }
+  cids_.Sort(LowestFirst);
 }
 
 
@@ -140,6 +152,14 @@
 }
 
 
+EffectSet CheckClassIdInstr::Dependencies() const {
+  // Externalization of strings via the API can change the class-id.
+  const bool externalizable =
+      cid_ == kOneByteStringCid || cid_ == kTwoByteStringCid;
+  return externalizable ? EffectSet::Externalization() : EffectSet::None();
+}
+
+
 bool CheckClassInstr::IsNullCheck() const {
   if (unary_checks().NumberOfChecks() != 1) {
     return false;
@@ -152,6 +172,33 @@
 }
 
 
+bool CheckClassInstr::IsDenseSwitch() const {
+  if (unary_checks().GetReceiverClassIdAt(0) == kSmiCid) return false;
+  if (cids_.length() > 2 &&
+      cids_[cids_.length() - 1] - cids_[0] < kBitsPerWord) {
+    return true;
+  }
+  return false;
+}
+
+
+intptr_t CheckClassInstr::ComputeCidMask() const {
+  ASSERT(IsDenseSwitch());
+  intptr_t mask = 0;
+  for (intptr_t i = 0; i < cids_.length(); ++i) {
+    mask |= 1 << (cids_[i] - cids_[0]);
+  }
+  return mask;
+}
+
+
+bool CheckClassInstr::IsDenseMask(intptr_t mask) {
+  // Returns true if the mask is a continuos sequence of ones in its binary
+  // representation (i.e. no holes)
+  return mask == -1 || Utils::IsPowerOfTwo(mask + 1);
+}
+
+
 bool LoadFieldInstr::IsUnboxedLoad() const {
   return FLAG_unbox_numeric_fields
       && (field() != NULL)
@@ -337,6 +384,41 @@
       FlowGraphBuilder::FindDoubleConstant(Double::Cast(value).value());
 }
 
+
+bool Value::BindsTo32BitMaskConstant() const {
+  if (!definition()->IsUnboxInteger() || !definition()->IsUnboxUint32()) {
+    return false;
+  }
+  // Two cases to consider: UnboxInteger and UnboxUint32.
+  if (definition()->IsUnboxInteger()) {
+    UnboxIntegerInstr* instr = definition()->AsUnboxInteger();
+    if (!instr->value()->BindsToConstant()) {
+      return false;
+    }
+    const Object& obj = instr->value()->BoundConstant();
+    if (!obj.IsMint()) {
+      return false;
+    }
+    Mint& mint = Mint::Handle();
+    mint ^= obj.raw();
+    return mint.value() == kMaxUint32;
+  } else if (definition()->IsUnboxUint32()) {
+    UnboxUint32Instr* instr = definition()->AsUnboxUint32();
+    if (!instr->value()->BindsToConstant()) {
+      return false;
+    }
+    const Object& obj = instr->value()->BoundConstant();
+    if (!obj.IsMint()) {
+      return false;
+    }
+    Mint& mint = Mint::Handle();
+    mint ^= obj.raw();
+    return mint.value() == kMaxUint32;
+  }
+  return false;
+}
+
+
 // Returns true if the value represents a constant.
 bool Value::BindsToConstant() const {
   return definition()->IsConstant();
@@ -1266,7 +1348,7 @@
 }
 
 
-static bool ToIntegerConstant(Value* value, intptr_t* result) {
+static bool ToIntegerConstant(Value* value, int64_t* result) {
   if (!value->BindsToConstant()) {
     if (value->definition()->IsUnboxDouble()) {
       return ToIntegerConstant(value->definition()->AsUnboxDouble()->value(),
@@ -1278,28 +1360,36 @@
   const Object& constant = value->BoundConstant();
   if (constant.IsDouble()) {
     const Double& double_constant = Double::Cast(constant);
-    *result = static_cast<intptr_t>(double_constant.value());
+    *result = static_cast<int64_t>(double_constant.value());
     return (static_cast<double>(*result) == double_constant.value());
   } else if (constant.IsSmi()) {
     *result = Smi::Cast(constant).Value();
     return true;
+  } else if (constant.IsMint()) {
+    *result = Mint::Cast(constant).value();
+    return true;
   }
 
   return false;
 }
 
 
-static Definition* CanonicalizeCommutativeArithmetic(Token::Kind op,
-                                                     intptr_t cid,
-                                                     Value* left,
-                                                     Value* right) {
+static Definition* CanonicalizeCommutativeArithmetic(
+    Token::Kind op,
+    intptr_t cid,
+    Value* left,
+    Value* right,
+    int64_t mask = static_cast<int64_t>(0xFFFFFFFFFFFFFFFFLL)) {
   ASSERT((cid == kSmiCid) || (cid == kDoubleCid) || (cid == kMintCid));
 
-  intptr_t left_value;
+  int64_t left_value;
   if (!ToIntegerConstant(left, &left_value)) {
     return NULL;
   }
 
+  // Apply truncation mask to left_value.
+  left_value &= mask;
+
   switch (op) {
     case Token::kMUL:
       if (left_value == 1) {
@@ -1330,7 +1420,7 @@
       ASSERT(cid != kDoubleCid);
       if (left_value == 0) {
         return left->definition();
-      } else if (left_value == -1) {
+      } else if (left_value == mask) {
         return right->definition();
       }
       break;
@@ -1338,7 +1428,7 @@
       ASSERT(cid != kDoubleCid);
       if (left_value == 0) {
         return right->definition();
-      } else if (left_value == -1) {
+      } else if (left_value == mask) {
         return left->definition();
       }
       break;
@@ -1464,6 +1554,33 @@
 }
 
 
+Definition* BinaryUint32OpInstr::Canonicalize(FlowGraph* flow_graph) {
+  Definition* result = NULL;
+
+  const int64_t truncation_mask = static_cast<int64_t>(0xFFFFFFFF);
+
+  result = CanonicalizeCommutativeArithmetic(op_kind(),
+                                             kMintCid,
+                                             left(),
+                                             right(),
+                                             truncation_mask);
+  if (result != NULL) {
+    return result;
+  }
+
+  result = CanonicalizeCommutativeArithmetic(op_kind(),
+                                             kMintCid,
+                                             right(),
+                                             left(),
+                                             truncation_mask);
+  if (result != NULL) {
+    return result;
+  }
+
+  return this;
+}
+
+
 // Optimizations that eliminate or simplify individual instructions.
 Instruction* Instruction::Canonicalize(FlowGraph* flow_graph) {
   return this;
@@ -1963,6 +2080,18 @@
 }
 
 
+Instruction* CheckClassIdInstr::Canonicalize(FlowGraph* flow_graph) {
+  if (value()->BindsToConstant()) {
+    const Object& constant_value = value()->BoundConstant();
+    if (constant_value.IsSmi() &&
+        Smi::Cast(constant_value).Value() == cid_) {
+      return NULL;
+    }
+  }
+  return this;
+}
+
+
 Instruction* GuardFieldClassInstr::Canonicalize(FlowGraph* flow_graph) {
   if (field().guarded_cid() == kDynamicCid) {
     return NULL;  // Nothing to guard.
@@ -2485,8 +2614,9 @@
 RangeBoundary RangeBoundary::Add(const RangeBoundary& a,
                                  const RangeBoundary& b,
                                  const RangeBoundary& overflow) {
-  ASSERT(a.IsConstant() && b.IsConstant());
+  if (a.IsInfinity() || b.IsInfinity()) return overflow;
 
+  ASSERT(a.IsConstant() && b.IsConstant());
   if (Utils::WillAddOverflow(a.ConstantValue(), b.ConstantValue())) {
     return overflow;
   }
@@ -2500,8 +2630,8 @@
 RangeBoundary RangeBoundary::Sub(const RangeBoundary& a,
                                  const RangeBoundary& b,
                                  const RangeBoundary& overflow) {
+  if (a.IsInfinity() || b.IsInfinity()) return overflow;
   ASSERT(a.IsConstant() && b.IsConstant());
-
   if (Utils::WillSubOverflow(a.ConstantValue(), b.ConstantValue())) {
     return overflow;
   }
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index de943f0..1606207 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -581,6 +581,9 @@
 
   bool IsSmiValue() { return Type()->ToCid() == kSmiCid; }
 
+  // Returns true if this value binds to the constant: 0xFFFFFFFF.
+  bool BindsTo32BitMaskConstant() const;
+
   // Return true if the value represents a constant.
   bool BindsToConstant() const;
 
@@ -724,6 +727,7 @@
   M(DoubleToFloat)                                                             \
   M(FloatToDouble)                                                             \
   M(CheckClass)                                                                \
+  M(CheckClassId)                                                              \
   M(CheckSmi)                                                                  \
   M(Constant)                                                                  \
   M(UnboxedConstant)                                                           \
@@ -788,6 +792,12 @@
   M(Float64x2ZeroArg)                                                          \
   M(Float64x2OneArg)                                                           \
   M(ExtractNthOutput)                                                          \
+  M(BinaryUint32Op)                                                            \
+  M(ShiftUint32Op)                                                             \
+  M(UnaryUint32Op)                                                             \
+  M(BoxUint32)                                                                 \
+  M(UnboxUint32)                                                               \
+  M(UnboxedIntConverter)                                                       \
 
 
 #define FORWARD_DECLARATION(type) class type##Instr;
@@ -1104,6 +1114,7 @@
   friend class MathUnaryInstr;
   friend class MathMinMaxInstr;
   friend class CheckClassInstr;
+  friend class CheckClassIdInstr;
   friend class GuardFieldInstr;
   friend class CheckSmiInstr;
   friend class CheckArrayBoundInstr;
@@ -1131,6 +1142,10 @@
   friend class RelationalOpInstr;
   friend class EqualityCompareInstr;
   friend class TestCidsInstr;
+  friend class BinaryUint32OpInstr;
+  friend class UnaryUint32OpInstr;
+  friend class ShiftUint32OpInstr;
+  friend class UnboxUint32Instr;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -5292,6 +5307,7 @@
     return kUnboxedMint;
   }
 
+  intptr_t deopt_id() const { return deopt_id_; }
 
   virtual void InferRange();
 
@@ -7047,9 +7063,9 @@
 class BinaryMintOpInstr : public TemplateDefinition<2> {
  public:
   BinaryMintOpInstr(Token::Kind op_kind,
-                           Value* left,
-                           Value* right,
-                           intptr_t deopt_id)
+                    Value* left,
+                    Value* right,
+                    intptr_t deopt_id)
       : op_kind_(op_kind), can_overflow_(true) {
     SetInputAt(0, left);
     SetInputAt(1, right);
@@ -7893,12 +7909,18 @@
 
   const ICData& unary_checks() const { return unary_checks_; }
 
+  const GrowableArray<intptr_t>& cids() const { return cids_; }
+
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   bool IsNullCheck() const;
 
+  bool IsDenseSwitch() const;
+  intptr_t ComputeCidMask() const;
+  static bool IsDenseMask(intptr_t mask);
+
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const;
@@ -7910,6 +7932,7 @@
 
  private:
   const ICData& unary_checks_;
+  GrowableArray<intptr_t> cids_;  // Sorted, lowest first.
   bool licm_hoisted_;
   const intptr_t token_pos_;
 
@@ -7951,6 +7974,39 @@
 };
 
 
+class CheckClassIdInstr : public TemplateInstruction<1> {
+ public:
+  CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) : cid_(cid) {
+    SetInputAt(0, value);
+    // Override generated deopt-id.
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+  intptr_t cid() const { return cid_; }
+
+  DECLARE_INSTRUCTION(CheckClassId)
+
+  virtual intptr_t ArgumentCount() const { return 0; }
+
+  virtual bool CanDeoptimize() const { return true; }
+
+  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const;
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  intptr_t cid_;
+
+  DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr);
+};
+
+
 class CheckArrayBoundInstr : public TemplateInstruction<2> {
  public:
   CheckArrayBoundInstr(Value* length, Value* index, intptr_t deopt_id) {
@@ -7996,6 +8052,299 @@
 };
 
 
+class BinaryUint32OpInstr : public TemplateDefinition<2> {
+ public:
+  BinaryUint32OpInstr(Token::Kind op_kind,
+                      Value* left,
+                      Value* right,
+                      intptr_t deopt_id)
+      : op_kind_(op_kind) {
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+    // Override generated deopt-id.
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  Token::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const {
+    return false;
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return kUnboxedUint32;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
+
+  DECLARE_INSTRUCTION(BinaryUint32Op)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    ASSERT(other->IsBinaryUint32Op());
+    return op_kind() == other->AsBinaryUint32Op()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
+};
+
+
+class ShiftUint32OpInstr : public TemplateDefinition<2> {
+ public:
+  ShiftUint32OpInstr(Token::Kind op_kind,
+                     Value* left,
+                     Value* right,
+                     intptr_t deopt_id)
+      : op_kind_(op_kind) {
+    ASSERT(op_kind == Token::kSHR || op_kind == Token::kSHL);
+    SetInputAt(0, left);
+    SetInputAt(1, right);
+    // Override generated deopt-id.
+    deopt_id_ = deopt_id;
+  }
+
+  Value* left() const { return inputs_[0]; }
+  Value* right() const { return inputs_[1]; }
+
+  Token::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const {
+    return true;
+  }
+
+  virtual CompileType ComputeType() const;
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT((idx == 0) || (idx == 1));
+    return (idx == 0) ? kUnboxedUint32 : kTagged;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(ShiftUint32Op)
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return op_kind() == other->AsShiftUint32Op()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
+};
+
+
+class UnaryUint32OpInstr : public TemplateDefinition<1> {
+ public:
+  UnaryUint32OpInstr(Token::Kind op_kind,
+                     Value* value,
+                     intptr_t deopt_id)
+      : op_kind_(op_kind) {
+    ASSERT(op_kind == Token::kBIT_NOT);
+    SetInputAt(0, value);
+    // Override generated deopt-id.
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  Token::Kind op_kind() const { return op_kind_; }
+
+  virtual void PrintOperandsTo(BufferFormatter* f) const;
+
+  virtual bool CanDeoptimize() const {
+    return false;
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedUint32;
+  }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    // Direct access since this instruction cannot deoptimize, and the deopt-id
+    // was inherited from another instruction that could deoptimize.
+    return deopt_id_;
+  }
+
+  DECLARE_INSTRUCTION(UnaryUint32Op)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    return op_kind() == other->AsUnaryUint32Op()->op_kind();
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  const Token::Kind op_kind_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnaryUint32OpInstr);
+};
+
+
+class BoxUint32Instr : public TemplateDefinition<1> {
+ public:
+  explicit BoxUint32Instr(Value* value) {
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual intptr_t DeoptimizationTarget() const {
+    return Isolate::kNoDeoptId;
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return kUnboxedUint32;
+  }
+
+  DECLARE_INSTRUCTION(BoxUint32)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BoxUint32Instr);
+};
+
+
+class UnboxUint32Instr : public TemplateDefinition<1> {
+ public:
+  UnboxUint32Instr(Value* value, intptr_t deopt_id) {
+    SetInputAt(0, value);
+    deopt_id_ = deopt_id;
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  virtual bool CanDeoptimize() const {
+    return (value()->Type()->ToCid() != kSmiCid)
+        && (value()->Type()->ToCid() != kMintCid);
+  }
+
+  virtual Representation representation() const {
+    return kUnboxedUint32;
+  }
+
+
+  DECLARE_INSTRUCTION(UnboxUint32)
+  virtual CompileType ComputeType() const;
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
+
+  virtual bool MayThrow() const { return false; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(UnboxUint32Instr);
+};
+
+
+class UnboxedIntConverterInstr : public TemplateDefinition<1> {
+ public:
+  UnboxedIntConverterInstr(Representation from,
+                           Representation to,
+                           Value* value)
+      : from_representation_(from),
+        to_representation_(to) {
+    ASSERT(from != to);
+    ASSERT((from == kUnboxedMint) || (from == kUnboxedUint32));
+    ASSERT((to == kUnboxedMint) || (to == kUnboxedUint32));
+    SetInputAt(0, value);
+  }
+
+  Value* value() const { return inputs_[0]; }
+
+  Representation from() const { return from_representation_; }
+  Representation to() const { return to_representation_; }
+
+  virtual bool CanDeoptimize() const { return false; }
+
+  virtual Representation representation() const {
+    return to();
+  }
+
+  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+    ASSERT(idx == 0);
+    return from();
+  }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+  virtual bool AttributesEqual(Instruction* other) const {
+    ASSERT(other->IsUnboxedIntConverter());
+    UnboxedIntConverterInstr* converter = other->AsUnboxedIntConverter();
+    return (converter->from() == from()) && (converter->to() == to());
+  }
+
+  virtual bool MayThrow() const { return false; }
+
+  DECLARE_INSTRUCTION(UnboxedIntConverter);
+
+ private:
+  const Representation from_representation_;
+  const Representation to_representation_;
+  DISALLOW_COPY_AND_ASSIGN(UnboxedIntConverterInstr);
+};
+
+
 #undef DECLARE_INSTRUCTION
 
 class Environment : public ZoneAllocated {
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index be5b506..643f692 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -5686,12 +5686,16 @@
 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = !IsNullCheck() ? 1 : 0;
+  const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
+  const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
+    if (need_mask_temp) {
+      summary->set_temp(1, Location::RequiresRegister());
+    }
   }
   return summary;
 }
@@ -5724,14 +5728,33 @@
     __ b(deopt, EQ);
   }
   __ LoadClassId(temp, value);
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  for (intptr_t i = cix; i < num_checks; i++) {
-    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
-    __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i));
-    if (i == (num_checks - 1)) {
-      __ b(deopt, NE);
-    } else {
-      __ b(&is_ok, EQ);
+
+  if (IsDenseSwitch()) {
+    ASSERT(cids_[0] < cids_[cids_.length() - 1]);
+    __ AddImmediate(temp, -cids_[0]);
+    __ CompareImmediate(temp, cids_[cids_.length() - 1] - cids_[0]);
+    __ b(deopt, HI);
+
+    intptr_t mask = ComputeCidMask();
+    if (!IsDenseMask(mask)) {
+      // Only need mask if there are missing numbers in the range.
+      ASSERT(cids_.length() > 2);
+      Register mask_reg = locs()->temp(1).reg();
+      __ LoadImmediate(mask_reg, 1);
+      __ Lsl(mask_reg, mask_reg, temp);
+      __ TestImmediate(mask_reg, mask);
+      __ b(deopt, EQ);
+    }
+  } else {
+    const intptr_t num_checks = unary_checks().NumberOfChecks();
+    for (intptr_t i = cix; i < num_checks; i++) {
+      ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+      __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i));
+      if (i == (num_checks - 1)) {
+        __ b(deopt, NE);
+      } else {
+        __ b(&is_ok, EQ);
+      }
     }
   }
   __ Bind(&is_ok);
@@ -5757,6 +5780,25 @@
 }
 
 
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  __ CompareImmediate(value, Smi::RawValue(cid_));
+  __ b(deopt, NE);
+}
+
+
 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -5925,7 +5967,7 @@
 
 class BoxIntegerSlowPath : public SlowPathCode {
  public:
-  explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction)
+  explicit BoxIntegerSlowPath(Definition* instruction)
       : instruction_(instruction) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -5954,7 +5996,7 @@
   }
 
  private:
-  BoxIntegerInstr* instruction_;
+  Definition* instruction_;
 };
 
 
@@ -6101,13 +6143,12 @@
 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_in(1, Location::WritableRegister());
-  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
                                      Location::RequiresRegister()));
   return summary;
@@ -6126,66 +6167,123 @@
   PairLocation* left_pair = locs()->in(0).AsPairLocation();
   Register left_lo = left_pair->At(0).reg();
   Register left_hi = left_pair->At(1).reg();
-  Register shift = locs()->in(1).reg();
   PairLocation* out_pair = locs()->out(0).AsPairLocation();
   Register out_lo = out_pair->At(0).reg();
   Register out_hi = out_pair->At(1).reg();
-  Register temp = locs()->temp(0).reg();
 
   Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
   }
-  __ mov(out_lo, Operand(left_lo));
-  __ mov(out_hi, Operand(left_hi));
-
-  // Untag shift count.
-  __ SmiUntag(shift);
-
-  // Deopt if shift is larger than 63 or less than 0.
-  if (has_shift_count_check()) {
-    __ CompareImmediate(shift, kMintShiftCountLimit);
-    __ b(deopt, HI);
-  }
-
-  switch (op_kind()) {
-    case Token::kSHR: {
-      __ cmp(shift, Operand(32));
-
-      __ mov(out_lo, Operand(out_hi), HI);
-      __ Asr(out_hi, out_hi, 31, HI);
-      __ sub(shift, shift, Operand(32), HI);
-
-      __ rsb(temp, shift, Operand(32));
-      __ mov(temp, Operand(out_hi, LSL, temp));
-      __ orr(out_lo, temp, Operand(out_lo, LSR, shift));
-      __ Asr(out_hi, out_hi, shift);
-      break;
+  if (locs()->in(1).IsConstant()) {
+    // Code for a constant shift amount.
+    ASSERT(locs()->in(1).constant().IsSmi());
+    const int32_t shift =
+        reinterpret_cast<int32_t>(locs()->in(1).constant().raw()) >> 1;
+    if ((shift < 0) || (shift > kMintShiftCountLimit)) {
+      __ b(deopt);
+      return;
+    } else if (shift == 0) {
+      // Nothing to do for zero shift amount.
+      __ mov(out_lo, Operand(left_lo));
+      __ mov(out_hi, Operand(left_hi));
+      return;
     }
-    case Token::kSHL: {
-      __ rsbs(temp, shift, Operand(32));
-      __ sub(temp, shift, Operand(32), MI);
-      __ mov(out_hi, Operand(out_lo, LSL, temp), MI);
-      __ mov(out_hi, Operand(out_hi, LSL, shift), PL);
-      __ orr(out_hi, out_hi, Operand(out_lo, LSR, temp), PL);
-      __ mov(out_lo, Operand(out_lo, LSL, shift));
-
-      // Check for overflow.
-      if (can_overflow()) {
-        // Copy high word from output.
-        __ mov(temp, Operand(out_hi));
-        // Shift copy right.
-        __ Asr(temp, temp, shift);
-        // Compare with high word from input.
-        __ cmp(temp, Operand(left_hi));
-        // Overflow if they aren't equal.
-        __ b(deopt, NE);
+    switch (op_kind()) {
+      case Token::kSHR: {
+        if (shift < 32) {
+          __ Lsl(out_lo, left_hi, 32 - shift);
+          __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
+          __ Asr(out_hi, left_hi, shift);
+        } else {
+          if (shift == 32) {
+            __ mov(out_lo, Operand(left_hi));
+          } else {
+            __ Asr(out_lo, left_hi, shift - 32);
+          }
+          __ Asr(out_hi, left_hi, 31);
+        }
+        break;
       }
-      break;
+      case Token::kSHL: {
+        if (shift < 32) {
+          __ Lsr(out_hi, left_lo, 32 - shift);
+          __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
+          __ Lsl(out_lo, left_lo, shift);
+        } else {
+          if (shift == 32) {
+            __ mov(out_hi, Operand(left_lo));
+          } else {
+            __ Lsl(out_hi, left_lo, shift - 32);
+          }
+          __ mov(out_lo, Operand(0));
+        }
+        // Check for overflow.
+        if (can_overflow()) {
+          // Compare high word from input with shifted high word from output.
+          if (shift > 31) {
+            __ cmp(left_hi, Operand(out_hi));
+          } else {
+            __ cmp(left_hi, Operand(out_hi, ASR, shift));
+          }
+          // Overflow if they aren't equal.
+          __ b(deopt, NE);
+        }
+        break;
+      }
+      default:
+        UNREACHABLE();
     }
-    default:
-      UNREACHABLE();
-      break;
+  } else {
+    // Code for a variable shift amount.
+    Register shift = locs()->in(1).reg();
+
+    // Untag shift count.
+    __ SmiUntag(shift);
+
+    // Deopt if shift is larger than 63 or less than 0.
+    if (has_shift_count_check()) {
+      __ CompareImmediate(shift, kMintShiftCountLimit);
+      __ b(deopt, HI);
+    }
+
+    __ mov(out_lo, Operand(left_lo));
+    __ mov(out_hi, Operand(left_hi));
+
+    switch (op_kind()) {
+      case Token::kSHR: {
+        __ cmp(shift, Operand(32));
+
+        __ mov(out_lo, Operand(out_hi), HI);
+        __ Asr(out_hi, out_hi, 31, HI);
+        __ sub(shift, shift, Operand(32), HI);
+
+        __ rsb(IP, shift, Operand(32));
+        __ mov(IP, Operand(out_hi, LSL, IP));
+        __ orr(out_lo, IP, Operand(out_lo, LSR, shift));
+        __ Asr(out_hi, out_hi, shift);
+        break;
+      }
+      case Token::kSHL: {
+        __ rsbs(IP, shift, Operand(32));
+        __ sub(IP, shift, Operand(32), MI);
+        __ mov(out_hi, Operand(out_lo, LSL, IP), MI);
+        __ mov(out_hi, Operand(out_hi, LSL, shift), PL);
+        __ orr(out_hi, out_hi, Operand(out_lo, LSR, IP), PL);
+        __ mov(out_lo, Operand(out_lo, LSL, shift));
+
+        // Check for overflow.
+        if (can_overflow()) {
+          // Compare high word from input with shifted high word from output.
+          __ cmp(left_hi, Operand(out_hi, ASR, shift));
+          // Overflow if they aren't equal.
+          __ b(deopt, NE);
+        }
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
   }
 
   if (FLAG_throw_on_javascript_int_overflow) {
@@ -6231,6 +6329,323 @@
 }
 
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType BoxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnboxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(out != left);
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+      __ and_(out, left, Operand(right));
+    break;
+    case Token::kBIT_OR:
+      __ orr(out, left, Operand(right));
+    break;
+    case Token::kBIT_XOR:
+      __ eor(out, left, Operand(right));
+    break;
+    case Token::kADD:
+      __ add(out, left, Operand(right));
+    break;
+    case Token::kSUB:
+      __ sub(out, left, Operand(right));
+    break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t kShifterLimit = 31;
+
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  Register temp = locs()->temp(0).reg();
+
+  ASSERT(left != out);
+
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
+
+  if (locs()->in(1).IsConstant()) {
+    // Shifter is constant.
+
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    const intptr_t shift_value = Smi::Cast(constant).Value();
+
+    // Check constant shift value.
+    if (shift_value == 0) {
+      // Nothing to do.
+      __ mov(out, Operand(left));
+    } else if (shift_value < 0) {
+      // Invalid shift value.
+      __ b(deopt);
+    } else if (shift_value > kShifterLimit) {
+      // Result is 0.
+      __ eor(out, out, Operand(out));
+    } else {
+      // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
+      switch (op_kind()) {
+        case Token::kSHR:
+          __ Lsr(out, left, shift_value);
+        break;
+        case Token::kSHL:
+          __ Lsl(out, left, shift_value);
+        break;
+        default:
+          UNREACHABLE();
+      }
+    }
+    return;
+  }
+
+  // Non constant shift value.
+
+  Register shifter = locs()->in(1).reg();
+
+  __ mov(temp, Operand(shifter));
+  __ SmiUntag(temp);
+  __ CompareImmediate(temp, 0);
+  // If shift value is < 0, deoptimize.
+  __ b(deopt, LT);
+  __ CompareImmediate(temp, kShifterLimit);
+  // > kShifterLimit, result is 0.
+  __ eor(out, out, Operand(out), HI);
+  // Do the shift.
+  switch (op_kind()) {
+    case Token::kSHR:
+      __ Lsr(out, left, temp, LS);
+    break;
+    case Token::kSHL:
+      __ Lsl(out, left, temp, LS);
+    break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left != out);
+
+  ASSERT(op_kind() == Token::kBIT_NOT);
+
+  __ mvn(out, Operand(left));
+}
+
+
+LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  Register temp = locs()->temp(0).reg();
+  ASSERT(value != out);
+
+  Label not_smi, done;
+
+  // TODO(johnmccutchan): Use range information to fast path smi / mint boxing.
+
+  // Test if this value is <= kSmiMax.
+  __ CompareImmediate(value, kSmiMax);
+  __ b(&not_smi, HI);
+  // Smi.
+  __ mov(out, Operand(value));
+  __ SmiTag(out);
+  __ b(&done);
+  __ Bind(&not_smi);
+  // Allocate a mint.
+  __ TryAllocate(
+    Class::ZoneHandle(Isolate::Current()->object_store()->mint_class()),
+      slow_path->entry_label(),
+      out,
+      temp);
+  __ Bind(slow_path->exit_label());
+  // Copy low word into mint.
+  __ StoreToOffset(kWord,
+                   value,
+                   out,
+                   Mint::value_offset() - kHeapObjectTag);
+  // Zero high word.
+  __ eor(temp, temp, Operand(temp));
+  __ StoreToOffset(kWord,
+                   temp,
+                   out,
+                   Mint::value_offset() - kHeapObjectTag + kWordSize);
+  __ Bind(&done);
+}
+
+
+
+LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps =
+      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  const Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  // TODO(johnmccutchan): Emit better code for constant inputs.
+  if (value_cid == kMintCid) {
+    __ LoadFromOffset(kWord, out, value, Mint::value_offset() - kHeapObjectTag);
+  } else if (value_cid == kSmiCid) {
+    __ mov(out, Operand(value));
+    __ SmiUntag(out);
+  } else {
+    Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    Label done;
+    __ tst(value, Operand(kSmiTagMask));
+    // Smi case.
+    __ mov(out, Operand(value), EQ);
+    __ SmiUntag(out, EQ);
+    __ b(&done, EQ);
+    // Mint case.
+    __ CompareClassId(value, kMintCid, temp);
+    __ b(deopt, NE);
+    __ LoadFromOffset(kWord, out, value, Mint::value_offset() - kHeapObjectTag);
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (from() == kUnboxedMint) {
+    summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+    summary->set_out(0, Location::RequiresRegister());
+  } else {
+    ASSERT(from() == kUnboxedUint32);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
+  }
+  return summary;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (from() == kUnboxedMint) {
+    PairLocation* in_pair = locs()->in(0).AsPairLocation();
+    Register in_lo = in_pair->At(0).reg();
+    Register out = locs()->out(0).reg();
+    // Copy low word.
+    __ mov(out, Operand(in_lo));
+  } else {
+    ASSERT(from() == kUnboxedUint32);
+    Register in = locs()->in(0).reg();
+    PairLocation* out_pair = locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+    // Copy low word.
+    __ mov(out_lo, Operand(in));
+    // Zero upper word.
+    __ eor(out_hi, out_hi, Operand(out_hi));
+  }
+}
+
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
                                                  bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
@@ -6454,8 +6869,6 @@
   ASSERT(!compiler->is_optimizing());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
-  __ LoadImmediate(R4, 0);
-  __ LoadImmediate(R5, 0);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ LoadImmediate(R4, kInvalidObjectPointer);
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 4029e04..6bcc36d 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -907,7 +907,13 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, object);
+  static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
+
+  __ LoadImmediate(TMP, reinterpret_cast<int64_t>(&kSmiCidSource) + 1, PP);
+  __ tsti(object, kSmiTagMask);
+  __ csel(TMP, TMP, object, EQ);
+  __ LoadClassId(result, TMP, PP);
+  __ SmiTag(result);
 }
 
 
@@ -4945,12 +4951,16 @@
 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = !IsNullCheck() ? 1 : 0;
+  const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
+  const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
+    if (need_mask_temp) {
+      summary->set_temp(1, Location::RequiresRegister());
+    }
   }
   return summary;
 }
@@ -4982,20 +4992,59 @@
     __ b(deopt, EQ);
   }
   __ LoadClassId(temp, value, PP);
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  for (intptr_t i = cix; i < num_checks; i++) {
-    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
-    __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i), PP);
-    if (i == (num_checks - 1)) {
-      __ b(deopt, NE);
-    } else {
-      __ b(&is_ok, EQ);
+
+  if (IsDenseSwitch()) {
+    ASSERT(cids_[0] < cids_[cids_.length() - 1]);
+    __ AddImmediate(temp, temp, -cids_[0], PP);
+    __ CompareImmediate(temp, cids_[cids_.length() - 1] - cids_[0], PP);
+    __ b(deopt, HI);
+
+    intptr_t mask = ComputeCidMask();
+    if (!IsDenseMask(mask)) {
+      // Only need mask if there are missing numbers in the range.
+      ASSERT(cids_.length() > 2);
+      Register mask_reg = locs()->temp(1).reg();
+      __ LoadImmediate(mask_reg, 1, PP);
+      __ Lsl(mask_reg, mask_reg, temp);
+      __ TestImmediate(mask_reg, mask, PP);
+      __ b(deopt, EQ);
+    }
+
+  } else {
+    const intptr_t num_checks = unary_checks().NumberOfChecks();
+    for (intptr_t i = cix; i < num_checks; i++) {
+      ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+      __ CompareImmediate(temp, unary_checks().GetReceiverClassIdAt(i), PP);
+      if (i == (num_checks - 1)) {
+        __ b(deopt, NE);
+      } else {
+        __ b(&is_ok, EQ);
+      }
     }
   }
   __ Bind(&is_ok);
 }
 
 
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  __ CompareImmediate(value, Smi::RawValue(cid_), PP);
+  __ b(deopt, NE);
+}
+
+
 LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -5136,6 +5185,103 @@
 }
 
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType BoxUint32Instr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType UnboxUint32Instr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
                                                  bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
@@ -5367,8 +5513,6 @@
   ASSERT(!compiler->is_optimizing());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
-  __ LoadImmediate(R4, 0, kNoPP);
-  __ LoadImmediate(R5, 0, kNoPP);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index d689a3b..b3069b3 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -945,17 +945,16 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label not_smi, done;
+  Label done;
 
   // We don't use Assembler::LoadTaggedClassIdMayBeSmi() here---which uses
   // a conditional move instead, and requires an additional register---because
   // it is slower, probably due to branch prediction usually working just fine
   // in this case.
+  ASSERT(result != object);
+  __ movl(result, Immediate(kSmiCid << 1));
   __ testl(object, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movl(result, Immediate(Smi::RawValue(kSmiCid)));
-  __ jmp(&done, Assembler::kNearJump);
-  __ Bind(&not_smi);
+  __ j(EQUAL, &done, Assembler::kNearJump);
   __ LoadClassId(result, object);
   __ SmiTag(result);
   __ Bind(&done);
@@ -5495,12 +5494,16 @@
 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = !IsNullCheck() ? 1 : 0;
+  const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
+  const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
+    if (need_mask_temp) {
+      summary->set_temp(1, Location::RequiresRegister());
+    }
   }
   return summary;
 }
@@ -5534,18 +5537,36 @@
     __ j(ZERO, deopt);
   }
   __ LoadClassId(temp, value);
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  const bool use_near_jump = num_checks < 5;
-  for (intptr_t i = cix; i < num_checks; i++) {
-    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
-    __ cmpl(temp, Immediate(unary_checks().GetReceiverClassIdAt(i)));
-    if (i == (num_checks - 1)) {
-      __ j(NOT_EQUAL, deopt);
-    } else {
-      if (use_near_jump) {
-        __ j(EQUAL, &is_ok, Assembler::kNearJump);
+
+  if (IsDenseSwitch()) {
+    ASSERT(cids_[0] < cids_[cids_.length() - 1]);
+    __ subl(temp, Immediate(cids_[0]));
+    __ cmpl(temp, Immediate(cids_[cids_.length() - 1] - cids_[0]));
+    __ j(ABOVE, deopt);
+
+    intptr_t mask = ComputeCidMask();
+    if (!IsDenseMask(mask)) {
+      // Only need mask if there are missing numbers in the range.
+      ASSERT(cids_.length() > 2);
+      Register mask_reg = locs()->temp(1).reg();
+      __ movl(mask_reg, Immediate(mask));
+      __ bt(mask_reg, temp);
+      __ j(NOT_CARRY, deopt);
+    }
+  } else {
+    const intptr_t num_checks = unary_checks().NumberOfChecks();
+    const bool use_near_jump = num_checks < 5;
+    for (intptr_t i = cix; i < num_checks; i++) {
+      ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+      __ cmpl(temp, Immediate(unary_checks().GetReceiverClassIdAt(i)));
+      if (i == (num_checks - 1)) {
+        __ j(NOT_EQUAL, deopt);
       } else {
-        __ j(EQUAL, &is_ok);
+        if (use_near_jump) {
+          __ j(EQUAL, &is_ok, Assembler::kNearJump);
+        } else {
+          __ j(EQUAL, &is_ok);
+        }
       }
     }
   }
@@ -5572,6 +5593,25 @@
 }
 
 
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  __ cmpl(value, Immediate(Smi::RawValue(cid_)));
+  __ j(NOT_ZERO, deopt);
+}
+
+
 // Length: register or constant.
 // Index: register, constant or stack slot.
 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
@@ -5713,7 +5753,7 @@
 
 class BoxIntegerSlowPath : public SlowPathCode {
  public:
-  explicit BoxIntegerSlowPath(BoxIntegerInstr* instruction)
+  explicit BoxIntegerSlowPath(Definition* instruction)
       : instruction_(instruction) { }
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -5742,7 +5782,7 @@
   }
 
  private:
-  BoxIntegerInstr* instruction_;
+  Definition* instruction_;
 };
 
 
@@ -5998,7 +6038,6 @@
       }
       default:
         UNREACHABLE();
-        break;
     }
   } else {
     // Code for a variable shift amount.
@@ -6021,10 +6060,10 @@
         __ jmp(&done, Assembler::kNearJump);
 
         __ Bind(&large_shift);
-        __ subl(ECX, Immediate(32));
+        // No need to subtract 32 from CL, only 5 bits used by sarl.
         __ movl(left_lo, left_hi);  // Shift by 32.
         __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
-        __ sarl(left_lo, ECX);  // Shift count - 32 in CL.
+        __ sarl(left_lo, ECX);  // Shift count: CL % 32.
         break;
       }
       case Token::kSHL: {
@@ -6046,10 +6085,10 @@
           __ jmp(&done, Assembler::kNearJump);
 
           __ Bind(&large_shift);
-          __ subl(ECX, Immediate(32));
+          // No need to subtract 32 from CL, only 5 bits used by shll.
           __ movl(left_hi, left_lo);  // Shift by 32.
           __ xorl(left_lo, left_lo);  // Zero left_lo.
-          __ shll(left_hi, ECX);  // Shift count in CL.
+          __ shll(left_hi, ECX);  // Shift count: CL % 32.
           // Check for overflow by sign extending the high 32 bits
           // and comparing with the input.
           __ movl(temp2, left_hi);
@@ -6065,10 +6104,10 @@
           __ jmp(&done, Assembler::kNearJump);
 
           __ Bind(&large_shift);
-          __ subl(ECX, Immediate(32));
+          // No need to subtract 32 from CL, only 5 bits used by shll.
           __ movl(left_hi, left_lo);  // Shift by 32.
           __ xorl(left_lo, left_lo);  // Zero left_lo.
-          __ shll(left_hi, ECX);  // Shift count in CL.
+          __ shll(left_hi, ECX);  // Shift count: CL % 32.
         }
         break;
       }
@@ -6125,6 +6164,320 @@
 }
 
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType BoxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnboxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register left = locs()->in(0).reg();
+  Register right = locs()->in(1).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(out == left);
+  switch (op_kind()) {
+    case Token::kBIT_AND:
+      __ andl(out, right);
+    break;
+    case Token::kBIT_OR:
+      __ orl(out, right);
+    break;
+    case Token::kBIT_XOR:
+      __ xorl(out, right);
+    break;
+    case Token::kADD:
+      __ addl(out, right);
+    break;
+    case Token::kSUB:
+      __ subl(out, right);
+    break;
+    default:
+      UNREACHABLE();
+  }
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t kShifterLimit = 31;
+
+  Register left = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(left == out);
+
+
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptShiftMintOp);
+
+  if (locs()->in(1).IsConstant()) {
+    // Shifter is constant.
+
+    const Object& constant = locs()->in(1).constant();
+    ASSERT(constant.IsSmi());
+    const intptr_t shift_value = Smi::Cast(constant).Value();
+
+    // Check constant shift value.
+    if (shift_value == 0) {
+      // Nothing to do.
+    } else if (shift_value < 0) {
+      // Invalid shift value.
+      __ jmp(deopt);
+    } else if (shift_value > kShifterLimit) {
+      // Result is 0.
+      __ xorl(left, left);
+    } else {
+      // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
+      switch (op_kind()) {
+        case Token::kSHR:
+          __ shrl(left, Immediate(shift_value));
+        break;
+        case Token::kSHL:
+          __ shll(left, Immediate(shift_value));
+        break;
+        default:
+          UNREACHABLE();
+      }
+    }
+    return;
+  }
+
+  // Non constant shift value.
+
+  Register shifter = locs()->in(1).reg();
+  ASSERT(shifter == ECX);
+
+  Label done;
+  Label zero;
+
+  // TODO(johnmccutchan): Use range information to avoid these checks.
+  __ SmiUntag(shifter);
+  __ cmpl(shifter, Immediate(0));
+  // If shift value is < 0, deoptimize.
+  __ j(NEGATIVE, deopt);
+  __ cmpl(shifter, Immediate(kShifterLimit));
+  // If shift value is >= 32, return zero.
+  __ j(ABOVE, &zero);
+
+  // Do the shift.
+  switch (op_kind()) {
+    case Token::kSHR:
+      __ shrl(left, shifter);
+      __ jmp(&done);
+    break;
+    case Token::kSHL:
+      __ shll(left, shifter);
+      __ jmp(&done);
+    break;
+    default:
+      UNREACHABLE();
+  }
+
+  __ Bind(&zero);
+  // Shift was greater than 31 bits, just return zero.
+  __ xorl(left, left);
+
+  // Exit path.
+  __ Bind(&done);
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register out = locs()->out(0).reg();
+  ASSERT(locs()->in(0).reg() == out);
+
+  ASSERT(op_kind() == Token::kBIT_NOT);
+
+  __ notl(out);
+}
+
+
+LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  summary->set_in(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
+  compiler->AddSlowPathCode(slow_path);
+  Register value = locs()->in(0).reg();
+  Register out = locs()->out(0).reg();
+  ASSERT(value != out);
+
+  Label not_smi, done;
+
+  // TODO(johnmccutchan): Use range information to fast path smi / mint boxing.
+  // Test if this value is <= kSmiMax.
+  __ cmpl(value, Immediate(kSmiMax));
+  __ j(ABOVE, &not_smi);
+  // Smi.
+  __ movl(out, value);
+  __ SmiTag(out);
+  __ jmp(&done);
+  __ Bind(&not_smi);
+  // Allocate a mint.
+  __ TryAllocate(
+      Class::ZoneHandle(Isolate::Current()->object_store()->mint_class()),
+      slow_path->entry_label(),
+      Assembler::kFarJump,
+      out,
+      kNoRegister);
+  __ Bind(slow_path->exit_label());
+  // Copy low word into mint.
+  __ movl(FieldAddress(out, Mint::value_offset()), value);
+  // Zero high word.
+  __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), Immediate(0));
+  __ Bind(&done);
+}
+
+
+LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps =
+      ((value_cid == kMintCid) || (value_cid == kSmiCid)) ? 0 : 1;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  if (kNumTemps > 0) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
+}
+
+
+void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const intptr_t value_cid = value()->Type()->ToCid();
+  const Register value = locs()->in(0).reg();
+  ASSERT(value == locs()->out(0).reg());
+
+  // TODO(johnmccutchan): Emit better code for constant inputs.
+  if (value_cid == kMintCid) {
+    __ movl(value, FieldAddress(value, Mint::value_offset()));
+  } else if (value_cid == kSmiCid) {
+    __ SmiUntag(value);
+  } else {
+    Register temp = locs()->temp(0).reg();
+    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+                                          ICData::kDeoptUnboxInteger);
+    Label is_smi, done;
+    __ testl(value, Immediate(kSmiTagMask));
+    __ j(ZERO, &is_smi);
+    __ CompareClassId(value, kMintCid, temp);
+    __ j(NOT_EQUAL, deopt);
+    __ movl(value, FieldAddress(value, Mint::value_offset()));
+    __ jmp(&done);
+    __ Bind(&is_smi);
+    __ SmiUntag(value);
+    __ Bind(&done);
+  }
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  if (from() == kUnboxedMint) {
+    summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+                                      Location::RequiresRegister()));
+    summary->set_out(0, Location::RequiresRegister());
+  } else {
+    ASSERT(from() == kUnboxedUint32);
+    summary->set_in(0, Location::RequiresRegister());
+    summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+                                       Location::RequiresRegister()));
+  }
+  return summary;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (from() == kUnboxedMint) {
+    PairLocation* in_pair = locs()->in(0).AsPairLocation();
+    Register in_lo = in_pair->At(0).reg();
+    Register out = locs()->out(0).reg();
+    // Copy low word.
+    __ movl(out, in_lo);
+  } else {
+    ASSERT(from() == kUnboxedUint32);
+    Register in = locs()->in(0).reg();
+    PairLocation* out_pair = locs()->out(0).AsPairLocation();
+    Register out_lo = out_pair->At(0).reg();
+    Register out_hi = out_pair->At(1).reg();
+    // Copy low word.
+    __ movl(out_lo, in);
+    // Zero upper word.
+    __ xorl(out_hi, out_hi);
+  }
+}
+
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
                                                  bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
@@ -6472,8 +6825,6 @@
   ASSERT(!compiler->is_optimizing());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
-  __ movl(EDX, Immediate(0));
-  __ movl(ECX, Immediate(0));
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ movl(EDX, Immediate(kInvalidObjectPointer));
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 032933b..668a1fd 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -4284,12 +4284,16 @@
 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = !IsNullCheck() ? 1 : 0;
+  const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
+  const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
+    if (need_mask_temp) {
+      summary->set_temp(1, Location::RequiresRegister());
+    }
   }
   return summary;
 }
@@ -4321,15 +4325,35 @@
     __ beq(CMPRES1, ZR, deopt);
   }
   __ LoadClassId(temp, value);
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  for (intptr_t i = cix; i < num_checks; i++) {
-    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
-    __ LoadImmediate(TMP, unary_checks().GetReceiverClassIdAt(i));
-    __ subu(CMPRES1, temp, TMP);
-    if (i == (num_checks - 1)) {
-      __ bne(CMPRES1, ZR, deopt);
-    } else {
-      __ beq(CMPRES1, ZR, &is_ok);
+
+  if (IsDenseSwitch()) {
+    ASSERT(cids_[0] < cids_[cids_.length() - 1]);
+    __ LoadImmediate(TMP, cids_[0]);
+    __ subu(temp, temp, TMP);
+    __ LoadImmediate(TMP, cids_[cids_.length() - 1] - cids_[0]);
+    __ BranchUnsignedGreater(temp, TMP, deopt);
+
+    intptr_t mask = ComputeCidMask();
+    if (!IsDenseMask(mask)) {
+      // Only need mask if there are missing numbers in the range.
+      ASSERT(cids_.length() > 2);
+      Register mask_reg = locs()->temp(1).reg();
+      __ LoadImmediate(mask_reg, 1);
+      __ sllv(mask_reg, mask_reg, temp);
+      __ AndImmediate(mask_reg, mask_reg, mask);
+      __ beq(mask_reg, ZR, deopt);
+    }
+  } else {
+    const intptr_t num_checks = unary_checks().NumberOfChecks();
+    for (intptr_t i = cix; i < num_checks; i++) {
+      ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+      __ LoadImmediate(TMP, unary_checks().GetReceiverClassIdAt(i));
+      __ subu(CMPRES1, temp, TMP);
+      if (i == (num_checks - 1)) {
+        __ bne(CMPRES1, ZR, deopt);
+      } else {
+        __ beq(CMPRES1, ZR, &is_ok);
+      }
     }
   }
   __ Bind(&is_ok);
@@ -4356,6 +4380,24 @@
 }
 
 
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  __ BranchNotEqual(value, Smi::RawValue(cid_), deopt);
+}
+
+
 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -4469,6 +4511,103 @@
 }
 
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType BoxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+CompileType UnboxUint32Instr::ComputeType() const {
+  return CompileType::Int();
+}
+
+
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
                                                  bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
@@ -4705,8 +4844,6 @@
   ASSERT(!compiler->is_optimizing());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
-  __ LoadImmediate(S4, 0);
-  __ LoadImmediate(S5, 0);
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ LoadImmediate(S4, kInvalidObjectPointer);
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 36df28e..3ec1f4d 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -5392,12 +5392,16 @@
 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = !IsNullCheck() ? 1 : 0;
+  const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
+  const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->set_temp(0, Location::RequiresRegister());
+    if (need_mask_temp) {
+      summary->set_temp(1, Location::RequiresRegister());
+    }
   }
   return summary;
 }
@@ -5430,18 +5434,36 @@
     __ j(ZERO, deopt);
   }
   __ LoadClassId(temp, value);
-  const intptr_t num_checks = unary_checks().NumberOfChecks();
-  const bool use_near_jump = num_checks < 5;
-  for (intptr_t i = cix; i < num_checks; i++) {
-    ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
-    __ cmpl(temp, Immediate(unary_checks().GetReceiverClassIdAt(i)));
-    if (i == (num_checks - 1)) {
-      __ j(NOT_EQUAL, deopt);
-    } else {
-      if (use_near_jump) {
-        __ j(EQUAL, &is_ok, Assembler::kNearJump);
+
+  if (IsDenseSwitch()) {
+    ASSERT(cids_[0] < cids_[cids_.length() - 1]);
+    __ subq(temp, Immediate(cids_[0]));
+    __ cmpq(temp, Immediate(cids_[cids_.length() - 1] - cids_[0]));
+    __ j(ABOVE, deopt);
+
+    intptr_t mask = ComputeCidMask();
+    if (!IsDenseMask(mask)) {
+      // Only need mask if there are missing numbers in the range.
+      ASSERT(cids_.length() > 2);
+      Register mask_reg = locs()->temp(1).reg();
+      __ movq(mask_reg, Immediate(mask));
+      __ btq(mask_reg, temp);
+      __ j(NOT_CARRY, deopt);
+    }
+  } else {
+    const intptr_t num_checks = unary_checks().NumberOfChecks();
+    const bool use_near_jump = num_checks < 5;
+    for (intptr_t i = cix; i < num_checks; i++) {
+      ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
+      __ cmpl(temp, Immediate(unary_checks().GetReceiverClassIdAt(i)));
+      if (i == (num_checks - 1)) {
+        __ j(NOT_EQUAL, deopt);
       } else {
-        __ j(EQUAL, &is_ok);
+        if (use_near_jump) {
+          __ j(EQUAL, &is_ok, Assembler::kNearJump);
+        } else {
+          __ j(EQUAL, &is_ok);
+        }
       }
     }
   }
@@ -5468,6 +5490,25 @@
 }
 
 
+LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresRegister());
+  return summary;
+}
+
+
+void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  Register value = locs()->in(0).reg();
+  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  __ CompareImmediate(value, Immediate(Smi::RawValue(cid_)), PP);
+  __ j(NOT_ZERO, deopt);
+}
+
+
 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
                                                            bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -5584,6 +5625,103 @@
 }
 
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType BoxUint32Instr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+CompileType UnboxUint32Instr::ComputeType() const {
+  return CompileType::FromCid(kSmiCid);
+}
+
+
+LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* BoxUint32Instr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void BoxUint32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
+LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  UNIMPLEMENTED();
+  return NULL;
+}
+
+
+void UnboxedIntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  UNIMPLEMENTED();
+}
+
+
 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
                                                  bool opt) const {
   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
@@ -5867,8 +6005,6 @@
   ASSERT(!compiler->is_optimizing());
   StubCode* stub_code = compiler->isolate()->stub_code();
   const ExternalLabel label(stub_code->DebugStepCheckEntryPoint());
-  __ movq(R10, Immediate(0));
-  __ movq(RBX, Immediate(0));
   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
 #if defined(DEBUG)
   __ movq(R10, Immediate(kInvalidObjectPointer));
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 8397ef5..0024b68 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -84,6 +84,14 @@
 }
 
 
+Location Location::WritableRegisterOrSmiConstant(Value* value) {
+  ConstantInstr* constant = value->definition()->AsConstant();
+  return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
+      ? Location::Constant(constant->value())
+      : Location::WritableRegister();
+}
+
+
 Location Location::FixedRegisterOrConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
   return ((constant != NULL) && Assembler::IsSafe(constant->value()))
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 9b5b841..0a2a636 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -21,6 +21,7 @@
   kTagged,
   kUntagged,
   kUnboxedDouble,
+  kUnboxedUint32,
   kUnboxedMint,
   kUnboxedFloat32x4,
   kUnboxedInt32x4,
@@ -333,6 +334,7 @@
   // Constants.
   static Location RegisterOrConstant(Value* value);
   static Location RegisterOrSmiConstant(Value* value);
+  static Location WritableRegisterOrSmiConstant(Value* value);
   static Location FixedRegisterOrConstant(Value* value, Register reg);
   static Location FixedRegisterOrSmiConstant(Value* value, Register reg);
   static Location AnyOrConstant(Value* value);
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 7dd91bf..60d2ba5 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -67,19 +67,6 @@
 }
 
 
-// --- Profiling support ---
-
-// TODO(7565): Dartium should use the new VM flag "generate_pprof_symbols" for
-// pprof profiling. Then these symbols should be removed.
-
-DART_EXPORT void Dart_InitPprofSupport() { }
-
-DART_EXPORT void Dart_GetPprofSymbolInfo(void** buffer, int* buffer_size) {
-  *buffer = NULL;
-  *buffer_size = 0;
-}
-
-
 // --- Verification tools ---
 
 static void CompileAll(Isolate* isolate, Dart_Handle* result) {
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ab48a2a..eec536b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -660,9 +660,11 @@
 
   // Allocate and initialize the empty_descriptors instance.
   {
-    uword address = heap->Allocate(PcDescriptors::InstanceSize(0), Heap::kOld);
+    uword address = heap->Allocate(
+        PcDescriptors::InstanceSize(0, RawPcDescriptors::kCompressedRecSize),
+        Heap::kOld);
     InitializeObject(address, kPcDescriptorsCid,
-                     PcDescriptors::InstanceSize(0));
+        PcDescriptors::InstanceSize(0, RawPcDescriptors::kCompressedRecSize));
     PcDescriptors::initializeHandle(
         empty_descriptors_,
         reinterpret_cast<RawPcDescriptors*>(address + kHeapObjectTag));
@@ -1222,6 +1224,14 @@
   typed_data_classes.SetAt(index, cls);                                        \
   RegisterPrivateClass(cls, Symbols::_External##clazz(), lib);                 \
 
+  cls = Class::New<Instance>(kByteBufferCid);
+  cls.set_instance_size(0);
+  cls.set_next_field_offset(-kWordSize);
+  index = kByteBufferCid - kTypedDataInt8ArrayCid;
+  typed_data_classes.SetAt(index, cls);
+  RegisterPrivateClass(cls, Symbols::_ByteBuffer(), lib);
+  pending_classes.Add(cls);
+
   CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
 #undef REGISTER_EXT_TYPED_DATA_CLASS
   // Register Float32x4 and Int32x4 in the object store.
@@ -1446,6 +1456,8 @@
   CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
 #undef REGISTER_EXT_TYPED_DATA_CLASS
 
+  cls = Class::New<Instance>(kByteBufferCid);
+
   cls = Class::New<Integer>();
   object_store->set_integer_implementation_class(cls);
 
@@ -7624,50 +7636,85 @@
 }
 
 
+// CompressedTokenMap maps String and LiteralToken keys to Smi values.
+// It also supports lookup by Scanner::TokenDescriptor.
+class CompressedTokenTraits {
+ public:
+  static bool IsMatch(const Scanner::TokenDescriptor& descriptor,
+                      const Object& key) {
+    if (!key.IsLiteralToken()) {
+      return false;
+    }
+    const LiteralToken& token = LiteralToken::Cast(key);
+    return (token.literal() == descriptor.literal->raw()) &&
+           (token.kind() == descriptor.kind);
+  }
+
+  // Only for non-descriptor lookup and table expansion.
+  static bool IsMatch(const Object& a, const Object& b) {
+    return a.raw() == b.raw();
+  }
+
+  static uword Hash(const Scanner::TokenDescriptor& descriptor) {
+    return descriptor.literal->Hash();
+  }
+
+  static uword Hash(const Object& key) {
+    if (key.IsLiteralToken()) {
+      return String::HashRawSymbol(LiteralToken::Cast(key).literal());
+    } else {
+      return String::Cast(key).Hash();
+    }
+  }
+};
+typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap;
+
+
 // Helper class for creation of compressed token stream data.
 class CompressedTokenStreamData : public ValueObject {
  public:
-  static const intptr_t kInitialSize = 16 * KB;
+  static const intptr_t kInitialBufferSize = 16 * KB;
   CompressedTokenStreamData() :
       buffer_(NULL),
-      stream_(&buffer_, Reallocate, kInitialSize),
-      token_objects_(GrowableObjectArray::Handle(
-          GrowableObjectArray::New(kInitialTokenCount, Heap::kOld))),
-      token_obj_(Object::Handle()),
-      literal_token_(LiteralToken::Handle()),
-      literal_str_(String::Handle()) {
-    token_objects_.Add(Object::null_string());
+      stream_(&buffer_, Reallocate, kInitialBufferSize),
+      tokens_(Array::Handle(
+          HashTables::New<CompressedTokenMap>(kInitialTableSize))) {
   }
   ~CompressedTokenStreamData() {
+    // Safe to discard the hash table now.
+    tokens_.Release();
   }
 
-  // Add an IDENT token into the stream and the token objects array.
+  // Add an IDENT token into the stream and the token hash map.
   void AddIdentToken(const String* ident) {
-    // If the IDENT token is already in the tokens object array use the
-    // same index instead of duplicating it.
-    intptr_t index = FindIdentIndex(ident);
-    if (index == -1) {
-      WriteIndex(token_objects_.Length());
-      ASSERT(ident != NULL);
-      token_objects_.Add(*ident);
+    ASSERT(ident->IsSymbol());
+    intptr_t index = tokens_.NumOccupied();
+    intptr_t entry;
+    if (!tokens_.FindKeyOrDeletedOrUnused(*ident, &entry)) {
+      tokens_.InsertKey(entry, *ident);
+      tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index)));
+      HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_);
     } else {
-      WriteIndex(index);
+      index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0)));
     }
+    WriteIndex(index);
   }
 
-  // Add a LITERAL token into the stream and the token objects array.
-  void AddLiteralToken(Token::Kind kind, const String* literal) {
-    // If the literal token is already in the tokens object array use the
-    // same index instead of duplicating it.
-    intptr_t index = FindLiteralIndex(kind, literal);
-    if (index == -1) {
-      WriteIndex(token_objects_.Length());
-      ASSERT(literal != NULL);
-      literal_token_ = LiteralToken::New(kind, *literal);
-      token_objects_.Add(literal_token_);
+  // Add a LITERAL token into the stream and the token hash map.
+  void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) {
+    ASSERT(descriptor.literal->IsSymbol());
+    intptr_t index = tokens_.NumOccupied();
+    intptr_t entry;
+    if (!tokens_.FindKeyOrDeletedOrUnused(descriptor, &entry)) {
+      LiteralToken& new_literal = LiteralToken::Handle(
+          LiteralToken::New(descriptor.kind, *descriptor.literal));
+      tokens_.InsertKey(entry, new_literal);
+      tokens_.UpdatePayload(entry, 0, Smi::Handle(Smi::New(index)));
+      HashTables::EnsureLoadFactor(0.0, kMaxLoadFactor, tokens_);
     } else {
-      WriteIndex(index);
+      index = Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0)));
     }
+    WriteIndex(index);
   }
 
   // Add a simple token into the stream.
@@ -7681,44 +7728,21 @@
   // Return the compressed token stream length.
   intptr_t Length() const { return stream_.bytes_written(); }
 
-  // Return the token objects array.
-  const GrowableObjectArray& TokenObjects() const {
-    return token_objects_;
+  // Generate and return the token objects array.
+  RawArray* MakeTokenObjectsArray() const {
+    Array& result = Array::Handle(
+        Array::New(tokens_.NumOccupied(), Heap::kOld));
+    CompressedTokenMap::Iterator it(&tokens_);
+    Object& key = Object::Handle();
+    while (it.MoveNext()) {
+      intptr_t entry = it.Current();
+      key = tokens_.GetKey(entry);
+      result.SetAt(Smi::Value(Smi::RawCast(tokens_.GetPayload(entry, 0))), key);
+    }
+    return result.raw();
   }
 
  private:
-  intptr_t FindIdentIndex(const String* ident) {
-    ASSERT(ident != NULL);
-    ASSERT(ident->IsSymbol());
-    intptr_t hash_value = ident->Hash() % kTableSize;
-    GrowableArray<intptr_t>& value = ident_table_[hash_value];
-    for (intptr_t i = 0; i < value.length(); i++) {
-      intptr_t index = value[i];
-      if (token_objects_.At(index) == ident->raw()) {
-        return index;
-      }
-    }
-    value.Add(token_objects_.Length());
-    return -1;
-  }
-
-  intptr_t FindLiteralIndex(Token::Kind kind, const String* literal) {
-    ASSERT(literal != NULL);
-    ASSERT(literal->IsSymbol());
-    intptr_t hash_value = literal->Hash() % kTableSize;
-    GrowableArray<intptr_t>& value = literal_table_[hash_value];
-    for (intptr_t i = 0; i < value.length(); i++) {
-      intptr_t index = value[i];
-      token_obj_ = token_objects_.At(index);
-      const LiteralToken& token = LiteralToken::Cast(token_obj_);
-      if ((kind == token.kind()) && (token.literal() == literal->raw())) {
-        return index;
-      }
-    }
-    value.Add(token_objects_.Length());
-    return -1;
-  }
-
   void WriteIndex(intptr_t value) {
     stream_.WriteUnsigned(value + Token::kNumTokens);
   }
@@ -7730,22 +7754,20 @@
     return reinterpret_cast<uint8_t*>(new_ptr);
   }
 
-  static const int kInitialTokenCount = 32;
-  static const intptr_t kTableSize = 1024;
+  static const intptr_t kInitialTableSize = 32;
+  static const double kMaxLoadFactor;
 
   uint8_t* buffer_;
   WriteStream stream_;
-  GrowableArray<intptr_t> ident_table_[kTableSize];
-  GrowableArray<intptr_t> literal_table_[kTableSize];
-  const GrowableObjectArray& token_objects_;
-  Object& token_obj_;
-  LiteralToken& literal_token_;
-  String& literal_str_;
+  CompressedTokenMap tokens_;
 
   DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData);
 };
 
 
+const double CompressedTokenStreamData::kMaxLoadFactor = 0.75;
+
+
 RawTokenStream* TokenStream::New(const Scanner::GrowableTokenStream& tokens,
                                  const String& private_key) {
   // Copy the relevant data out of the scanner into a compressed stream of
@@ -7763,7 +7785,7 @@
       if (FLAG_compiler_stats) {
         CompilerStats::num_literal_tokens_total += 1;
       }
-      data.AddLiteralToken(token.kind, token.literal);
+      data.AddLiteralToken(token);
     } else {  // Keyword, pseudo keyword etc.
       ASSERT(token.kind < Token::kNumTokens);
       data.AddSimpleToken(token.kind);
@@ -7781,11 +7803,11 @@
   stream.AddFinalizer(data.GetStream(), DataFinalizer);
   const TokenStream& result = TokenStream::Handle(New());
   result.SetPrivateKey(private_key);
+  const Array& token_objects = Array::Handle(data.MakeTokenObjectsArray());
   {
     NoGCScope no_gc;
     result.SetStream(stream);
-    const Array& tokens = Array::Handle(Array::MakeArray(data.TokenObjects()));
-    result.SetTokenObjects(tokens);
+    result.SetTokenObjects(token_objects);
   }
   return result.raw();
 }
@@ -8305,6 +8327,25 @@
 }
 
 
+RawLibrary* Script::FindLibrary() const {
+  Isolate* isolate = Isolate::Current();
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      isolate, isolate->object_store()->libraries());
+  Library& lib = Library::Handle();
+  Array& scripts = Array::Handle();
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    scripts = lib.LoadedScripts();
+    for (intptr_t j = 0; j < scripts.Length(); j++) {
+      if (scripts.At(j) == raw()) {
+        return lib.raw();
+      }
+    }
+  }
+  return Library::null();
+}
+
+
 // See also Dart_ScriptGetTokenInfo.
 void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
@@ -8313,13 +8354,17 @@
   ASSERT(!name.IsNull());
   const String& encoded_url = String::Handle(String::EncodeURI(name));
   ASSERT(!encoded_url.IsNull());
-  jsobj.AddPropertyF("id", "scripts/%s", encoded_url.ToCString());
+  const Library& lib = Library::Handle(FindLibrary());
+  intptr_t lib_index = (lib.IsNull()) ? -1 : lib.index();
+  jsobj.AddPropertyF("id", "libraries/%" Pd "/scripts/%s",
+      lib_index, encoded_url.ToCString());
   jsobj.AddProperty("name", name.ToCString());
   jsobj.AddProperty("user_name", name.ToCString());
   jsobj.AddProperty("kind", GetKindAsCString());
   if (ref) {
     return;
   }
+  jsobj.AddProperty("owning_library", lib);
   const String& source = String::Handle(Source());
   jsobj.AddProperty("source", source.ToCString());
 
@@ -8903,6 +8948,25 @@
       AddScriptIfUnique(scripts, owner_script);
     }
 
+    // Special case: Scripts that only contain external top-level functions are
+    // not included above, but can be referenced through a library's anonymous
+    // classes. Example: dart-core:identical.dart.
+    Array& anon_classes = Array::Handle(anonymous_classes());
+    Function& func = Function::Handle();
+    Array& functions = Array::Handle();
+    for (intptr_t i = 0; i < anon_classes.Length(); i++) {
+      cls ^= anon_classes.At(i);
+      if (cls.IsNull()) continue;
+      owner_script = cls.script();
+      AddScriptIfUnique(scripts, owner_script);
+      functions = cls.functions();
+      for (intptr_t j = 0; j < functions.Length(); j++) {
+        func ^= functions.At(j);
+        owner_script = func.script();
+        AddScriptIfUnique(scripts, owner_script);
+      }
+    }
+
     // Create the array of scripts and cache it in loaded_scripts_.
     const Array& scripts_array = Array::Handle(Array::MakeArray(scripts));
     StorePointer(&raw_ptr()->loaded_scripts_, scripts_array.raw());
@@ -9492,6 +9556,11 @@
 }
 
 
+RawLibrary* Library::ConvertLibrary() {
+  return Isolate::Current()->object_store()->convert_library();
+}
+
+
 RawLibrary* Library::CoreLibrary() {
   return Isolate::Current()->object_store()->core_library();
 }
@@ -9745,8 +9814,9 @@
     this->set_is_loaded();
     return true;
   } else if (deferred_lib.LoadNotStarted()) {
-    deferred_lib.SetLoadRequested();
     Isolate* isolate = Isolate::Current();
+    Api::Scope api_scope(isolate);
+    deferred_lib.SetLoadRequested();
     const String& lib_url = String::Handle(isolate, deferred_lib.url());
     Dart_LibraryTagHandler handler = isolate->library_tag_handler();
     handler(Dart_kImportTag,
@@ -10214,7 +10284,18 @@
 }
 
 
-RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors) {
+intptr_t PcDescriptors::RecordSizeInBytes() const {
+  return raw_ptr()->record_size_in_bytes_;
+}
+
+
+void PcDescriptors::SetRecordSizeInBytes(intptr_t value) const {
+  raw_ptr()->record_size_in_bytes_ = value;
+}
+
+
+RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors,
+                                     bool has_try_index) {
   ASSERT(Object::pc_descriptors_class() != Class::null());
   if (num_descriptors < 0 || num_descriptors > kMaxElements) {
     // This should be caught before we reach here.
@@ -10223,13 +10304,15 @@
   }
   PcDescriptors& result = PcDescriptors::Handle();
   {
-    uword size = PcDescriptors::InstanceSize(num_descriptors);
+    const intptr_t rec_size =  RawPcDescriptors::RecordSize(has_try_index);
+    uword size = PcDescriptors::InstanceSize(num_descriptors, rec_size);
     RawObject* raw = Object::Allocate(PcDescriptors::kClassId,
                                       size,
                                       Heap::kOld);
     NoGCScope no_gc;
     result ^= raw;
     result.SetLength(num_descriptors);
+    result.SetRecordSizeInBytes(rec_size);
   }
   return result.raw();
 }
@@ -10276,13 +10359,14 @@
   intptr_t len = 1;  // Trailing '\0'.
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
     len += OS::SNPrint(NULL, 0, kFormat, addr_width,
-                       rec.pc,
+                       rec.pc(),
                        KindAsStr(rec.kind()),
-                       rec.deopt_id,
-                       rec.token_pos,
-                       rec.try_index);
+                       rec.deopt_id(),
+                       rec.token_pos(),
+                       rec.try_index());
   }
   // Allocate the buffer.
   char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len);
@@ -10290,13 +10374,14 @@
   intptr_t index = 0;
   Iterator iter2(*this, RawPcDescriptors::kAnyKind);
   while (iter2.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter2.Next();
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter2.NextRec(&rec);
     index += OS::SNPrint((buffer + index), (len - index), kFormat, addr_width,
-                         rec.pc,
+                         rec.pc(),
                          KindAsStr(rec.kind()),
-                         rec.deopt_id,
-                         rec.token_pos,
-                         rec.try_index);
+                         rec.deopt_id(),
+                         rec.token_pos(),
+                         rec.try_index());
   }
   return buffer;
 }
@@ -10311,13 +10396,14 @@
   JSONArray members(jsobj, "members");
   Iterator iter(*this, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
     JSONObject descriptor(&members);
-    descriptor.AddPropertyF("pc", "%" Px "", rec.pc);
+    descriptor.AddPropertyF("pc", "%" Px "", rec.pc());
     descriptor.AddProperty("kind", KindAsStr(rec.kind()));
-    descriptor.AddProperty("deoptId",  static_cast<intptr_t>(rec.deopt_id));
-    descriptor.AddProperty("tokenPos",  static_cast<intptr_t>(rec.token_pos));
-    descriptor.AddProperty("tryIndex",  static_cast<intptr_t>(rec.try_index));
+    descriptor.AddProperty("deoptId",  static_cast<intptr_t>(rec.deopt_id()));
+    descriptor.AddProperty("tokenPos",  static_cast<intptr_t>(rec.token_pos()));
+    descriptor.AddProperty("tryIndex",  static_cast<intptr_t>(rec.try_index()));
   }
 }
 
@@ -10349,13 +10435,11 @@
   }
   Iterator iter(*this, RawPcDescriptors::kDeopt | RawPcDescriptors::kIcCall);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    RawPcDescriptors::Kind kind = rec.kind();
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
     // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
-    intptr_t deopt_id = Isolate::kNoDeoptId;
 
-    deopt_id = rec.deopt_id;
-    if (Isolate::IsDeoptAfter(deopt_id)) {
+    if (Isolate::IsDeoptAfter(rec.deopt_id())) {
       // TODO(vegorov): some instructions contain multiple calls and have
       // multiple "after" targets recorded. Right now it is benign but might
       // lead to issues in the future. Fix that and enable verification.
@@ -10364,11 +10448,10 @@
 
     Iterator nested(iter);
     while (nested.HasNext()) {
-      const RawPcDescriptors::PcDescriptorRec& nested_rec = nested.Next();
-      if (kind == nested_rec.kind()) {
-        if (deopt_id != Isolate::kNoDeoptId) {
-          ASSERT(nested_rec.deopt_id != deopt_id);
-        }
+      RawPcDescriptors::PcDescriptorRec nested_rec;
+      nested.NextRec(&nested_rec);
+      if (rec.kind() == nested_rec.kind()) {
+        ASSERT(nested_rec.deopt_id() != rec.deopt_id());
       }
     }
   }
@@ -10377,12 +10460,9 @@
 
 
 uword PcDescriptors::GetPcForKind(RawPcDescriptors::Kind kind) const {
-  Iterator iter(*this, RawPcDescriptors::kAnyKind);
-  while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.kind() == kind) {
-      return rec.pc;
-    }
+  Iterator iter(*this, kind);
+  if (iter.HasNext()) {
+    return iter.NextPc();
   }
   return 0;
 }
@@ -11881,9 +11961,10 @@
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.pc == pc) {
-      return rec.token_pos;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if (rec.pc() == pc) {
+      return rec.token_pos();
     }
   }
   return -1;
@@ -11895,9 +11976,10 @@
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, kind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.deopt_id == deopt_id) {
-      uword pc = rec.pc;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if (rec.deopt_id() == deopt_id) {
+      uword pc = rec.pc();
       ASSERT(ContainsInstructionAt(pc));
       return pc;
     }
@@ -11910,9 +11992,10 @@
   const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kOsrEntry);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.pc == pc) {
-      return rec.deopt_id;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if (rec.pc() == pc) {
+      return rec.deopt_id();
     }
   }
   return Isolate::kNoDeoptId;
@@ -12688,6 +12771,22 @@
 }
 
 
+RawUnhandledException* UnhandledException::New(Heap::Space space) {
+  ASSERT(Object::unhandled_exception_class() != Class::null());
+  UnhandledException& result = UnhandledException::Handle();
+  {
+    RawObject* raw = Object::Allocate(UnhandledException::kClassId,
+                                      UnhandledException::InstanceSize(),
+                                      space);
+    NoGCScope no_gc;
+    result ^= raw;
+  }
+  result.set_exception(Object::null_instance());
+  result.set_stacktrace(Object::null_instance());
+  return result.raw();
+}
+
+
 void UnhandledException::set_exception(const Instance& exception) const {
   StorePointer(&raw_ptr()->exception_, exception.raw());
 }
@@ -16967,7 +17066,7 @@
   ASSERT(0 <= start);
   ASSERT(start <= end);
   ASSERT(end <= str.Length());
-  int length = end - start;
+  intptr_t length = end - start;
   NoGCScope no_gc;
   const uint8_t* startChar;
   if (str.IsOneByteString()) {
@@ -16976,8 +17075,9 @@
     startChar = ExternalOneByteString::CharAddr(str, start);
   } else {
     uint8_t* chars = Isolate::Current()->current_zone()->Alloc<uint8_t>(length);
-    for (int i = 0; i < length; i++) {
-      int ch = str.CharAt(start + i);
+    const Scanner::CharAtFunc char_at = str.CharAtFunc();
+    for (intptr_t i = 0; i < length; i++) {
+      int32_t ch = char_at(str, start + i);
       if (ch < 128) {
         chars[i] = ch;
       } else {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 35e1987..d499f92 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2514,6 +2514,7 @@
 
   void Tokenize(const String& private_key) const;
 
+  RawLibrary* FindLibrary() const;
   RawString* GetLine(intptr_t line_number) const;
   RawString* GetSnippet(intptr_t from_token_pos,
                         intptr_t to_token_pos) const;
@@ -2767,6 +2768,7 @@
   static void InitNativeWrappersLibrary(Isolate* isolate);
 
   static RawLibrary* AsyncLibrary();
+  static RawLibrary* ConvertLibrary();
   static RawLibrary* CoreLibrary();
   static RawLibrary* CollectionLibrary();
   static RawLibrary* InternalLibrary();
@@ -2998,32 +3000,35 @@
                      int64_t token_pos,  // Or deopt reason.
                      intptr_t try_index) const {  // Or deopt index.
     RawPcDescriptors::PcDescriptorRec* rec = recAt(index);
-    rec->pc = pc;
-    rec->kind_ = kind;
+    rec->set_pc(pc);
+    rec->set_kind(kind);
     ASSERT(Utils::IsInt(32, deopt_id));
-    rec->deopt_id = deopt_id;
+    rec->set_deopt_id(deopt_id);
     ASSERT(Utils::IsInt(32, token_pos));
-    rec->token_pos = token_pos;
+    rec->set_token_pos(token_pos,
+        RecordSizeInBytes() == RawPcDescriptors::kCompressedRecSize);
     ASSERT(Utils::IsInt(16, try_index));
-    rec->try_index = try_index;
+    rec->set_try_index(try_index);
+    ASSERT(rec->try_index() == try_index);
+    ASSERT(rec->token_pos() == token_pos);
   }
 
-  static const intptr_t kBytesPerElement =
+  static const intptr_t kMaxBytesPerElement =
       sizeof(RawPcDescriptors::PcDescriptorRec);
-  static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
+  static const intptr_t kMaxElements = kSmiMax / kMaxBytesPerElement;
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawPcDescriptors) ==
            OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
     return 0;
   }
-  static intptr_t InstanceSize(intptr_t len) {
+  static intptr_t InstanceSize(intptr_t len, intptr_t record_size_in_bytes) {
     ASSERT(0 <= len && len <= kMaxElements);
     return RoundedAllocationSize(
-        sizeof(RawPcDescriptors) + (len * kBytesPerElement));
+        sizeof(RawPcDescriptors) + (len * record_size_in_bytes));
   }
 
-  static RawPcDescriptors* New(intptr_t num_descriptors);
+  static RawPcDescriptors* New(intptr_t num_descriptors, bool has_try_index);
 
   // Returns 0 if not found.
   uword GetPcForKind(RawPcDescriptors::Kind kind) const;
@@ -3037,7 +3042,8 @@
 
   // We would have a VisitPointers function here to traverse the
   // pc descriptors table to visit objects if any in the table.
-
+  // Note: never return a reference to a RawPcDescriptors::PcDescriptorRec
+  // as the object can move.
   class Iterator : ValueObject {
    public:
     Iterator(const PcDescriptors& descriptors, intptr_t kind_mask)
@@ -3047,12 +3053,26 @@
 
     bool HasNext() const { return current_ix_ < descriptors_.Length(); }
 
-    const RawPcDescriptors::PcDescriptorRec& Next() {
+    intptr_t NextDeoptId() {
       ASSERT(HasNext());
-      const RawPcDescriptors::PcDescriptorRec* res =
-         descriptors_.recAt(current_ix_++);
+      const intptr_t res = descriptors_.recAt(current_ix_++)->deopt_id();
       MoveToMatching();
-      return *res;
+      return res;
+    }
+
+    uword NextPc() {
+      ASSERT(HasNext());
+      const uword res = descriptors_.recAt(current_ix_++)->pc();
+      MoveToMatching();
+      return res;
+    }
+
+    void NextRec(RawPcDescriptors::PcDescriptorRec* result) {
+      ASSERT(HasNext());
+      const RawPcDescriptors::PcDescriptorRec* r =
+          descriptors_.recAt(current_ix_++);
+      r->CopyTo(result);
+      MoveToMatching();
     }
 
    private:
@@ -3070,7 +3090,7 @@
       while (current_ix_ < descriptors_.Length()) {
         const RawPcDescriptors::PcDescriptorRec& rec =
             *descriptors_.recAt(current_ix_);
-        if ((rec.kind_ & kind_mask_) != 0) {
+        if ((rec.kind() & kind_mask_) != 0) {
           return;  // Current is valid.
         } else {
           ++current_ix_;
@@ -3087,12 +3107,16 @@
   static const char* KindAsStr(RawPcDescriptors::Kind kind);
 
   intptr_t Length() const;
+  void SetLength(intptr_t value) const;
+
+  void SetRecordSizeInBytes(intptr_t value) const;
+  intptr_t RecordSizeInBytes() const;
 
   RawPcDescriptors::PcDescriptorRec* recAt(intptr_t ix) const {
     ASSERT(ix < Length());
-    return &raw_ptr()->data()[ix];
+    uint8_t* d = raw_ptr()->data() + (ix * RecordSizeInBytes());
+    return reinterpret_cast<RawPcDescriptors::PcDescriptorRec*>(d);
   }
-  void SetLength(intptr_t value) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
   friend class Class;
@@ -4170,11 +4194,14 @@
   virtual const char* ToErrorCString() const;
 
  private:
+  static RawUnhandledException* New(Heap::Space space = Heap::kNew);
+
   void set_exception(const Instance& exception) const;
   void set_stacktrace(const Instance& stacktrace) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(UnhandledException, Error);
   friend class Class;
+  friend class ObjectStore;
 };
 
 
@@ -4317,6 +4344,7 @@
 
   // TODO(iposva): Determine if this gets in the way of Smi.
   HEAP_OBJECT_IMPLEMENTATION(Instance, Object);
+  friend class ByteBuffer;
   friend class Class;
   friend class Closure;
   friend class DeferredObject;
@@ -5348,9 +5376,15 @@
 
   static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
   static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
-  static intptr_t Hash(const uint8_t* characters, intptr_t len);
+  static intptr_t HashLatin1(const uint8_t* characters, intptr_t len);
   static intptr_t Hash(const uint16_t* characters, intptr_t len);
   static intptr_t Hash(const int32_t* characters, intptr_t len);
+  static intptr_t HashRawSymbol(const RawString* symbol) {
+    ASSERT(symbol->IsCanonical());
+    intptr_t result = Smi::Value(symbol->ptr()->hash_);
+    ASSERT(result != 0);
+    return result;
+  }
 
   virtual RawObject* HashCode() const { return Integer::New(Hash()); }
 
@@ -5368,8 +5402,10 @@
   // Compares to a '\0' terminated array of UTF-8 encoded characters.
   bool Equals(const char* cstr) const;
 
-  // Compares to an array of UTF-8 encoded characters.
-  bool Equals(const uint8_t* characters, intptr_t len) const;
+  // Compares to an array of Latin-1 encoded characters.
+  bool EqualsLatin1(const uint8_t* characters, intptr_t len) const {
+    return Equals(characters, len);
+  }
 
   // Compares to an array of UTF-16 encoded characters.
   bool Equals(const uint16_t* characters, intptr_t len) const;
@@ -5535,6 +5571,12 @@
                           double* result);
 
  protected:
+  // These two operate on an array of Latin-1 encoded characters.
+  // They are protected to avoid mistaking Latin-1 for UTF-8, but used
+  // by friendly templated code (e.g., Symbols).
+  bool Equals(const uint8_t* characters, intptr_t len) const;
+  static intptr_t Hash(const uint8_t* characters, intptr_t len);
+
   bool HasHash() const {
     ASSERT(Smi::New(0) == NULL);
     return (raw_ptr()->hash_ != NULL);
@@ -6679,6 +6721,28 @@
 };
 
 
+class ByteBuffer : public AllStatic {
+ public:
+  static RawInstance* Data(const Instance& view_obj) {
+    ASSERT(!view_obj.IsNull());
+    return *reinterpret_cast<RawInstance**>(view_obj.raw_ptr() + kDataOffset);
+  }
+
+  static intptr_t NumberOfFields() {
+    return kDataOffset;
+  }
+
+  static intptr_t data_offset() {
+    return kWordSize * kDataOffset;
+  }
+
+ private:
+  enum {
+    kDataOffset = 1,
+  };
+};
+
+
 class Closure : public AllStatic {
  public:
   static RawFunction* function(const Instance& closure) {
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index d7386d6..0c6a9fe 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -132,6 +132,13 @@
     return false;
   }
   set_out_of_memory(Instance::Cast(result));
+
+  // Allocate pre-allocated unhandled exception object initialized with the
+  // pre-allocated OutOfMemoryError.
+  const UnhandledException& unhandled_exception = UnhandledException::Handle(
+      UnhandledException::New(Instance::Cast(result), Object::null_instance()));
+  set_preallocated_unhandled_exception(unhandled_exception);
+
   const Array& code_array = Array::Handle(
       isolate,
       Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld));
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index b3129a1..9aead15 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -380,6 +380,13 @@
     out_of_memory_ = value.raw();
   }
 
+  RawUnhandledException* preallocated_unhandled_exception() const {
+    return preallocated_unhandled_exception_;
+  }
+  void set_preallocated_unhandled_exception(const UnhandledException& value) {
+    preallocated_unhandled_exception_ = value.raw();
+  }
+
   RawStacktrace* preallocated_stack_trace() const {
     return preallocated_stack_trace_;
   }
@@ -495,6 +502,7 @@
   RawContext* empty_context_;
   RawInstance* stack_overflow_;
   RawInstance* out_of_memory_;
+  RawUnhandledException* preallocated_unhandled_exception_;
   RawStacktrace* preallocated_stack_trace_;
   RawFunction* lookup_port_handler_;
   RawFunction* handle_message_function_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 76e123c..5a0f3f7 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1277,7 +1277,7 @@
     const String& onestr = String::Handle(String::FromLatin1(one, one_len));
     EXPECT(onestr.IsOneByteString());
     EXPECT_EQ(one_len, onestr.Length());
-    EXPECT(onestr.Equals(one, one_len));
+    EXPECT(onestr.EqualsLatin1(one, one_len));
 
     uint16_t two[] = { 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9 };
     intptr_t two_len = sizeof(two) / sizeof(two[0]);
@@ -2728,7 +2728,7 @@
   const int kNumEntries = 6;
   // Add PcDescriptors to the code.
   PcDescriptors& descriptors = PcDescriptors::Handle();
-  descriptors ^= PcDescriptors::New(kNumEntries);
+  descriptors ^= PcDescriptors::New(kNumEntries, true);
   descriptors.AddDescriptor(0, 10, RawPcDescriptors::kOther, 1, 20, 1);
   descriptors.AddDescriptor(1, 20, RawPcDescriptors::kDeopt, 2, 30, 0);
   descriptors.AddDescriptor(2, 30, RawPcDescriptors::kOther, 3, 40, 1);
@@ -2746,32 +2746,94 @@
   // Verify the PcDescriptor entries by accessing them.
   const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
-  const RawPcDescriptors::PcDescriptorRec& rec0 = iter.Next();
-  const RawPcDescriptors::PcDescriptorRec& rec1 = iter.Next();
-  const RawPcDescriptors::PcDescriptorRec& rec2 = iter.Next();
-  const RawPcDescriptors::PcDescriptorRec& rec3 = iter.Next();
-  const RawPcDescriptors::PcDescriptorRec& rec4 = iter.Next();
-  const RawPcDescriptors::PcDescriptorRec& rec5 = iter.Next();
+  RawPcDescriptors::PcDescriptorRec rec0;
+  RawPcDescriptors::PcDescriptorRec rec1;
+  RawPcDescriptors::PcDescriptorRec rec2;
+  RawPcDescriptors::PcDescriptorRec rec3;
+  RawPcDescriptors::PcDescriptorRec rec4;
+  RawPcDescriptors::PcDescriptorRec rec5;
+  iter.NextRec(&rec0);
+  iter.NextRec(&rec1);
+  iter.NextRec(&rec2);
+  iter.NextRec(&rec3);
+  iter.NextRec(&rec4);
+  iter.NextRec(&rec5);
   ASSERT(!iter.HasNext());
 
-  EXPECT_EQ(1, rec0.try_index);
-  EXPECT_EQ(static_cast<uword>(10), rec0.pc);
-  EXPECT_EQ(1, rec0.deopt_id);
-  EXPECT_EQ(20, rec0.token_pos);
+  EXPECT_EQ(1, rec0.try_index());
+  EXPECT_EQ(static_cast<uword>(10), rec0.pc());
+  EXPECT_EQ(1, rec0.deopt_id());
+  EXPECT_EQ(20, rec0.token_pos());
 
-  EXPECT_EQ(3, rec5.try_index);
-  EXPECT_EQ(static_cast<uword>(80), rec5.pc);
-  EXPECT_EQ(150, rec5.token_pos);
+  EXPECT_EQ(3, rec5.try_index());
+  EXPECT_EQ(static_cast<uword>(80), rec5.pc());
+  EXPECT_EQ(150, rec5.token_pos());
   EXPECT_EQ(RawPcDescriptors::kOther, rec0.kind());
   EXPECT_EQ(RawPcDescriptors::kDeopt, rec1.kind());
 
-  EXPECT_EQ(30, rec1.token_pos);
-  EXPECT_EQ(40, rec2.token_pos);
-  EXPECT_EQ(40, rec3.token_pos);
-  EXPECT_EQ(80, rec4.token_pos);
+  EXPECT_EQ(30, rec1.token_pos());
+  EXPECT_EQ(40, rec2.token_pos());
+  EXPECT_EQ(40, rec3.token_pos());
+  EXPECT_EQ(80, rec4.token_pos());
 }
 
 
+TEST_CASE(PcDescriptorsCompressed) {
+  const int kNumEntries = 6;
+  // Add PcDescriptors to the code.
+  PcDescriptors& descriptors = PcDescriptors::Handle();
+  // PcDescritpors have no try-index.
+  descriptors ^= PcDescriptors::New(kNumEntries, false);
+  descriptors.AddDescriptor(0, 10, RawPcDescriptors::kOther, 1, 20, -1);
+  descriptors.AddDescriptor(1, 20, RawPcDescriptors::kDeopt, 2, 30, -1);
+  descriptors.AddDescriptor(2, 30, RawPcDescriptors::kOther, 3, 40, -1);
+  descriptors.AddDescriptor(3, 10, RawPcDescriptors::kOther, 4, 40, -1);
+  descriptors.AddDescriptor(4, 10, RawPcDescriptors::kOther, 5, 80, -1);
+  descriptors.AddDescriptor(5, 80, RawPcDescriptors::kOther, 6, 150, -1);
+
+  extern void GenerateIncrement(Assembler* assembler);
+  Assembler _assembler_;
+  GenerateIncrement(&_assembler_);
+  Code& code = Code::Handle(Code::FinalizeCode(
+      *CreateFunction("Test_Code"), &_assembler_));
+  code.set_pc_descriptors(descriptors);
+
+  // Verify the PcDescriptor entries by accessing them.
+  const PcDescriptors& pc_descs = PcDescriptors::Handle(code.pc_descriptors());
+  PcDescriptors::Iterator iter(pc_descs, RawPcDescriptors::kAnyKind);
+  RawPcDescriptors::PcDescriptorRec rec0;
+  RawPcDescriptors::PcDescriptorRec rec1;
+  RawPcDescriptors::PcDescriptorRec rec2;
+  RawPcDescriptors::PcDescriptorRec rec3;
+  RawPcDescriptors::PcDescriptorRec rec4;
+  RawPcDescriptors::PcDescriptorRec rec5;
+  iter.NextRec(&rec0);
+  iter.NextRec(&rec1);
+  iter.NextRec(&rec2);
+  iter.NextRec(&rec3);
+  iter.NextRec(&rec4);
+  iter.NextRec(&rec5);
+  ASSERT(!iter.HasNext());
+
+  EXPECT_EQ(-1, rec0.try_index());
+  EXPECT_EQ(static_cast<uword>(10), rec0.pc());
+  EXPECT_EQ(1, rec0.deopt_id());
+  EXPECT_EQ(20, rec0.token_pos());
+
+  EXPECT_EQ(-1, rec5.try_index());
+  EXPECT_EQ(static_cast<uword>(80), rec5.pc());
+  EXPECT_EQ(150, rec5.token_pos());
+  EXPECT_EQ(RawPcDescriptors::kOther, rec0.kind());
+  EXPECT_EQ(RawPcDescriptors::kDeopt, rec1.kind());
+
+  EXPECT_EQ(30, rec1.token_pos());
+  EXPECT_EQ(40, rec2.token_pos());
+  EXPECT_EQ(40, rec3.token_pos());
+  EXPECT_EQ(80, rec4.token_pos());
+}
+
+
+
 static RawClass* CreateTestClass(const char* name) {
   const String& class_name = String::Handle(Symbols::New(name));
   const Class& cls = Class::Handle(
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 0299b31..db1ec03 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -35,12 +35,11 @@
     "Generate symbols of generated dart functions for debugging with GDB");
 DEFINE_FLAG(bool, generate_perf_events_symbols, false,
     "Generate events symbols for profiling with perf");
-DEFINE_FLAG(charp, generate_pprof_symbols, NULL,
-    "Generate events symbols for profiling with pprof");
+
 
 class PerfCodeObserver : public CodeObserver {
  public:
-  PerfCodeObserver() {
+  PerfCodeObserver() : out_file_(NULL) {
     Dart_FileOpenCallback file_open = Isolate::file_open_callback();
     if (file_open == NULL) {
       return;
@@ -55,15 +54,14 @@
 
   ~PerfCodeObserver() {
     Dart_FileCloseCallback file_close = Isolate::file_close_callback();
-    if (file_close == NULL) {
+    if ((file_close == NULL) || (out_file_ == NULL)) {
       return;
     }
-    ASSERT(out_file_ != NULL);
     (*file_close)(out_file_);
   }
 
   virtual bool IsActive() const {
-    return FLAG_generate_perf_events_symbols;
+    return FLAG_generate_perf_events_symbols && (out_file_ != NULL);
   }
 
   virtual void Notify(const char* name,
@@ -72,13 +70,14 @@
                       uword size,
                       bool optimized) {
     Dart_FileWriteCallback file_write = Isolate::file_write_callback();
-    ASSERT(file_write != NULL);
+    if ((file_write == NULL) || (out_file_ == NULL)) {
+      return;
+    }
     const char* format = "%" Px " %" Px " %s%s\n";
     const char* marker = optimized ? "*" : "";
     intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name);
     char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
     OS::SNPrint(buffer, len + 1, format, base, size, marker, name);
-    ASSERT(out_file_ != NULL);
     (*file_write)(buffer, len, out_file_);
   }
 
@@ -88,64 +87,6 @@
   DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver);
 };
 
-class PprofCodeObserver : public CodeObserver {
- public:
-  PprofCodeObserver() {
-    pprof_symbol_generator_ = DebugInfo::NewGenerator();
-  }
-
-  ~PprofCodeObserver() {
-    Dart_FileOpenCallback file_open = Isolate::file_open_callback();
-    if (file_open == NULL) {
-      return;
-    }
-    Dart_FileCloseCallback file_close = Isolate::file_close_callback();
-    if (file_close == NULL) {
-      return;
-    }
-    Dart_FileWriteCallback file_write = Isolate::file_write_callback();
-    if (file_write == NULL) {
-      return;
-    }
-    if (FLAG_generate_pprof_symbols == NULL) {
-      return;
-    }
-    const char* filename = FLAG_generate_pprof_symbols;
-    void* out_file = (*file_open)(filename, true);
-    ASSERT(out_file != NULL);
-    DebugInfo::ByteBuffer* debug_region = new DebugInfo::ByteBuffer();
-    ASSERT(debug_region != NULL);
-    pprof_symbol_generator_->WriteToMemory(debug_region);
-    int buffer_size = debug_region->size();
-    void* buffer = debug_region->data();
-    delete debug_region;
-    if (buffer_size > 0) {
-      ASSERT(buffer != NULL);
-      (*file_write)(buffer, buffer_size, out_file);
-    }
-    (*file_close)(out_file);
-    DebugInfo::UnregisterAllSections();
-  }
-
-  virtual bool IsActive() const {
-    return FLAG_generate_pprof_symbols != NULL;
-  }
-
-  virtual void Notify(const char* name,
-                      uword base,
-                      uword prologue_offset,
-                      uword size,
-                      bool optimized) {
-    ASSERT(pprof_symbol_generator_ != NULL);
-    pprof_symbol_generator_->AddCode(base, size);
-    pprof_symbol_generator_->AddCodeRegion(name, base, size);
-  }
-
- private:
-  DebugInfo* pprof_symbol_generator_;
-
-  DISALLOW_COPY_AND_ASSIGN(PprofCodeObserver);
-};
 
 class GdbCodeObserver : public CodeObserver {
  public:
@@ -450,9 +391,6 @@
   if (FLAG_generate_gdb_symbols) {
     CodeObservers::Register(new GdbCodeObserver);
   }
-  if (FLAG_generate_pprof_symbols != NULL) {
-    CodeObservers::Register(new PprofCodeObserver);
-  }
 #if defined(DART_VTUNE_SUPPORT)
   CodeObservers::Register(new VTuneCodeObserver);
 #endif
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index cf94d18..92864e0 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -37,105 +37,13 @@
     "Generate symbols of generated dart functions for debugging with GDB");
 DEFINE_FLAG(bool, generate_perf_events_symbols, false,
     "Generate events symbols for profiling with perf");
-DEFINE_FLAG(bool, ll_prof, false,
-    "Generate compiled code log file for processing with ll_prof.py.");
-DEFINE_FLAG(charp, generate_pprof_symbols, NULL,
-    "Writes pprof events symbols to the provided file");
 DEFINE_FLAG(bool, generate_perf_jitdump, false,
     "Writes jitdump data for profiling with perf annotate");
 
-class LowLevelProfileCodeObserver : public CodeObserver {
- public:
-  LowLevelProfileCodeObserver() {
-    Dart_FileOpenCallback file_open = Isolate::file_open_callback();
-    if (file_open == NULL) {
-      return;
-    }
-    const char* filename = "v8.log.ll";
-    log_file_ = (*file_open)(filename, true);
-#if defined(TARGET_ARCH_IA32)
-    const char arch[] = "ia32";
-#elif defined(TARGET_ARCH_X64)
-    const char arch[] = "x64";
-#elif defined(TARGET_ARCH_ARM)
-    const char arch[] = "arm";
-#elif defined(TARGET_ARCH_ARM64)
-    const char arch[] = "arm64";
-#elif defined(TARGET_ARCH_MIPS)
-    const char arch[] = "mips";
-#else
-#error Unknown architecture.
-#endif
-    LowLevelLogWriteBytes(arch, sizeof(arch));
-  }
-
-  ~LowLevelProfileCodeObserver() {
-    Dart_FileCloseCallback file_close = Isolate::file_close_callback();
-    if (file_close == NULL) {
-      return;
-    }
-    ASSERT(log_file_ != NULL);
-    (*file_close)(log_file_);
-  }
-
-  virtual bool IsActive() const {
-    return FLAG_ll_prof;
-  }
-
-  struct LowLevelCodeCreateStruct {
-    static const char kTag = 'C';
-
-    int32_t name_size;
-    uword code_address;
-    int32_t code_size;
-  };
-
-  template <typename T>
-  void LowLevelLogWriteStruct(const T& s) {
-    char tag = T::kTag;
-    LowLevelLogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag));
-    LowLevelLogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s));
-  }
-
-  void LowLevelLogWriteBytes(const char* bytes, int size) {
-    Dart_FileWriteCallback file_write = Isolate::file_write_callback();
-    ASSERT(file_write != NULL);
-    (file_write)(bytes, size, log_file_);
-  }
-
-  virtual void Notify(const char* name,
-                      uword base,
-                      uword prologue_offset,
-                      uword size,
-                      bool optimized) {
-    const char* marker = optimized ? "*" : "";
-    char* name_buffer =
-        Isolate::Current()->current_zone()->PrintToString("%s%s", marker, name);
-    intptr_t len = strlen(name_buffer);
-
-    LowLevelCodeCreateStruct event;
-    event.name_size = len;
-    event.code_address = base;
-    event.code_size = size;
-
-    {
-      MutexLocker ml(CodeObservers::mutex());
-      LowLevelLogWriteStruct(event);
-      LowLevelLogWriteBytes(name_buffer, len);
-      LowLevelLogWriteBytes(reinterpret_cast<char*>(base), size);
-    }
-  }
-
- private:
-  void* log_file_;
-
-  DISALLOW_COPY_AND_ASSIGN(LowLevelProfileCodeObserver);
-};
-
 
 class PerfCodeObserver : public CodeObserver {
  public:
-  PerfCodeObserver() {
+  PerfCodeObserver() : out_file_(NULL) {
     Dart_FileOpenCallback file_open = Isolate::file_open_callback();
     if (file_open == NULL) {
       return;
@@ -151,15 +59,14 @@
 
   ~PerfCodeObserver() {
     Dart_FileCloseCallback file_close = Isolate::file_close_callback();
-    if (file_close == NULL) {
+    if ((file_close == NULL) || (out_file_ == NULL)) {
       return;
     }
-    ASSERT(out_file_ != NULL);
     (*file_close)(out_file_);
   }
 
   virtual bool IsActive() const {
-    return FLAG_generate_perf_events_symbols;
+    return FLAG_generate_perf_events_symbols && (out_file_ != NULL);
   }
 
   virtual void Notify(const char* name,
@@ -168,13 +75,14 @@
                       uword size,
                       bool optimized) {
     Dart_FileWriteCallback file_write = Isolate::file_write_callback();
-    ASSERT(file_write != NULL);
+    if ((file_write == NULL) || (out_file_ == NULL)) {
+      return;
+    }
     const char* format = "%" Px " %" Px " %s%s\n";
     const char* marker = optimized ? "*" : "";
     intptr_t len = OS::SNPrint(NULL, 0, format, base, size, marker, name);
     char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
     OS::SNPrint(buffer, len + 1, format, base, size, marker, name);
-    ASSERT(out_file_ != NULL);
     {
       MutexLocker ml(CodeObservers::mutex());
       (*file_write)(buffer, len, out_file_);
@@ -187,65 +95,6 @@
   DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver);
 };
 
-class PprofCodeObserver : public CodeObserver {
- public:
-  PprofCodeObserver() {
-    pprof_symbol_generator_ = DebugInfo::NewGenerator();
-  }
-
-  ~PprofCodeObserver() {
-    Dart_FileOpenCallback file_open = Isolate::file_open_callback();
-    if (file_open == NULL) {
-      return;
-    }
-    Dart_FileCloseCallback file_close = Isolate::file_close_callback();
-    if (file_close == NULL) {
-      return;
-    }
-    Dart_FileWriteCallback file_write = Isolate::file_write_callback();
-    if (file_write == NULL) {
-      return;
-    }
-    if (FLAG_generate_pprof_symbols == NULL) {
-      return;
-    }
-    const char* filename = FLAG_generate_pprof_symbols;
-    void* out_file = (*file_open)(filename, true);
-    ASSERT(out_file != NULL);
-    DebugInfo::ByteBuffer* debug_region = new DebugInfo::ByteBuffer();
-    ASSERT(debug_region != NULL);
-    pprof_symbol_generator_->WriteToMemory(debug_region);
-    int buffer_size = debug_region->size();
-    void* buffer = debug_region->data();
-    if (buffer_size > 0) {
-      MutexLocker ml(CodeObservers::mutex());
-      ASSERT(buffer != NULL);
-      (*file_write)(buffer, buffer_size, out_file);
-    }
-    delete debug_region;
-    (*file_close)(out_file);
-    DebugInfo::UnregisterAllSections();
-  }
-
-  virtual bool IsActive() const {
-    return FLAG_generate_pprof_symbols != NULL;
-  }
-
-  virtual void Notify(const char* name,
-                      uword base,
-                      uword prologue_offset,
-                      uword size,
-                      bool optimized) {
-    ASSERT(pprof_symbol_generator_ != NULL);
-    pprof_symbol_generator_->AddCode(base, size);
-    pprof_symbol_generator_->AddCodeRegion(name, base, size);
-  }
-
- private:
-  DebugInfo* pprof_symbol_generator_;
-
-  DISALLOW_COPY_AND_ASSIGN(PprofCodeObserver);
-};
 
 class GdbCodeObserver : public CodeObserver {
  public:
@@ -736,18 +585,12 @@
 
 
 void OS::RegisterCodeObservers() {
-  if (FLAG_ll_prof) {
-    CodeObservers::Register(new LowLevelProfileCodeObserver);
-  }
   if (FLAG_generate_perf_events_symbols) {
     CodeObservers::Register(new PerfCodeObserver);
   }
   if (FLAG_generate_gdb_symbols) {
     CodeObservers::Register(new GdbCodeObserver);
   }
-  if (FLAG_generate_pprof_symbols != NULL) {
-    CodeObservers::Register(new PprofCodeObserver);
-  }
   if (FLAG_generate_perf_jitdump) {
     CodeObservers::Register(new JitdumpCodeObserver);
   }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index a82fff7..c68767a 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -330,6 +330,16 @@
 }
 
 
+// Each try in this function gets its own try index.
+// See definition of RawPcDescriptors::PcDescriptor.
+int16_t Parser::AllocateTryIndex() {
+  if (!Utils::IsInt(16, last_used_try_index_ - 1)) {
+    ReportError("too many nested try statements");
+  }
+  return last_used_try_index_++;
+}
+
+
 void Parser::SetScript(const Script& script, intptr_t token_pos) {
   script_ = script.raw();
   tokens_iterator_.SetStream(
@@ -1377,9 +1387,20 @@
   const String& func_name = String::ZoneHandle(I, func.name());
   ArgumentListNode* arguments = BuildNoSuchMethodArguments(
       token_pos, func_name, *func_args, NULL, false);
-  const Function& no_such_method = Function::ZoneHandle(I,
-      Resolver::ResolveDynamicAnyArgs(Class::Handle(
-          I, func.Owner()), Symbols::NoSuchMethod()));
+  const intptr_t kNumArguments = 2;  // Receiver, InvocationMirror.
+  ArgumentsDescriptor args_desc(
+      Array::Handle(I, ArgumentsDescriptor::New(kNumArguments)));
+  Function& no_such_method = Function::ZoneHandle(I,
+      Resolver::ResolveDynamicForReceiverClass(Class::Handle(I, func.Owner()),
+                                               Symbols::NoSuchMethod(),
+                                               args_desc));
+  if (no_such_method.IsNull()) {
+    // If noSuchMethod(i) is not found, call Object:noSuchMethod.
+    no_such_method ^= Resolver::ResolveDynamicForReceiverClass(
+        Class::Handle(I, I->object_store()->object_class()),
+        Symbols::NoSuchMethod(),
+        args_desc);
+  }
   StaticCallNode* call =
       new StaticCallNode(token_pos, no_such_method, arguments);
 
@@ -3963,7 +3984,7 @@
       // Not patching a class, but it has been found. This must be one of the
       // pre-registered classes from object.cc or a duplicate definition.
       if (!(cls.is_prefinalized() ||
-            RawObject::IsTypedDataViewClassId(cls.id()))) {
+            RawObject::IsImplicitFieldClassId(cls.id()))) {
         ReportError(classname_pos, "class '%s' is already defined",
                     class_name.ToCString());
       }
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index fc68254..bd7c3d2 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -727,8 +727,9 @@
   TryBlocks* try_blocks_list_;
 
   // Each try in this function gets its own try index.
-  intptr_t AllocateTryIndex() { return last_used_try_index_++; }
-  intptr_t last_used_try_index_;
+  int16_t AllocateTryIndex();
+
+  int16_t last_used_try_index_;
 
   bool unregister_pending_function_;
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index c4fe878..1018cf4 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -1858,6 +1858,12 @@
     return;
   }
   ASSERT(isolate != Dart::vm_isolate());
+  if (StubCode::InJumpToExceptionHandlerStub(state.pc)) {
+    // The JumpToExceptionHandler stub manually adjusts the stack pointer,
+    // frame pointer, and some isolate state before jumping to a catch entry.
+    // It is not safe to walk the stack when executing this stub.
+    return;
+  }
   VMTagCounters* counters = isolate->vm_tag_counters();
   ASSERT(counters != NULL);
   counters->Increment(isolate->vm_tag());
@@ -1890,8 +1896,9 @@
     stackWalker.walk(isolate->heap());
   } else {
     if ((isolate->stub_code() != NULL) &&
-        (isolate->top_exit_frame_info() != 0)) {
-      // Collect only Dart frames.
+        (isolate->top_exit_frame_info() != 0) &&
+        (isolate->vm_tag() != VMTag::kScriptTagId)) {
+      // We have a valid exit frame info, use the Dart stack walker.
       ProfilerDartStackWalker stackWalker(isolate, sample);
       stackWalker.walk();
     } else {
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 4c06517..3a5c751 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -14,6 +14,12 @@
 
 namespace dart {
 
+
+const intptr_t RawPcDescriptors::kFullRecSize =
+    sizeof(RawPcDescriptors::PcDescriptorRec);
+const intptr_t RawPcDescriptors::kCompressedRecSize =
+    kFullRecSize - sizeof(int16_t);
+
 bool RawObject::IsVMHeapObject() const {
   return Dart::vm_isolate()->heap()->Contains(ToAddr(this));
 }
@@ -137,8 +143,11 @@
       case kPcDescriptorsCid: {
         const RawPcDescriptors* raw_descriptors =
             reinterpret_cast<const RawPcDescriptors*>(this);
-        intptr_t num_descriptors = raw_descriptors->ptr()->length_;
-        instance_size = PcDescriptors::InstanceSize(num_descriptors);
+        const intptr_t num_descriptors = raw_descriptors->ptr()->length_;
+        const intptr_t rec_size_in_bytes =
+            raw_descriptors->ptr()->record_size_in_bytes_;
+        instance_size = PcDescriptors::InstanceSize(num_descriptors,
+                                                    rec_size_in_bytes);
         break;
       }
       case kStackmapCid: {
@@ -235,7 +244,8 @@
 #define RAW_VISITPOINTERS(clazz)                                               \
       case kTypedData##clazz##ViewCid:
       CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS)
-      case kByteDataViewCid: {
+      case kByteDataViewCid:
+      case kByteBufferCid: {
         RawInstance* raw_obj = reinterpret_cast<RawInstance*>(this);
         size = RawInstance::VisitInstancePointers(raw_obj, visitor);
         break;
@@ -494,9 +504,16 @@
 }
 
 
+intptr_t RawPcDescriptors::RecordSize(bool has_try_index) {
+  return has_try_index ? RawPcDescriptors::kFullRecSize
+                       : RawPcDescriptors::kCompressedRecSize;
+}
+
+
 intptr_t RawPcDescriptors::VisitPcDescriptorsPointers(
     RawPcDescriptors* raw_obj, ObjectPointerVisitor* visitor) {
-  return PcDescriptors::InstanceSize(raw_obj->ptr()->length_);
+  return PcDescriptors::InstanceSize(raw_obj->ptr()->length_,
+                                     raw_obj->ptr()->record_size_in_bytes_);
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 34b701b..5d55742 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -150,6 +150,8 @@
 CLASS_LIST_TYPED_DATA(DEFINE_OBJECT_KIND)
 #undef DEFINE_OBJECT_KIND
 
+  kByteBufferCid,
+
   // The following entries do not describe a predefined class, but instead
   // are class indexes for pre-allocated instance (Null, dynamic and Void).
   kNullCid,
@@ -417,6 +419,7 @@
   static bool IsExternalTypedDataClassId(intptr_t index);
   static bool IsInternalVMdefinedClassId(intptr_t index);
   static bool IsVariableSizeClassId(intptr_t index);
+  static bool IsImplicitFieldClassId(intptr_t index);
 
   static intptr_t NumberOfTypedDataClasses();
 
@@ -451,10 +454,12 @@
 
   friend class Api;
   friend class Array;
+  friend class ByteBuffer;
   friend class Code;
   friend class FreeListElement;
   friend class GCMarker;
   friend class ExternalTypedData;
+  friend class ForwardList;
   friend class Heap;
   friend class HeapMapAsJSONVisitor;
   friend class ClassStatsVisitor;
@@ -915,23 +920,75 @@
     kAnyKind         = 0xFF
   };
 
-  struct PcDescriptorRec {
-    uword pc;
-    int32_t deopt_id;
-    int32_t token_pos;  // Or deopt reason.
-    int16_t try_index;  // Or deopt index.
-    uint8_t kind_;
+  // Compressed version assumes try_index is always -1 and does not store it.
+  class PcDescriptorRec {
+   public:
+    PcDescriptorRec()
+        : pc_(0), deopt_id_and_kind_(0), token_pos_(0), try_index_(0) {}
 
-    Kind kind() const { return static_cast<Kind>(kind_); }
+    uword pc() const { return pc_; }
+    void set_pc(uword value) { pc_ = value; }
+
+    Kind kind() const {
+      return static_cast<Kind>(deopt_id_and_kind_ & kAnyKind);
+    }
+    void set_kind(Kind kind) {
+      deopt_id_and_kind_ = (deopt_id_and_kind_ & 0xFFFFFF00) | kind;
+    }
+
+    int16_t try_index() const { return is_compressed() ? -1 : try_index_; }
+    void set_try_index(int16_t value) {
+      if (is_compressed()) {
+        ASSERT(value == -1);
+        return;
+      }
+      try_index_ = value;
+    }
+
+    intptr_t token_pos() const { return token_pos_ >> 1; }
+    void set_token_pos(int32_t value, bool compressed) {
+      int32_t bit = compressed ? 0x1 : 0x0;
+      token_pos_ = (value << 1) | bit;
+    }
+
+    intptr_t deopt_id() const { return deopt_id_and_kind_ >> 8; }
+    void set_deopt_id(int32_t value) {
+      ASSERT(Utils::IsInt(24, value));
+      deopt_id_and_kind_ = (deopt_id_and_kind_ & 0xFF) | (value << 8);
+    }
+
+    void CopyTo(PcDescriptorRec* other) const {
+      other->set_pc(pc());
+      other->set_deopt_id(deopt_id());
+      other->set_kind(kind());
+      other->set_token_pos(token_pos(), false);
+      other->set_try_index(try_index());
+    }
+
+   private:
+    bool is_compressed() const {
+      return (token_pos_ & 0x1) == 1;
+    }
+
+    uword pc_;
+    int32_t deopt_id_and_kind_;  // Bits 31..8 -> deopt_id, bits 7..0 kind.
+    int32_t token_pos_;  // Bits 31..1 -> token_pos, bit 1 -> compressed flag;
+    int16_t try_index_;
   };
 
+  static intptr_t RecordSize(bool has_try_index);
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors);
 
+  static const intptr_t kFullRecSize;
+  static const intptr_t kCompressedRecSize;
+
+  intptr_t record_size_in_bytes_;
   intptr_t length_;  // Number of descriptors.
 
   // Variable length data follows here.
-  PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); }
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, intptr_t); }
 
   friend class Object;
 };
@@ -1780,7 +1837,8 @@
           (index == kGrowableObjectArrayCid) ||
           IsTypedDataClassId(index) ||
           IsTypedDataViewClassId(index) ||
-          IsExternalTypedDataClassId(index));
+          IsExternalTypedDataClassId(index) ||
+          (index == kByteBufferCid));
 }
 
 
@@ -1857,7 +1915,7 @@
        kExternalTypedDataInt8ArrayCid + 12) &&
       (kExternalTypedDataFloat64x2ArrayCid ==
        kExternalTypedDataInt8ArrayCid + 13) &&
-      (kNullCid == kExternalTypedDataInt8ArrayCid + 14));
+      (kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14));
   return (index >= kExternalTypedDataInt8ArrayCid &&
           index <= kExternalTypedDataFloat64x2ArrayCid);
 }
@@ -1865,11 +1923,10 @@
 
 inline bool RawObject::IsInternalVMdefinedClassId(intptr_t index) {
   return ((index < kNumPredefinedCids) &&
-          !RawObject::IsTypedDataViewClassId(index));
+          !RawObject::IsImplicitFieldClassId(index));
 }
 
 
-
 inline bool RawObject::IsVariableSizeClassId(intptr_t index) {
   return (index == kArrayCid) ||
          (index == kImmutableArrayCid) ||
@@ -1892,12 +1949,21 @@
 }
 
 
+// This is a set of classes that are not Dart classes whose representation
+// is defined by the VM but are used in the VM code by computing the
+// implicit field offsets of the various fields in the dart object.
+inline bool RawObject::IsImplicitFieldClassId(intptr_t index) {
+  return (IsTypedDataViewClassId(index) || index == kByteBufferCid);
+}
+
+
 inline intptr_t RawObject::NumberOfTypedDataClasses() {
   // Make sure this is updated when new TypedData types are added.
   COMPILE_ASSERT(kTypedDataInt8ArrayViewCid == kTypedDataInt8ArrayCid + 14);
   COMPILE_ASSERT(kExternalTypedDataInt8ArrayCid ==
                  kTypedDataInt8ArrayViewCid + 15);
-  COMPILE_ASSERT(kNullCid == kExternalTypedDataInt8ArrayCid + 14);
+  COMPILE_ASSERT(kByteBufferCid == kExternalTypedDataInt8ArrayCid + 14);
+  COMPILE_ASSERT(kNullCid == kByteBufferCid + 1);
   return (kNullCid - kTypedDataInt8ArrayCid);
 }
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 16fbe84..f311d34 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1559,15 +1559,36 @@
                                                     intptr_t object_id,
                                                     intptr_t tags,
                                                     Snapshot::Kind kind) {
-  UNREACHABLE();
-  return UnhandledException::null();
+  UnhandledException& result = UnhandledException::ZoneHandle(
+      reader->isolate(), NEW_OBJECT(UnhandledException));
+  reader->AddBackRef(object_id, &result, kIsDeserialized);
+
+  // Set the object tags.
+  result.set_tags(tags);
+
+  // Set all the object fields.
+  // TODO(5411462): Need to assert No GC can happen here, even though
+  // allocations may happen.
+  intptr_t num_flds = (result.raw()->to() - result.raw()->from());
+  for (intptr_t i = 0; i <= num_flds; i++) {
+    *(result.raw()->from() + i) = reader->ReadObjectRef();
+  }
+  return result.raw();
 }
 
 
 void RawUnhandledException::WriteTo(SnapshotWriter* writer,
                                     intptr_t object_id,
                                     Snapshot::Kind kind) {
-  UNREACHABLE();
+  // Write out the serialization header value for this object.
+  writer->WriteInlinedObjectHeader(object_id);
+
+  // Write out the class and tags information.
+  writer->WriteVMIsolateObject(kUnhandledExceptionCid);
+  writer->WriteTags(writer->GetObjectTags(this));
+  // Write out all the object pointer fields.
+  SnapshotWriterVisitor visitor(writer);
+  visitor.VisitPointers(from(), to());
 }
 
 
diff --git a/runtime/vm/report_test.cc b/runtime/vm/report_test.cc
index ba66a9a..88b6839 100644
--- a/runtime/vm/report_test.cc
+++ b/runtime/vm/report_test.cc
@@ -30,7 +30,8 @@
       // Skip time.
       EXPECT_SUBSTRING("\"message\":{\"type\":\"JSCompatibilityWarning\","
                        "\"script\":{\"type\":\"@Script\",\"id\":"
-                       "\"scripts\\/Plug\",\"name\":\"Plug\",\"user_name\":"
+                       "\"libraries\\/-1\\/scripts\\/Plug\","
+                       "\"name\":\"Plug\",\"user_name\":"
                        "\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
                        "\"message\":{\"type\":\"@String\"",
                        js.ToCString());
@@ -46,7 +47,8 @@
   }
   EXPECT_EQ(2, trace_buffer->Length());
   EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
-                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
+                   "\"name\":\"Plug\","
                    "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
                    "\"message\":{\"type\":\"@String\"",
                    trace_buffer->At(0)->message);
@@ -55,7 +57,8 @@
                    trace_buffer->At(0)->message);
 
   EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
-                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"@Script\",\"id\":\"libraries\\/-1\\/scripts\\/Plug\","
+                   "\"name\":\"Plug\","
                    "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":1,"
                    "\"message\":{\"type\":\"@String\"",
                    trace_buffer->At(1)->message);
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 1dbd019..de52089 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -20,7 +20,7 @@
 // function. Input for the stub is as follows:
 //   SP : points to the arguments and return value array.
 //   R5 : address of the runtime function to call.
-//   R4 : number of arguments to the call as Smi.
+//   R4 : number of arguments to the call.
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
@@ -48,7 +48,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ LoadImmediate(R5, entry);
-    __ LoadImmediate(R4, Smi::RawValue(argument_count));
+    __ LoadImmediate(R4, argument_count);
     __ BranchLink(&StubCode::CallToRuntimeLabel());
   }
 }
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 23e00c6..6ce93de 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -19,7 +19,7 @@
 // function. Input for the stub is as follows:
 //   SP : points to the arguments and return value array.
 //   R5 : address of the runtime function to call.
-//   R4 : number of arguments to the call as Smi.
+//   R4 : number of arguments to the call.
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
@@ -56,7 +56,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ LoadImmediate(R5, entry, kNoPP);
-    __ LoadImmediate(R4, Smi::RawValue(argument_count), kNoPP);
+    __ LoadImmediate(R4, argument_count, kNoPP);
     __ BranchLink(&StubCode::CallToRuntimeLabel(), PP);
   }
 }
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 160bf3c..ecd2393 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -32,7 +32,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ movl(ECX, Immediate(GetEntryPoint()));
-    __ movl(EDX, Immediate(Smi::RawValue(argument_count)));
+    __ movl(EDX, Immediate(argument_count));
     __ call(&StubCode::CallToRuntimeLabel());
   }
 }
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
index b57112a..ca4a529 100644
--- a/runtime/vm/runtime_entry_mips.cc
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -20,7 +20,7 @@
 // function. Input for the stub is as follows:
 //   SP : points to the arguments and return value array.
 //   S5 : address of the runtime function to call.
-//   S4 : number of arguments to the call as Smi.
+//   S4 : number of arguments to the call.
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
@@ -48,7 +48,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ LoadImmediate(S5, entry);
-    __ LoadImmediate(S4, Smi::RawValue(argument_count));
+    __ LoadImmediate(S4, argument_count);
     __ BranchLink(&StubCode::CallToRuntimeLabel());
   }
 }
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index ccd0d6f..8688684 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -19,7 +19,7 @@
 // function. Input for the stub is as follows:
 //   RSP : points to the arguments and return value array.
 //   RBX : address of the runtime function to call.
-//   R10 : number of arguments to the call as Smi.
+//   R10 : number of arguments to the call.
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
@@ -29,7 +29,7 @@
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
     __ movq(RBX, Immediate(GetEntryPoint()));
-    __ movq(R10, Immediate(Smi::RawValue(argument_count)));
+    __ movq(R10, Immediate(argument_count));
     __ Call(&StubCode::CallToRuntimeLabel(), PP);
   }
 }
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 0928897..87ce4bc 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -155,7 +155,7 @@
  public:
   explicit LibraryCoverageFilter(const Library& lib) : lib_(lib) {}
   bool ShouldOutputCoverageFor(const Library& lib,
-                               const String& script_url,
+                               const Script& script,
                                const Class& cls,
                                const Function& func) const {
     return lib.raw() == lib_.raw();
@@ -167,16 +167,16 @@
 
 class ScriptCoverageFilter : public CoverageFilter {
  public:
-  explicit ScriptCoverageFilter(const String& script_url)
-      : script_url_(script_url) {}
+  explicit ScriptCoverageFilter(const Script& script)
+      : script_(script) {}
   bool ShouldOutputCoverageFor(const Library& lib,
-                               const String& script_url,
+                               const Script& script,
                                const Class& cls,
                                const Function& func) const {
-    return script_url_.Equals(script_url);
+    return script.raw() == script_.raw();
   }
  private:
-  const String& script_url_;
+  const Script& script_;
 };
 
 
@@ -184,7 +184,7 @@
  public:
   explicit ClassCoverageFilter(const Class& cls) : cls_(cls) {}
   bool ShouldOutputCoverageFor(const Library& lib,
-                               const String& script_url,
+                               const Script& script,
                                const Class& cls,
                                const Function& func) const {
     return cls.raw() == cls_.raw();
@@ -194,6 +194,20 @@
 };
 
 
+class FunctionCoverageFilter : public CoverageFilter {
+ public:
+  explicit FunctionCoverageFilter(const Function& func) : func_(func) {}
+  bool ShouldOutputCoverageFor(const Library& lib,
+                               const Script& script,
+                               const Class& cls,
+                               const Function& func) const {
+    return func.raw() == func_.raw();
+  }
+ private:
+  const Function& func_;
+};
+
+
 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
   void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
   return reinterpret_cast<uint8_t*>(new_ptr);
@@ -288,7 +302,7 @@
 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
 Isolate* Service::service_isolate_ = NULL;
-Dart_LibraryTagHandler Service::default_handler_ = NULL;
+Dart_LibraryTagHandler Service::embedder_provided_handler_ = NULL;
 Dart_Port Service::port_ = ILLEGAL_PORT;
 uint32_t Service::event_mask_ = 0;
 
@@ -403,8 +417,7 @@
     // Isolate is empty.
     ASSERT(library.IsNull());
     // Grab embedder tag handler.
-    default_handler_ = isolate->library_tag_handler();
-    ASSERT(default_handler_ != NULL);
+    embedder_provided_handler_ = isolate->library_tag_handler();
     // Temporarily install our own.
     isolate->set_library_tag_handler(LibraryTagHandler);
     // Get script resource.
@@ -432,8 +445,8 @@
     Dart_ExitScope();
     library.SetLoaded();
     // Install embedder default library tag handler again.
-    isolate->set_library_tag_handler(default_handler_);
-    default_handler_ = NULL;
+    isolate->set_library_tag_handler(embedder_provided_handler_);
+    embedder_provided_handler_ = NULL;
     library.set_native_entry_resolver(VmServiceNativeResolver);
   }
   {
@@ -556,8 +569,11 @@
   }
   if (tag == Dart_kImportTag) {
     // Embedder handles all requests for external libraries.
-    ASSERT(default_handler_ != NULL);
-    return default_handler_(tag, library, url);
+    if (embedder_provided_handler_ == NULL) {
+      return Dart_NewApiError("Unable to import module as no library tag "
+                              "handler has been provided by embedder");
+    }
+    return embedder_provided_handler_(tag, library, url);
   }
   ASSERT((tag == Dart_kSourceTag) || (tag == Dart_kCanonicalizeUrl));
   if (tag == Dart_kCanonicalizeUrl) {
@@ -1111,10 +1127,18 @@
 }
 
 
+static bool HandleClassesFunctionsCoverage(
+    Isolate* isolate, const Function& func, JSONStream* js) {
+  FunctionCoverageFilter filter(func);
+  CodeCoverage::PrintJSON(isolate, js, &filter);
+  return true;
+}
+
+
 static bool HandleClassesFunctions(Isolate* isolate, const Class& cls,
                                    JSONStream* js) {
   intptr_t id;
-  if (js->num_arguments() > 4) {
+  if (js->num_arguments() > 5) {
     PrintError(js, "Command too long");
     return true;
   }
@@ -1128,7 +1152,19 @@
     PrintError(js, "Function %" Pd " not found", id);
     return true;
   }
-  func.PrintJSON(js, false);
+  if (js->num_arguments() == 4) {
+    func.PrintJSON(js, false);
+    return true;
+  } else {
+    const char* subcollection = js->GetArgument(4);
+    if (strcmp(subcollection, "coverage") == 0) {
+      return HandleClassesFunctionsCoverage(isolate, func, js);
+    } else {
+      PrintError(js, "Invalid sub collection %s", subcollection);
+      return true;
+    }
+  }
+  UNREACHABLE();
   return true;
 }
 
@@ -1374,6 +1410,62 @@
 }
 
 
+static bool HandleLibrariesScriptsCoverage(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  ScriptCoverageFilter sf(script);
+  CodeCoverage::PrintJSON(isolate, js, &sf);
+  return true;
+}
+
+
+static bool HandleLibrariesScripts(Isolate* isolate,
+                                   const Library& lib,
+                                   JSONStream* js) {
+  if (js->num_arguments() > 5) {
+    PrintError(js, "Command too long");
+    return true;
+  } else if (js->num_arguments() < 4) {
+    PrintError(js, "Must specify collection object id: scripts/id");
+    return true;
+  }
+  const String& id = String::Handle(String::New(js->GetArgument(3)));
+  ASSERT(!id.IsNull());
+  // The id is the url of the script % encoded, decode it.
+  const String& requested_url = String::Handle(String::DecodeURI(id));
+  Script& script = Script::Handle();
+  String& script_url = String::Handle();
+  const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+  ASSERT(!loaded_scripts.IsNull());
+  intptr_t i;
+  for (i = 0; i < loaded_scripts.Length(); i++) {
+    script ^= loaded_scripts.At(i);
+    ASSERT(!script.IsNull());
+    script_url ^= script.url();
+    if (script_url.Equals(requested_url)) {
+      break;
+    }
+  }
+  if (i == loaded_scripts.Length()) {
+    PrintError(js, "Script %s not found", requested_url.ToCString());
+    return true;
+  }
+  if (js->num_arguments() == 4) {
+    script.PrintJSON(js, false);
+    return true;
+  } else {
+    const char* subcollection = js->GetArgument(4);
+    if (strcmp(subcollection, "coverage") == 0) {
+      return HandleLibrariesScriptsCoverage(isolate, script, js);
+    } else {
+      PrintError(js, "Invalid sub collection %s", subcollection);
+      return true;
+    }
+  }
+  UNREACHABLE();
+  return true;
+}
+
+
 static bool HandleLibrariesCoverage(Isolate* isolate,
                                     const Library& lib,
                                     JSONStream* js) {
@@ -1402,6 +1494,8 @@
     const char* second = js->GetArgument(2);
     if (strcmp(second, "eval") == 0) {
       return HandleLibrariesEval(isolate, lib, js);
+    } else if (strcmp(second, "scripts") == 0) {
+      return HandleLibrariesScripts(isolate, lib, js);
     } else if (strcmp(second, "coverage") == 0) {
       return HandleLibrariesCoverage(isolate, lib, js);
     } else {
@@ -1575,72 +1669,13 @@
 }
 
 
-static bool HandleScriptsFetch(
-    Isolate* isolate, const Script& script, JSONStream* js) {
-  script.PrintJSON(js, false);
-  return true;
-}
-
-
-static bool HandleScriptsCoverage(
-    Isolate* isolate, const String& script_url, JSONStream* js) {
-  ScriptCoverageFilter sf(script_url);
-  CodeCoverage::PrintJSON(isolate, js, &sf);
-  return true;
-}
-
-
 static bool HandleScripts(Isolate* isolate, JSONStream* js) {
   if (js->num_arguments() == 1) {
     // Enumerate all scripts.
     return HandleScriptsEnumerate(isolate, js);
   }
-  // Subcommands of scripts require a valid script id.
-  const String& id = String::Handle(String::New(js->GetArgument(1)));
-  ASSERT(!id.IsNull());
-  // The id is the url of the script % encoded, decode it.
-  String& requested_url = String::Handle(String::DecodeURI(id));
-  Script& script = Script::Handle();
-  // There may exist more than one script object for a given url. Since they all
-  // have the same properties (source, tokens) we don't care which one we get.
-  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
-      isolate, isolate->object_store()->libraries());
-  Library& lib = Library::Handle();
-  String& script_url = String::Handle();
-  bool found = false;
-  for (intptr_t i = 0; !found && (i < libs.Length()); i++) {
-    lib ^= libs.At(i);
-    ASSERT(!lib.IsNull());
-    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
-    ASSERT(!loaded_scripts.IsNull());
-    for (intptr_t j = 0; !found && (j < loaded_scripts.Length()); j++) {
-      script ^= loaded_scripts.At(j);
-      ASSERT(!script.IsNull());
-      script_url ^= script.url();
-      if (script_url.Equals(requested_url)) {
-        found = true;
-      }
-    }
-  }
-  if (!found) {
-    PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
-                       requested_url.ToCString());
-    return true;
-  }
-  if (js->num_arguments() == 2) {
-    // If no subcommand is given, just fetch the script.
-    return HandleScriptsFetch(isolate, script, js);
-  } else if (js->num_arguments() == 3) {
-    const char* arg = js->GetArgument(2);
-    if (strcmp(arg, "coverage") == 0) {
-      return HandleScriptsCoverage(isolate, requested_url, js);
-    }
-    PrintError(js, "Unrecognized subcommand '%s'", arg);
-    return true;
-  } else {
-    PrintError(js, "Command too long");
-    return true;
-  }
+  PrintError(js, "Command too long");
+  return true;
 }
 
 
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index ebfa89e..12554de 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -77,7 +77,7 @@
   static EmbedderServiceHandler* root_service_handler_head_;
 
   static Isolate* service_isolate_;
-  static Dart_LibraryTagHandler default_handler_;
+  static Dart_LibraryTagHandler embedder_provided_handler_;
   static Dart_Port port_;
   static uint32_t event_mask_;
 };
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index e2fec2a..385c057 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -924,16 +924,28 @@
     "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
-  // Invalid function request.
+  // Invalid function command.
   service_msg = EvalF(h_lib,
-                      "[0, port, ['classes', '%" Pd "', 'functions', '9',"
-                      "'x'], [], []]", cid);
+                      "[0, port, ['classes', '%" Pd "', 'functions', '0',"
+                      "'x', 'y'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
   ExpectSubstringF(handler.msg(),
     "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\","
     "\"request\":"
-    "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"],"
+    "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\",\"y\"],"
+    "\"option_keys\":[],\"option_values\":[]}}", cid);
+
+  // Invalid function subcommand with valid function id.
+  service_msg = EvalF(h_lib,
+                      "[0, port, ['classes', '%" Pd "', 'functions', '0',"
+                      "'x'], [], []]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(),
+    "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection x\","
+    "\"request\":"
+    "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\"],"
     "\"option_keys\":[],\"option_values\":[]}}", cid);
 
   // Retained size of all instances of class B.
@@ -1288,6 +1300,9 @@
   Isolate* isolate = Isolate::Current();
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
 
   // Build a mock message handler and wrap it in a dart port.
   ServiceTestMessageHandler handler;
@@ -1297,16 +1312,26 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(h_lib, "[0, port, ['scripts', 'test-lib'], [], []]");
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+      "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib'], [], []]",
+      lib.index());
+
+  service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ(
-      "{\"type\":\"Script\",\"id\":\"scripts\\/test-lib\","
-       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-       "\"kind\":\"script\","
-       "\"source\":\"var port;\\n\\nmain() {\\n}\","
-       "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
-      handler.msg());
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"type\":\"Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\","
+      "\"owning_library\":{\"type\":\"@Library\","
+      "\"id\":\"libraries\\/%" Pd "\",\"user_name\":\"\",\"name\":\"\","
+      "\"url\":\"test-lib\"},"
+      "\"source\":\"var port;\\n\\nmain() {\\n}\","
+      "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
+      lib.index(), lib.index());
+  EXPECT_STREQ(buf, handler.msg());
 }
 
 
@@ -1343,16 +1368,30 @@
   service_msg = Eval(h_lib, "[0, port, ['coverage'], [], []]");
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_SUBSTRING(
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+
+  // Look up the service id for the library containg the test-lib script.
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  intptr_t i;
+  for (i = 0; i < libs.Length(); i++) {
+    if (libs.At(i) == lib.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != libs.Length());
+
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
       "\"kind\":\"script\"},\"hits\":"
-      "[5,1,6,1]}", handler.msg());
+      "[5,1,6,1]}", i);
+  EXPECT_SUBSTRING(buf, handler.msg());
 }
 
 
-TEST_CASE(Service_ScriptsCoverage) {
+TEST_CASE(Service_LibrariesScriptsCoverage) {
   const char* kScript =
       "var port;\n"  // Set to our mock port by C++.
       "\n"
@@ -1379,16 +1418,22 @@
   EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
 
   Array& service_msg = Array::Handle();
-  service_msg = Eval(
-      h_lib, "[0, port, ['scripts', 'test-lib', 'coverage'], [], []]");
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+      "[0, port, ['libraries', '%" Pd  "', 'scripts', 'test-lib', 'coverage'], "
+      "[], []]",
+      lib.index());
+
+  service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ(
+  OS::SNPrint(buf, sizeof(buf),
       "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index());
+  EXPECT_STREQ(buf, handler.msg());
 }
 
 
@@ -1436,12 +1481,13 @@
   service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ(
+  OS::SNPrint(buf, sizeof(buf),
       "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index());
+  EXPECT_STREQ(buf, handler.msg());
 }
 
 
@@ -1498,12 +1544,87 @@
   service_msg = Eval(h_lib, buf);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-  EXPECT_STREQ(
+  OS::SNPrint(buf, sizeof(buf),
       "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
-      "{\"source\":\"test-lib\",\"script\":{"
-      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
       "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
-      "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", handler.msg());
+      "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", lib.index());
+  EXPECT_STREQ(buf, handler.msg());
+}
+
+
+TEST_CASE(Service_ClassesFunctionsCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class Foo {\n"
+      "  var x;\n"
+      "  Foo(this.x);\n"
+      "  bar() {\n"
+      "    x = x * x;\n"
+      "    x = x / 13;\n"
+      "  }\n"
+      "  badum(var a) => 4 + a;\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "  foo.bar();\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  // Look up the service id of Foo.
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(String::New("Foo"))));
+  ASSERT(!cls.IsNull());
+  ClassTable* table = isolate->class_table();
+  intptr_t i;
+  for (i = 1; i < table->NumCids(); i++) {
+    if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != table->NumCids());
+
+  // Look up the service if of the function Foo.bar.
+  const Function& func = Function::Handle(
+      cls.LookupFunction(String::Handle(String::New("bar"))));
+  ASSERT(!func.IsNull());
+  intptr_t function_id = -1;
+  function_id = cls.FindFunctionIndex(func);
+  ASSERT(function_id != -1);
+
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+              "[0, port, ['classes', '%" Pd "', 'functions',"
+              "'% " Pd "', 'coverage'], [], []]", i,  function_id);
+
+  Array& service_msg = Array::Handle();
+  service_msg = Eval(h_lib, buf);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  OS::SNPrint(buf, sizeof(buf),
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
+      "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", lib.index());
+  EXPECT_STREQ(buf, handler.msg());
 }
 
 #endif
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 14f9694..f0e3af3 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -271,11 +271,12 @@
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.pc == pc) {
-      return rec.token_pos;
-    } else if ((token_pos <= 0) && (rec.pc > pc)) {
-      token_pos = rec.token_pos;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if (rec.pc() == pc) {
+      return rec.token_pos();
+    } else if ((token_pos <= 0) && (rec.pc() > pc)) {
+      token_pos = rec.token_pos();
     }
   }
   return token_pos;
@@ -3691,7 +3692,8 @@
                         uword sp,
                         uword fp,
                         RawObject* raw_exception,
-                        RawObject* raw_stacktrace) {
+                        RawObject* raw_stacktrace,
+                        Isolate* isolate) {
   // Walk over all setjmp buffers (simulated --> C++ transitions)
   // and try to find the setjmp associated with the simulated stack pointer.
   SimulatorSetjmpBuffer* buf = last_setjmp_buffer();
@@ -3704,7 +3706,6 @@
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous C++ frames.
   uword native_sp = buf->native_sp();
-  Isolate* isolate = Isolate::Current();
   while (isolate->top_resource() != NULL &&
          (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) {
     isolate->top_resource()->~StackResource();
@@ -3714,6 +3715,10 @@
   set_register(PC, static_cast<int32_t>(pc));
   set_register(SP, static_cast<int32_t>(sp));
   set_register(FP, static_cast<int32_t>(fp));
+  // Set the tag.
+  isolate->set_vm_tag(VMTag::kScriptTagId);
+  // Clear top exit frame.
+  isolate->set_top_exit_frame_info(0);
 
   ASSERT(raw_exception != Object::null());
   set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 4d9b079..9841d0f 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -111,7 +111,8 @@
                uword sp,
                uword fp,
                RawObject* raw_exception,
-               RawObject* raw_stacktrace);
+               RawObject* raw_stacktrace,
+               Isolate* isolate);
 
  private:
   // Known bad pc value to ensure that the simulator does not execute
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 39af0e7..f9339c5 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -3025,7 +3025,8 @@
                         uword sp,
                         uword fp,
                         RawObject* raw_exception,
-                        RawObject* raw_stacktrace) {
+                        RawObject* raw_stacktrace,
+                        Isolate* isolate) {
   // Walk over all setjmp buffers (simulated --> C++ transitions)
   // and try to find the setjmp associated with the simulated stack pointer.
   SimulatorSetjmpBuffer* buf = last_setjmp_buffer();
@@ -3038,7 +3039,6 @@
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous C++ frames.
   uword native_sp = buf->native_sp();
-  Isolate* isolate = Isolate::Current();
   while (isolate->top_resource() != NULL &&
          (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) {
     isolate->top_resource()->~StackResource();
@@ -3048,6 +3048,10 @@
   set_pc(static_cast<int64_t>(pc));
   set_register(NULL, SP, static_cast<int64_t>(sp));
   set_register(NULL, FP, static_cast<int64_t>(fp));
+  // Set the tag.
+  isolate->set_vm_tag(VMTag::kScriptTagId);
+  // Clear top exit frame.
+  isolate->set_top_exit_frame_info(0);
 
   ASSERT(raw_exception != Object::null());
   set_register(NULL, kExceptionObjectReg, bit_cast<int64_t>(raw_exception));
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index 2d3f714..bdca6a0 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -107,7 +107,8 @@
                uword sp,
                uword fp,
                RawObject* raw_exception,
-               RawObject* raw_stacktrace);
+               RawObject* raw_stacktrace,
+               Isolate* isolate);
 
  private:
   // Known bad pc value to ensure that the simulator does not execute
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 8f55a26..b0f7d5f 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -2216,7 +2216,8 @@
                         uword sp,
                         uword fp,
                         RawObject* raw_exception,
-                        RawObject* raw_stacktrace) {
+                        RawObject* raw_stacktrace,
+                        Isolate* isolate) {
   // Walk over all setjmp buffers (simulated --> C++ transitions)
   // and try to find the setjmp associated with the simulated stack pointer.
   SimulatorSetjmpBuffer* buf = last_setjmp_buffer();
@@ -2229,7 +2230,6 @@
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous C++ frames.
   uword native_sp = buf->native_sp();
-  Isolate* isolate = Isolate::Current();
   while (isolate->top_resource() != NULL &&
          (reinterpret_cast<uword>(isolate->top_resource()) < native_sp)) {
     isolate->top_resource()->~StackResource();
@@ -2239,6 +2239,10 @@
   set_pc(static_cast<int32_t>(pc));
   set_register(SP, static_cast<int32_t>(sp));
   set_register(FP, static_cast<int32_t>(fp));
+  // Set the tag.
+  isolate->set_vm_tag(VMTag::kScriptTagId);
+  // Clear top exit frame.
+  isolate->set_top_exit_frame_info(0);
 
   ASSERT(raw_exception != Object::null());
   set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h
index 8b37b97..45f45d8 100644
--- a/runtime/vm/simulator_mips.h
+++ b/runtime/vm/simulator_mips.h
@@ -126,7 +126,8 @@
                uword sp,
                uword fp,
                RawObject* raw_exception,
-               RawObject* raw_stacktrace);
+               RawObject* raw_stacktrace,
+               Isolate* isolate);
 
  private:
   // A pc value used to signal the simulator to stop execution.  Generally
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 044b47e..c070c31 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -47,6 +47,17 @@
 }
 
 
+static bool IsSplitClassId(intptr_t class_id) {
+  // Return whether this class is serialized in two steps: first a reference,
+  // with sufficient information to allocate a correctly sized object, and then
+  // later inline with complete contents.
+  return class_id >= kNumPredefinedCids ||
+         class_id == kArrayCid ||
+         class_id == kImmutableArrayCid ||
+         RawObject::IsImplicitFieldClassId(class_id);
+}
+
+
 static intptr_t ClassIdFromObjectId(intptr_t object_id) {
   ASSERT(object_id > kClassIdsOffset);
   intptr_t class_id = (object_id - kClassIdsOffset);
@@ -56,7 +67,7 @@
 
 static intptr_t ObjectIdFromClassId(intptr_t class_id) {
   ASSERT((class_id > kIllegalCid) && (class_id < kNumPredefinedCids));
-  ASSERT(!RawObject::IsTypedDataViewClassId(class_id));
+  ASSERT(!(RawObject::IsImplicitFieldClassId(class_id)));
   return (class_id + kClassIdsOffset);
 }
 
@@ -167,8 +178,6 @@
 
 
 RawObject* SnapshotReader::ReadObject() {
-  const Instance& null_object = Instance::Handle();
-  *ErrorHandle() = UnhandledException::New(null_object, null_object);
   // Setup for long jump in case there is an exception while reading.
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
@@ -221,6 +230,11 @@
 }
 
 
+intptr_t SnapshotReader::NextAvailableObjectId() const {
+  return backward_references_.length() + kMaxPredefinedObjectIds;
+}
+
+
 RawObject* SnapshotReader::ReadObjectImpl(intptr_t header_value) {
   ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin));
   if (IsVMIsolateObject(header_value)) {
@@ -230,7 +244,11 @@
       return ReadIndexedObject(SerializedHeaderData::decode(header_value));
     }
     ASSERT(SerializedHeaderTag::decode(header_value) == kInlined);
-    return ReadInlinedObject(SerializedHeaderData::decode(header_value));
+    intptr_t object_id = SerializedHeaderData::decode(header_value);
+    if (object_id == kOmittedObjectId) {
+      object_id = NextAvailableObjectId();
+    }
+    return ReadInlinedObject(object_id);
   }
 }
 
@@ -248,6 +266,9 @@
   }
   ASSERT(SerializedHeaderTag::decode(header_value) == kInlined);
   intptr_t object_id = SerializedHeaderData::decode(header_value);
+  if (object_id == kOmittedObjectId) {
+    object_id = NextAvailableObjectId();
+  }
   ASSERT(GetBackRef(object_id) == NULL);
 
   // Read the class header information and lookup the class.
@@ -676,6 +697,11 @@
 }
 
 
+RawUnhandledException* SnapshotReader::NewUnhandledException() {
+  ALLOC_NEW_OBJECT(UnhandledException, Object::unhandled_exception_class());
+}
+
+
 RawObject* SnapshotReader::NewInteger(int64_t value) {
   ASSERT((value & kSmiTagMask) == kSmiTag);
   value = value >> kSmiTagShift;
@@ -724,10 +750,9 @@
     // into dart code or allocating any code.
     // We do a longjmp at this point to unwind out of the entire
     // read part and return the error object back.
-    const Instance& exception =
-        Instance::Handle(object_store()->out_of_memory());
-    ErrorHandle()->set_exception(exception);
-    Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle());
+    const UnhandledException& error = UnhandledException::Handle(
+        object_store()->preallocated_unhandled_exception());
+    Isolate::Current()->long_jump_base()->Jump(1, error);
   }
 #if defined(DEBUG)
   // Zap the uninitialized memory area.
@@ -942,7 +967,7 @@
       kind_(kind),
       object_store_(Isolate::Current()->object_store()),
       class_table_(Isolate::Current()->class_table()),
-      forward_list_(),
+      forward_list_(kMaxPredefinedObjectIds),
       exception_type_(Exceptions::kNone),
       exception_msg_(NULL) {
 }
@@ -1047,12 +1072,12 @@
     // it so that future references to this object in the snapshot will use
     // this object id. Mark it as not having been serialized yet so that we
     // will serialize the object when we go through the forward list.
-    intptr_t object_id = MarkObject(raw, kIsNotSerialized);
+    forward_list_.MarkAndAddObject(raw, kIsNotSerialized);
 
     RawArray* rawarray = reinterpret_cast<RawArray*>(raw);
 
     // Write out the serialization header value for this object.
-    WriteInlinedObjectHeader(object_id);
+    WriteInlinedObjectHeader(kOmittedObjectId);
 
     // Write out the class information.
     WriteIndexedObject(kArrayCid);
@@ -1067,12 +1092,12 @@
     // it so that future references to this object in the snapshot will use
     // this object id. Mark it as not having been serialized yet so that we
     // will serialize the object when we go through the forward list.
-    intptr_t object_id = MarkObject(raw, kIsNotSerialized);
+    forward_list_.MarkAndAddObject(raw, kIsNotSerialized);
 
     RawArray* rawarray = reinterpret_cast<RawArray*>(raw);
 
     // Write out the serialization header value for this object.
-    WriteInlinedObjectHeader(object_id);
+    WriteInlinedObjectHeader(kOmittedObjectId);
 
     // Write out the class information.
     WriteIndexedObject(kImmutableArrayCid);
@@ -1082,7 +1107,7 @@
 
     return;
   }
-  if (RawObject::IsTypedDataViewClassId(class_id)) {
+  if (RawObject::IsImplicitFieldClassId(class_id)) {
     WriteInstanceRef(raw, cls);
     return;
   }
@@ -1090,12 +1115,12 @@
   // it so that future references to this object in the snapshot will use
   // this object id. Mark it as not having been serialized yet so that we
   // will serialize the object when we go through the forward list.
-  intptr_t object_id = MarkObject(raw, kIsSerialized);
+  forward_list_.MarkAndAddObject(raw, kIsSerialized);
   switch (class_id) {
 #define SNAPSHOT_WRITE(clazz)                                                  \
     case clazz::kClassId: {                                                    \
       Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(raw);                \
-      raw_obj->WriteTo(this, object_id, kind_);                                \
+      raw_obj->WriteTo(this, kOmittedObjectId, kind_);                         \
       return;                                                                  \
     }                                                                          \
 
@@ -1106,7 +1131,7 @@
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
       RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(raw);
-      raw_obj->WriteTo(this, object_id, kind_);
+      raw_obj->WriteTo(this, kOmittedObjectId, kind_);
       return;
     }
 #undef SNAPSHOT_WRITE
@@ -1116,7 +1141,7 @@
     CLASS_LIST_TYPED_DATA(SNAPSHOT_WRITE) {
       RawExternalTypedData* raw_obj =
         reinterpret_cast<RawExternalTypedData*>(raw);
-      raw_obj->WriteTo(this, object_id, kind_);
+      raw_obj->WriteTo(this, kOmittedObjectId, kind_);
       return;
     }
 #undef SNAPSHOT_WRITE
@@ -1168,16 +1193,16 @@
   uword tags = raw->ptr()->tags_;
   if (SerializedHeaderTag::decode(tags) == kObjectId) {
     intptr_t id = SerializedHeaderData::decode(tags);
-    return forward_list_[id - kMaxPredefinedObjectIds]->tags();
+    return forward_list_.NodeForObjectId(id)->tags();
   } else {
     return tags;
   }
 }
 
 
-intptr_t SnapshotWriter::MarkObject(RawObject* raw, SerializeState state) {
+intptr_t ForwardList::MarkAndAddObject(RawObject* raw, SerializeState state) {
   NoGCScope no_gc;
-  intptr_t object_id = forward_list_.length() + kMaxPredefinedObjectIds;
+  intptr_t object_id = next_object_id();
   ASSERT(object_id <= kMaxObjectId);
   uword value = 0;
   value = SerializedHeaderTag::update(kObjectId, value);
@@ -1185,18 +1210,19 @@
   uword tags = raw->ptr()->tags_;
   ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
   raw->ptr()->tags_ = value;
-  ForwardObjectNode* node = new ForwardObjectNode(raw, tags, state);
+  Node* node = new Node(raw, tags, state);
   ASSERT(node != NULL);
-  forward_list_.Add(node);
+  nodes_.Add(node);
   return object_id;
 }
 
 
-void SnapshotWriter::UnmarkAll() {
+void ForwardList::UnmarkAll() const {
   NoGCScope no_gc;
-  for (intptr_t i = 0; i < forward_list_.length(); i++) {
-    RawObject* raw = forward_list_[i]->raw();
-    raw->ptr()->tags_ = forward_list_[i]->tags();  // Restore original tags.
+  for (intptr_t id = first_object_id(); id < next_object_id(); ++id) {
+    const Node* node = NodeForObjectId(id);
+    RawObject* raw = node->raw();
+    raw->ptr()->tags_ = node->tags();  // Restore original tags.
   }
 }
 
@@ -1297,7 +1323,7 @@
   // Object is being serialized, add it to the forward ref list and mark
   // it so that future references to this object in the snapshot will use
   // an object id, instead of trying to serialize it again.
-  MarkObject(raw, kIsSerialized);
+  forward_list_.MarkAndAddObject(raw, kIsSerialized);
 
   WriteInlinedObject(raw);
 }
@@ -1313,10 +1339,14 @@
   uword tags = raw->ptr()->tags_;
   ASSERT(SerializedHeaderTag::decode(tags) == kObjectId);
   intptr_t object_id = SerializedHeaderData::decode(tags);
-  tags = forward_list_[object_id - kMaxPredefinedObjectIds]->tags();
+  tags = forward_list_.NodeForObjectId(object_id)->tags();
   RawClass* cls = class_table_->At(RawObject::ClassIdTag::decode(tags));
   intptr_t class_id = cls->ptr()->id_;
 
+  if (!IsSplitClassId(class_id)) {
+    object_id = kOmittedObjectId;
+  }
+
   if (class_id >= kNumPredefinedCids) {
     WriteInstance(object_id, raw, cls, tags);
     return;
@@ -1365,22 +1395,50 @@
 }
 
 
+class WriteInlinedObjectVisitor : public ObjectVisitor {
+ public:
+  explicit WriteInlinedObjectVisitor(SnapshotWriter* writer)
+      : ObjectVisitor(Isolate::Current()), writer_(writer) {}
+
+  virtual void VisitObject(RawObject* obj) {
+    writer_->WriteInlinedObject(obj);
+  }
+
+ private:
+  SnapshotWriter* writer_;
+};
+
+
 void SnapshotWriter::WriteForwardedObjects() {
+  WriteInlinedObjectVisitor visitor(this);
+  forward_list_.SerializeAll(&visitor);
+}
+
+
+void ForwardList::SerializeAll(ObjectVisitor* writer) {
   // Write out all objects that were added to the forward list and have
   // not been serialized yet. These would typically be fields of instance
   // objects, arrays or immutable arrays (this is done in order to avoid
   // deep recursive calls to WriteObjectImpl).
   // NOTE: The forward list might grow as we process the list.
-  for (intptr_t i = 0; i < forward_list_.length(); i++) {
-    if (!forward_list_[i]->is_serialized()) {
+#ifdef DEBUG
+  for (intptr_t i = first_object_id(); i < first_unprocessed_object_id_; ++i) {
+    ASSERT(NodeForObjectId(i)->is_serialized());
+  }
+#endif  // DEBUG
+  for (intptr_t id = first_unprocessed_object_id_;
+       id < next_object_id();
+       ++id) {
+    if (!NodeForObjectId(id)->is_serialized()) {
       // Write the object out in the stream.
-      RawObject* raw = forward_list_[i]->raw();
-      WriteInlinedObject(raw);
+      RawObject* raw = NodeForObjectId(id)->raw();
+      writer->VisitObject(raw);
 
       // Mark object as serialized.
-      forward_list_[i]->set_state(kIsSerialized);
+      NodeForObjectId(id)->set_state(kIsSerialized);
     }
   }
+  first_unprocessed_object_id_ = next_object_id();
 }
 
 
@@ -1501,10 +1559,10 @@
   // it so that future references to this object in the snapshot will use
   // this object id. Mark it as not having been serialized yet so that we
   // will serialize the object when we go through the forward list.
-  intptr_t object_id = MarkObject(raw, kIsNotSerialized);
+  forward_list_.MarkAndAddObject(raw, kIsNotSerialized);
 
   // Write out the serialization header value for this object.
-  WriteInlinedObjectHeader(object_id);
+  WriteInlinedObjectHeader(kOmittedObjectId);
 
   // Indicate this is an instance object.
   WriteIntptrValue(SerializedHeaderData::encode(kInstanceObjectId));
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index d6c00a7..b5f8f44 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -67,6 +67,7 @@
 class RawTypeParameter;
 class RawTypeArguments;
 class RawTwoByteString;
+class RawUnhandledException;
 class RawUnresolvedClass;
 class String;
 class TokenStream;
@@ -248,7 +249,6 @@
   Array* TokensHandle() { return &tokens_; }
   TokenStream* StreamHandle() { return &stream_; }
   ExternalTypedData* DataHandle() { return &data_; }
-  UnhandledException* ErrorHandle() { return &error_; }
 
   // Reads an object.
   RawObject* ReadObject();
@@ -299,6 +299,7 @@
   RawFloat64x2* NewFloat64x2(double v0, double v1);
   RawApiError* NewApiError();
   RawLanguageError* NewLanguageError();
+  RawUnhandledException* NewUnhandledException();
   RawObject* NewInteger(int64_t value);
   RawStacktrace* NewStacktrace();
 
@@ -345,6 +346,8 @@
 
   void ArrayReadFrom(const Array& result, intptr_t len, intptr_t tags);
 
+  intptr_t NextAvailableObjectId() const;
+
   Snapshot::Kind kind_;  // Indicates type of snapshot(full, script, message).
   Isolate* isolate_;  // Current isolate.
   Class& cls_;  // Temporary Class handle.
@@ -389,6 +392,7 @@
   friend class TypeParameter;
   friend class TypeRef;
   friend class UnresolvedClass;
+  friend class UnhandledException;
   friend class WeakProperty;
   friend class MirrorReference;
   DISALLOW_COPY_AND_ASSIGN(SnapshotReader);
@@ -487,6 +491,59 @@
 };
 
 
+class ForwardList {
+ public:
+  explicit ForwardList(intptr_t first_object_id)
+      : first_object_id_(first_object_id),
+        nodes_(),
+        first_unprocessed_object_id_(first_object_id) {}
+
+  class Node : public ZoneAllocated {
+   public:
+    Node(RawObject* raw, uword tags, SerializeState state)
+        : raw_(raw), tags_(tags), state_(state) {}
+    RawObject* raw() const { return raw_; }
+    uword tags() const { return tags_; }
+    bool is_serialized() const { return state_ == kIsSerialized; }
+
+   private:
+    // Private to ensure the invariant of first_unprocessed_object_id_.
+    void set_state(SerializeState value) { state_ = value; }
+
+    RawObject* raw_;
+    uword tags_;
+    SerializeState state_;
+
+    friend class ForwardList;
+    DISALLOW_COPY_AND_ASSIGN(Node);
+  };
+
+  Node* NodeForObjectId(intptr_t object_id) const {
+    return nodes_[object_id - first_object_id_];
+  }
+
+  // Returns the id for the added object.
+  intptr_t MarkAndAddObject(RawObject* raw, SerializeState state);
+
+  // Exhaustively processes all unserialized objects in this list. 'writer' may
+  // concurrently add more objects.
+  void SerializeAll(ObjectVisitor* writer);
+
+  // Restores the tags of all objects in this list.
+  void UnmarkAll() const;
+
+ private:
+  intptr_t first_object_id() const { return first_object_id_; }
+  intptr_t next_object_id() const { return nodes_.length() + first_object_id_; }
+
+  const intptr_t first_object_id_;
+  GrowableArray<Node*> nodes_;
+  intptr_t first_unprocessed_object_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(ForwardList);
+};
+
+
 class SnapshotWriter : public BaseWriter {
  protected:
   SnapshotWriter(Snapshot::Kind kind,
@@ -516,25 +573,9 @@
   void ThrowException(Exceptions::ExceptionType type, const char* msg);
 
  protected:
-  class ForwardObjectNode : public ZoneAllocated {
-   public:
-    ForwardObjectNode(RawObject* raw, uword tags, SerializeState state)
-        : raw_(raw), tags_(tags), state_(state) {}
-    RawObject* raw() const { return raw_; }
-    uword tags() const { return tags_; }
-    bool is_serialized() const { return state_ == kIsSerialized; }
-    void set_state(SerializeState value) { state_ = value; }
-
-   private:
-    RawObject* raw_;
-    uword tags_;
-    SerializeState state_;
-
-    DISALLOW_COPY_AND_ASSIGN(ForwardObjectNode);
-  };
-
-  intptr_t MarkObject(RawObject* raw, SerializeState state);
-  void UnmarkAll();
+  void UnmarkAll() {
+    forward_list_.UnmarkAll();
+  }
 
   bool CheckAndWritePredefinedObject(RawObject* raw);
   void HandleVMIsolateObject(RawObject* raw);
@@ -564,7 +605,7 @@
   Snapshot::Kind kind_;
   ObjectStore* object_store_;  // Object store for common classes.
   ClassTable* class_table_;  // Class table for the class index to class lookup.
-  GrowableArray<ForwardObjectNode*> forward_list_;
+  ForwardList forward_list_;
   Exceptions::ExceptionType exception_type_;  // Exception type.
   const char* exception_msg_;  // Message associated with exception.
 
@@ -576,14 +617,15 @@
   friend class RawJSRegExp;
   friend class RawLibrary;
   friend class RawLiteralToken;
+  friend class RawMirrorReference;
   friend class RawReceivePort;
   friend class RawScript;
   friend class RawStacktrace;
   friend class RawTokenStream;
   friend class RawTypeArguments;
-  friend class RawMirrorReference;
-  friend class SnapshotWriterVisitor;
   friend class RawUserTag;
+  friend class SnapshotWriterVisitor;
+  friend class WriteInlinedObjectVisitor;
   DISALLOW_COPY_AND_ASSIGN(SnapshotWriter);
 };
 
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index 3d8e03f..a7282f7 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -19,6 +19,8 @@
   kFalseValue,
   // Marker for special encoding of double objects in message snapshots.
   kDoubleObject,
+  // Object id has been optimized away; reader should use next available id.
+  kOmittedObjectId,
 
   kClassIdsOffset = kDoubleObject,
 
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index c1266e3..15086f4 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -2717,4 +2717,15 @@
   Dart_ExitScope();
 }
 
+
+TEST_CASE(OmittedObjectEncodingLength) {
+  StackZone zone(Isolate::Current());
+  uint8_t* buffer;
+  MessageWriter writer(&buffer, &zone_allocator);
+  writer.WriteInlinedObjectHeader(kOmittedObjectId);
+  // For performance, we'd like single-byte headers when ids are omitted.
+  // If this starts failing, consider renumbering the snapshot ids.
+  EXPECT_EQ(1, writer.BytesWritten());
+}
+
 }  // namespace dart
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 0ae51a5..9a44f6d 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -226,11 +226,11 @@
   descriptors = code.pc_descriptors();
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if ((rec.pc == pc()) && (rec.try_index != -1)) {
-      const intptr_t try_index = rec.try_index;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if ((rec.pc() == pc()) && (rec.try_index() != -1)) {
       RawExceptionHandlers::HandlerInfo handler_info;
-      handlers.GetHandlerInfo(try_index, &handler_info);
+      handlers.GetHandlerInfo(rec.try_index(), &handler_info);
       *handler_pc = handler_info.handler_pc;
       *needs_stacktrace = handler_info.needs_stacktrace;
       *has_catch_all = handler_info.has_catch_all;
@@ -251,9 +251,10 @@
   ASSERT(!descriptors.IsNull());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   while (iter.HasNext()) {
-    const RawPcDescriptors::PcDescriptorRec& rec = iter.Next();
-    if (rec.pc == pc()) {
-      return rec.token_pos;
+    RawPcDescriptors::PcDescriptorRec rec;
+    iter.NextRec(&rec);
+    if (rec.pc() == pc()) {
+      return rec.token_pos();
     }
   }
   return -1;
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 060fac9..30987b2e 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -103,6 +103,13 @@
 }
 
 
+bool StubCode::InJumpToExceptionHandlerStub(uword pc) {
+  uword entry = StubCode::JumpToExceptionHandlerEntryPoint();
+  uword size = StubCode::JumpToExceptionHandlerSize();
+  return (pc >= entry) && (pc < (entry + size));
+}
+
+
 RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
   Isolate* isolate = Isolate::Current();
   const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index a01faa7..7fb793b 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -29,7 +29,9 @@
   V(FixCallersTarget)                                                          \
   V(Deoptimize)                                                                \
   V(DeoptimizeLazy)                                                            \
-  V(BreakpointRuntime)                                                         \
+  V(ICCallBreakpoint)                                                          \
+  V(ClosureCallBreakpoint)                                                     \
+  V(RuntimeCallBreakpoint)                                                     \
   V(DebugStepCheck)                                                            \
   V(Subtype1TestCache)                                                         \
   V(Subtype2TestCache)                                                         \
@@ -118,6 +120,9 @@
 
   static bool InInvocationStubForIsolate(Isolate* isolate, uword pc);
 
+  // Check if the specified pc is in the jump to exception handler stub.
+  static bool InJumpToExceptionHandlerStub(uword pc);
+
   // Returns NULL if no stub found.
   static const char* NameOfStub(uword entry_point);
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 178fc91b..6db2aaf 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -46,7 +46,6 @@
   __ mov(IP, Operand(0));
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
-  __ SmiUntag(R4);
 
   // Load current Isolate pointer from Context structure into R0.
   __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
@@ -1252,25 +1251,18 @@
   }
 #endif  // DEBUG
 
+  Label stepping, done_stepping;
   if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
     __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
     __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
     __ CompareImmediate(R6, 0);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
+    __ b(&stepping, NE);
+    __ Bind(&done_stepping);
   }
 
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
-  // Preserve return address, since LR is needed for subroutine call.
-  __ mov(R8, Operand(LR));
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found;
   // R5: IC data object (preserved).
@@ -1306,7 +1298,6 @@
       __ b(&update, NE);  // Continue.
     } else {
       // Last check, all checks before matched.
-      __ mov(LR, Operand(R8), EQ);  // Restore return address if found.
       __ b(&found, EQ);  // Break.
     }
   }
@@ -1326,9 +1317,6 @@
   __ b(&loop, NE);
 
   // IC miss.
-  // Restore return address.
-  __ mov(LR, Operand(R8));
-
   // Compute address of arguments.
   // R7: argument_count - 1 (smi).
   __ add(R7, SP, Operand(R7, LSL, 1));  // R7 is Smi.
@@ -1374,6 +1362,16 @@
   __ ldr(R2, FieldAddress(R0, Function::instructions_offset()));
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ bx(R2);
+
+  if (FLAG_enable_debugger) {
+    __ Bind(&stepping);
+    __ EnterStubFrame();
+    __ Push(R5);  // Preserve IC data.
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ Pop(R5);
+    __ LeaveStubFrame();
+    __ b(&done_stepping);
+  }
 }
 
 
@@ -1531,7 +1529,23 @@
 }
 
 
-void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+// R5: Contains an ICData.
+void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+  // Preserve arguments descriptor and make room for result.
+  __ PushList((1 << R0) | (1 << R5));
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ PopList((1 << R0) | (1 << R5));
+  __ LeaveStubFrame();
+  __ bx(R0);
+}
+
+
+// R5: Contains Smi 0 (need to preserve a GC-safe value for the lazy compile
+// stub).
+// R4: Contains an arguments descriptor.
+void StubCode::GenerateClosureCallBreakpointStub(Assembler* assembler) {
   __ EnterStubFrame();
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   // Preserve arguments descriptor and make room for result.
@@ -1543,6 +1557,18 @@
 }
 
 
+void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
+  // Make room for result.
+  __ PushList((1 << R0));
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ PopList((1 << R0));
+  __ LeaveStubFrame();
+  __ bx(R0);
+}
+
+
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
@@ -1680,17 +1706,25 @@
 // R1: stack_pointer.
 // R2: frame_pointer.
 // R3: error object.
-// SP: address of stacktrace object.
+// SP + 0: address of stacktrace object.
+// SP + 4: isolate
 // Does not return.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
   ASSERT(kStackTraceObjectReg == R1);
-  __ mov(IP, Operand(R1));  // Stack pointer.
+  __ mov(IP, Operand(R1));  // Copy Stack pointer into IP.
   __ mov(LR, Operand(R0));  // Program counter.
   __ mov(R0, Operand(R3));  // Exception object.
   __ ldr(R1, Address(SP, 0));  // StackTrace object.
+  __ ldr(R3, Address(SP, 4));  // Isolate.
   __ mov(FP, Operand(R2));  // Frame_pointer.
-  __ mov(SP, Operand(IP));  // Stack pointer.
+  __ mov(SP, Operand(IP));  // Set Stack pointer.
+  // Set the tag.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, R3, Isolate::vm_tag_offset());
+  // Clear top exit frame.
+  __ LoadImmediate(R2, 0);
+  __ StoreToOffset(kWord, R2, R3, Isolate::top_exit_frame_info_offset());
   __ bx(LR);  // Jump to the exception handler code.
 }
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 4f142f8..6ccef25 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -45,7 +45,6 @@
   __ SetPrologueOffset();
   __ Comment("CallToRuntimeStub");
   __ EnterFrame(0);
-  __ SmiUntag(R4);
 
   // Load current Isolate pointer from Context structure into R0.
   __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
@@ -1347,20 +1346,15 @@
   }
 #endif  // DEBUG
 
+  Label stepping, done_stepping;
   if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
     __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
     __ LoadFromOffset(
         R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
     __ CompareRegisters(R6, ZR);
-    __ b(&not_stepping, EQ);
-    __ EnterStubFrame();
-    __ Push(R5);  // Preserve IC data.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ Pop(R5);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
+    __ b(&stepping, NE);
+    __ Bind(&done_stepping);
   }
 
   // Load arguments descriptor into R4.
@@ -1476,6 +1470,16 @@
   __ AddImmediate(
       R2, R2, Instructions::HeaderSize() - kHeapObjectTag, kNoPP);
   __ br(R2);
+
+  if (FLAG_enable_debugger) {
+    __ Bind(&stepping);
+    __ EnterStubFrame();
+    __ Push(R5);  // Preserve IC data.
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ Pop(R5);
+    __ LeaveStubFrame();
+    __ b(&done_stepping);
+  }
 }
 
 
@@ -1636,10 +1640,26 @@
 }
 
 
-void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+// R5: Contains an ICData.
+void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
   __ EnterStubFrame();
-  __ Push(R5);  // Save IC Data.
-  __ Push(R4);  // Save arg. desc.
+  __ Push(R5);
+  __ PushObject(Object::null_object(), PP);  // Space for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ Pop(R0);
+  __ Pop(R5);
+  __ LeaveStubFrame();
+  __ br(R0);
+}
+
+
+// R5: Contains Smi 0 (need to preserve a GC-safe value for the lazy compile
+// stub).
+// R4: Contains an arguments descriptor.
+void StubCode::GenerateClosureCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ Push(R5);
+  __ Push(R4);
   __ PushObject(Object::null_object(), PP);  // Space for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ Pop(R0);
@@ -1650,6 +1670,15 @@
 }
 
 
+void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  __ PushObject(Object::null_object(), PP);  // Space for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ Pop(R0);
+  __ LeaveStubFrame();
+  __ br(R0);
+}
+
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
@@ -1790,6 +1819,7 @@
 // R2: frame_pointer.
 // R3: error object.
 // R4: address of stacktrace object.
+// R5: isolate.
 // Does not return.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == R0);
@@ -1799,6 +1829,11 @@
   __ mov(FP, R2);  // Frame_pointer.
   __ mov(R0, R3);  // Exception object.
   __ mov(R1, R4);  // StackTrace object.
+  // Set the tag.
+  __ LoadImmediate(R2, VMTag::kScriptTagId, kNoPP);
+  __ StoreToOffset(R2, R5, Isolate::vm_tag_offset(), kNoPP);
+  // Clear top exit frame.
+  __ StoreToOffset(ZR, R5, Isolate::top_exit_frame_info_offset(), kNoPP);
   __ ret();  // Jump to the exception handler code.
 }
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 263d694..0845ca8 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -37,7 +37,7 @@
 //   ESP + 4*EDX : address of first argument in argument array.
 //   ESP + 4*EDX + 4 : address of return value.
 //   ECX : address of the runtime function to call.
-//   EDX : number of arguments to the call as Smi.
+//   EDX : number of arguments to the call.
 // Must preserve callee saved registers EDI and EBX.
 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
   const intptr_t isolate_offset = NativeArguments::isolate_offset();
@@ -46,7 +46,6 @@
   const intptr_t retval_offset = NativeArguments::retval_offset();
 
   __ EnterFrame(0);
-  __ SmiUntag(EDX);
 
   // Load current Isolate pointer from Context structure into EAX.
   __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
@@ -1294,20 +1293,13 @@
   }
 #endif  // DEBUG
 
+  Label stepping, done_stepping;
   if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
     __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
-    __ cmpl(EAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-
-    __ EnterStubFrame();
-    __ pushl(ECX);
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popl(ECX);
-    __ LeaveFrame();
-    __ Bind(&not_stepping);
+    __ cmpb(Address(EAX, Isolate::single_step_offset()), Immediate(0));
+    __ j(NOT_EQUAL, &stepping);
+    __ Bind(&done_stepping);
   }
 
   // ECX: IC data object (preserved).
@@ -1324,8 +1316,8 @@
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
   __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-  __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is smi.
-  __ LoadTaggedClassIdMayBeSmi(EAX, EAX, EDI);
+  __ movl(EDI, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is smi.
+  __ LoadTaggedClassIdMayBeSmi(EAX, EDI);
 
   // EAX: receiver's class ID (smi).
   __ movl(EDI, Address(EBX, 0));  // First class id (smi) to check.
@@ -1336,8 +1328,8 @@
     if (i > 0) {
       // If not the first, load the next argument's class ID.
       __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-      __ movl(EAX, Address(ESP, EAX, TIMES_2, - i * kWordSize));
-      __ LoadTaggedClassIdMayBeSmi(EAX, EAX, EDI);
+      __ movl(EDI, Address(ESP, EAX, TIMES_2, - i * kWordSize));
+      __ LoadTaggedClassIdMayBeSmi(EAX, EDI);
 
       // EAX: next argument class ID (smi).
       __ movl(EDI, Address(EBX, i * kWordSize));
@@ -1355,8 +1347,8 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
-    __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
-    __ LoadTaggedClassIdMayBeSmi(EAX, EAX, EDI);
+    __ movl(EDI, Address(ESP, EAX, TIMES_2, 0));
+    __ LoadTaggedClassIdMayBeSmi(EAX, EDI);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1417,6 +1409,16 @@
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(EBX);
   __ int3();
+
+  if (FLAG_enable_debugger) {
+    __ Bind(&stepping);
+    __ EnterStubFrame();
+    __ pushl(ECX);
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ popl(ECX);
+    __ LeaveFrame();
+    __ jmp(&done_stepping);
+  }
 }
 
 
@@ -1584,10 +1586,30 @@
 }
 
 
-// EDX, ECX: May contain arguments to runtime stub.
-void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+// ECX: Contains an ICData.
+void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
   __ EnterStubFrame();
-  // Save runtime args.
+  // Save IC data.
+  __ pushl(ECX);
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ pushl(raw_null);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ popl(EAX);  // Address of original stub.
+  __ popl(ECX);  // Restore IC data.
+  __ LeaveFrame();
+  __ jmp(EAX);   // Jump to original stub.
+}
+
+
+// ECX: Contains Smi 0 (need to preserve a GC-safe value for the lazy compile
+// stub).
+// EDX: Contains an arguments descriptor.
+void StubCode::GenerateClosureCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Save arguments to original stub.
   __ pushl(ECX);
   __ pushl(EDX);
   // Room for result. Debugger stub returns address of the
@@ -1597,13 +1619,27 @@
   __ pushl(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ popl(EAX);  // Address of original stub.
-  __ popl(EDX);  // Restore arguments.
+  __ popl(EDX);  // Restore arguments to original stub.
   __ popl(ECX);
   __ LeaveFrame();
   __ jmp(EAX);   // Jump to original stub.
 }
 
 
+void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  const Immediate& raw_null =
+      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ pushl(raw_null);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ popl(EAX);  // Address of original stub.
+  __ LeaveFrame();
+  __ jmp(EAX);   // Jump to original stub.
+}
+
+
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   if (FLAG_enable_debugger) {
@@ -1749,15 +1785,22 @@
 // TOS + 3: frame_pointer
 // TOS + 4: exception object
 // TOS + 5: stacktrace object
+// TOS + 6: isolate
 // No Result.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == EAX);
   ASSERT(kStackTraceObjectReg == EDX);
+  __ movl(EDI, Address(ESP, 6 * kWordSize));  // Load target isolate.
   __ movl(kStackTraceObjectReg, Address(ESP, 5 * kWordSize));
   __ movl(kExceptionObjectReg, Address(ESP, 4 * kWordSize));
   __ movl(EBP, Address(ESP, 3 * kWordSize));  // Load target frame_pointer.
   __ movl(EBX, Address(ESP, 1 * kWordSize));  // Load target PC into EBX.
   __ movl(ESP, Address(ESP, 2 * kWordSize));  // Load target stack_pointer.
+  // Set tag.
+  __ movl(Address(EDI, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+  // Clear top exit frame.
+  __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
   __ jmp(EBX);  // Jump to the exception handler code.
 }
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 0f26abb..db6ca35 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -34,7 +34,7 @@
 //   SP + 4*S4 - 4 : address of first argument in argument array.
 //   SP + 4*S4 : address of return value.
 //   S5 : address of the runtime function to call.
-//   S4 : number of arguments to the call as Smi.
+//   S4 : number of arguments to the call.
 void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
   const intptr_t isolate_offset = NativeArguments::isolate_offset();
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
@@ -49,7 +49,6 @@
   __ sw(RA, Address(SP, 1 * kWordSize));
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
-  __ SmiUntag(S4);
 
   // Load current Isolate pointer from Context structure into A0.
   __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
@@ -1405,23 +1404,13 @@
 #endif  // DEBUG
 
 
+  Label stepping, done_stepping;
   if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
     __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
     __ lbu(T0, Address(T0, Isolate::single_step_offset()));
-    __ BranchEqual(T0, 0, &not_stepping);
-    // Call single step callback in debugger.
-    __ EnterStubFrame();
-    __ addiu(SP, SP, Immediate(-2 * kWordSize));
-    __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
-    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ lw(RA, Address(SP, 0 * kWordSize));
-    __ lw(S5, Address(SP, 1 * kWordSize));
-    __ addiu(SP, SP, Immediate(2 * kWordSize));
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
+    __ BranchNotEqual(T0, 0, &stepping);
+    __ Bind(&done_stepping);
   }
 
   // Load argument descriptor into S4.
@@ -1556,6 +1545,21 @@
   __ lw(T4, FieldAddress(T0, Function::instructions_offset()));
   __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T4);
+
+  if (FLAG_enable_debugger) {
+    // Call single step callback in debugger.
+    __ Bind(&stepping);
+    __ EnterStubFrame();
+    __ addiu(SP, SP, Immediate(-2 * kWordSize));
+    __ sw(S5, Address(SP, 1 * kWordSize));  // Preserve IC data.
+    __ sw(RA, Address(SP, 0 * kWordSize));  // Return address.
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ lw(RA, Address(SP, 0 * kWordSize));
+    __ lw(S5, Address(SP, 1 * kWordSize));
+    __ addiu(SP, SP, Immediate(2 * kWordSize));
+    __ LeaveStubFrame();
+    __ b(&done_stepping);
+  }
 }
 
 
@@ -1721,8 +1725,30 @@
 }
 
 
-void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
-  __ Comment("BreakpointRuntime stub");
+// S5: Contains an ICData.
+void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
+  __ Comment("ICCallBreakpoint stub");
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ sw(S5, Address(SP, 1 * kWordSize));
+  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
+  __ sw(TMP, Address(SP, 0 * kWordSize));
+
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+
+  __ lw(S5, Address(SP, 1 * kWordSize));
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ LeaveStubFrame();
+  __ jr(T0);
+}
+
+
+// S5: Contains Smi 0 (need to preserve a GC-safe value for the lazy compile
+// stub).
+// S4: Contains an arguments descriptor.
+void StubCode::GenerateClosureCallBreakpointStub(Assembler* assembler) {
+  __ Comment("ClosureCallBreakpoint stub");
   __ EnterStubFrame();
   __ addiu(SP, SP, Immediate(-3 * kWordSize));
   __ sw(S5, Address(SP, 2 * kWordSize));
@@ -1741,6 +1767,22 @@
 }
 
 
+void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+  __ Comment("RuntimeCallBreakpoint stub");
+  __ EnterStubFrame();
+  __ addiu(SP, SP, Immediate(-1 * kWordSize));
+  __ LoadImmediate(TMP, reinterpret_cast<intptr_t>(Object::null()));
+  __ sw(TMP, Address(SP, 0 * kWordSize));
+
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+
+  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ addiu(SP, SP, Immediate(3 * kWordSize));
+  __ LeaveStubFrame();
+  __ jr(T0);
+}
+
+
 // Called only from unoptimized code. All relevant registers have been saved.
 // RA: return address.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
@@ -1887,6 +1929,7 @@
 // A2: frame_pointer.
 // A3: error object.
 // SP + 4*kWordSize: address of stacktrace object.
+// SP + 5*kWordSize: address of isolate.
 // Does not return.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == V0);
@@ -1896,6 +1939,13 @@
   // the last of five arguments, so it is first pushed on the stack.
   __ lw(V1, Address(SP, 4 * kWordSize));  // StackTrace object.
   __ mov(FP, A2);  // Frame_pointer.
+  __ lw(A3, Address(SP, 5 * kWordSize));  // Isolate.
+  // Set tag.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(A3, Isolate::vm_tag_offset()));
+  // Clear top exit frame.
+  __ sw(ZR, Address(A3, Isolate::top_exit_frame_info_offset()));
+
   __ jr(A0);  // Jump to the exception handler code.
   __ delay_slot()->mov(SP, A1);  // Stack pointer.
 }
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 66eb240..a931ca9 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -83,7 +83,6 @@
   __ movq(Address(RSP, isolate_offset), CTX);  // Set isolate in NativeArgs.
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
-  __ SmiUntag(R10);
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
   __ leaq(RAX, Address(RBP, R10, TIMES_8, 1 * kWordSize));  // Compute argv.
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
@@ -1268,19 +1267,13 @@
   }
 #endif  // DEBUG
 
+  Label stepping, done_stepping;
   if (FLAG_enable_debugger) {
     // Check single stepping.
-    Label not_stepping;
     __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
-    __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
-    __ cmpq(RAX, Immediate(0));
-    __ j(EQUAL, &not_stepping, Assembler::kNearJump);
-    __ EnterStubFrame();
-    __ pushq(RBX);
-    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-    __ popq(RBX);
-    __ LeaveStubFrame();
-    __ Bind(&not_stepping);
+    __ cmpb(Address(RAX, Isolate::single_step_offset()), Immediate(0));
+    __ j(NOT_EQUAL, &stepping);
+    __ Bind(&done_stepping);
   }
 
   // Load arguments descriptor into R10.
@@ -1296,8 +1289,8 @@
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
-  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+  __ movq(R13, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
+  __ LoadTaggedClassIdMayBeSmi(RAX, R13);
   // RAX: receiver's class ID as smi.
   __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
   __ jmp(&test);
@@ -1307,8 +1300,8 @@
     if (i > 0) {
       // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-      __ movq(RAX, Address(RSP, RAX, TIMES_4, - i * kWordSize));
-      __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+      __ movq(R13, Address(RSP, RAX, TIMES_4, - i * kWordSize));
+      __ LoadTaggedClassIdMayBeSmi(RAX, R13);
       // RAX: next argument class ID (smi).
       __ movq(R13, Address(R12, i * kWordSize));
       // R13: next class ID to check (smi).
@@ -1325,8 +1318,8 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-    __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));
-    __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+    __ movq(R13, Address(RSP, RAX, TIMES_4, 0));
+    __ LoadTaggedClassIdMayBeSmi(RAX, R13);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1384,6 +1377,16 @@
   __ movq(RCX, FieldAddress(RAX, Function::instructions_offset()));
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RCX);
+
+  if (FLAG_enable_debugger) {
+    __ Bind(&stepping);
+    __ EnterStubFrame();
+    __ pushq(RBX);
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ popq(RBX);
+    __ LeaveStubFrame();
+    __ jmp(&done_stepping);
+  }
 }
 
 
@@ -1549,9 +1552,29 @@
 }
 
 
-//  RBX, R10: May contain arguments to runtime stub.
-//  TOS(0): return address (Dart code).
-void StubCode::GenerateBreakpointRuntimeStub(Assembler* assembler) {
+// RBX: Contains an ICData.
+// TOS(0): return address (Dart code).
+void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Preserve IC data.
+  __ pushq(RBX);
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  __ LoadObject(R12, Object::null_object(), PP);
+  __ pushq(R12);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ popq(RAX);  // Address of original.
+  __ popq(RBX);  // Restore IC data.
+  __ LeaveStubFrame();
+  __ jmp(RAX);   // Jump to original stub.
+}
+
+
+// RBX: Contains Smi 0 (need to preserve a GC-safe value for the lazy compile
+// stub).
+// R10: Contains an arguments descriptor.
+// TOS(0): return address (Dart code).
+void StubCode::GenerateClosureCallBreakpointStub(Assembler* assembler) {
   __ EnterStubFrame();
   // Preserve runtime args.
   __ pushq(RBX);
@@ -1569,6 +1592,20 @@
 }
 
 
+//  TOS(0): return address (Dart code).
+void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
+  __ EnterStubFrame();
+  // Room for result. Debugger stub returns address of the
+  // unpatched runtime stub.
+  __ LoadObject(R12, Object::null_object(), PP);
+  __ pushq(R12);  // Room for result.
+  __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
+  __ popq(RAX);  // Address of original.
+  __ LeaveStubFrame();
+  __ jmp(RAX);   // Jump to original stub.
+}
+
+
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   if (FLAG_enable_debugger) {
@@ -1713,6 +1750,7 @@
 // Arg3: frame_pointer
 // Arg4: exception object
 // Arg5: stacktrace object
+// Arg6: isolate
 // No Result.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == RAX);
@@ -1723,14 +1761,23 @@
 #if defined(_WIN64)
   Register stacktrace_reg = RBX;
   __ movq(stacktrace_reg, Address(RSP, 5 * kWordSize));
+  Register isolate_reg = RDI;
+  __ movq(isolate_reg, Address(RSP, 6 * kWordSize));
 #else
   Register stacktrace_reg = CallingConventions::kArg5Reg;
+  Register isolate_reg = CallingConventions::kArg6Reg;
 #endif
 
   __ movq(RBP, CallingConventions::kArg3Reg);
   __ movq(RSP, CallingConventions::kArg2Reg);
   __ movq(kStackTraceObjectReg, stacktrace_reg);
   __ movq(kExceptionObjectReg, CallingConventions::kArg4Reg);
+  // Set the tag.
+  __ movq(Address(isolate_reg, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+  // Clear top exit frame.
+  __ movq(Address(isolate_reg, Isolate::top_exit_frame_info_offset()),
+          Immediate(0));
   __ jmp(CallingConventions::kArg1Reg);  // Jump to the exception handler code.
 }
 
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ed1cdd6..21253ab 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -234,6 +234,8 @@
   V(ByteDataDot_view, "ByteData._view")                                        \
   V(ByteDataDotview, "ByteData.view")                                          \
   V(_ByteDataView, "_ByteDataView")                                            \
+  V(_ByteBuffer, "_ByteBuffer")                                                \
+  V(_ByteBufferDot_New, "_ByteBuffer._New")                                    \
   V(_WeakProperty, "_WeakProperty")                                            \
   V(_MirrorReference, "_MirrorReference")                                      \
   V(InvocationMirror, "_InvocationMirror")                                     \
@@ -256,7 +258,6 @@
   V(IsolateUnhandledException, "_IsolateUnhandledException")                   \
   V(JavascriptIntegerOverflowError, "_JavascriptIntegerOverflowError")         \
   V(JavascriptCompatibilityError, "_JavascriptCompatibilityError")             \
-  V(MirroredCompilationError, "MirroredCompilationError")                      \
   V(_setupFullStackTrace, "_setupFullStackTrace")                              \
   V(BooleanExpression, "boolean expression")                                   \
   V(Malformed, "malformed")                                                    \
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 93322cd..c77824d 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -157,6 +157,7 @@
     'double_conversion.cc',
     'double_conversion.h',
     'double_internals.h',
+    'elfgen.h',
     'exceptions.cc',
     'exceptions.h',
     'exceptions_test.cc',
diff --git a/sdk/bin/pub b/sdk/bin/pub
index 100a15b..7e4cfbd 100755
--- a/sdk/bin/pub
+++ b/sdk/bin/pub
@@ -59,7 +59,7 @@
   # Use the Dart binary in the built SDK so pub can find the version file next
   # to it.
   DART="$BUILD_DIR/dart-sdk/bin/dart"
-  PACKAGES_DIR="$BUILD_DIR/packages/"
+  PACKAGES_DIR="$BUILD_DIR/pub_packages/"
 
   PUB="$SDK_DIR/lib/_internal/pub/bin/pub.dart"
 
diff --git a/sdk/bin/pub.bat b/sdk/bin/pub.bat
index 4951d50..308398a 100644
--- a/sdk/bin/pub.bat
+++ b/sdk/bin/pub.bat
@@ -21,7 +21,7 @@
 set DART=%BIN_DIR%\dart
 set SNAPSHOT=%BIN_DIR%\snapshots\pub.dart.snapshot
 set BUILD_DIR=%SDK_DIR%\..\build\ReleaseIA32
-set PACKAGES_DIR=%BUILD_DIR%\packages
+set PACKAGES_DIR=%BUILD_DIR%\pub_packages
 set DART_IN_BUILT_SDK=%BUILD_DIR%\dart-sdk\bin\dart
 set VM_OPTIONS=
 
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 83f2e8d..354c8c69a 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -8133,10 +8133,10 @@
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
       return $_createObjectURL_1_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
       return $_createObjectURL_2_Callback(blob_OR_source_OR_stream);
     }
-    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
+    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
       return $_createObjectURL_3_Callback(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -8144,9 +8144,9 @@
 
   static $_createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
   static $createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 9687918..16713f1 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -12,9 +12,10 @@
 import "tree/tree.dart";
 import "util/util.dart";
 import "elements/modelx.dart"
-    show ElementX,
-         BaseFunctionElementX,
-         ClassElementX;
+    show BaseFunctionElementX,
+         ClassElementX,
+         ElementX,
+         LocalFunctionElementX;
 import "elements/visitor.dart" show ElementVisitor;
 
 class ClosureNamer {
@@ -47,7 +48,7 @@
       if (node is FunctionExpression) {
         translator.translateFunction(element, node);
       } else if (element.isSynthesized) {
-        return new ClosureClassMap(null, null, null, new ThisElement(element));
+        return new ClosureClassMap(null, null, null, new ThisLocal(element));
       } else {
         assert(element.isField);
         VariableElement field = element;
@@ -57,7 +58,7 @@
         } else {
           assert(element.isInstanceMember);
           closureMappingCache[node] =
-              new ClosureClassMap(null, null, null, new ThisElement(element));
+              new ClosureClassMap(null, null, null, new ThisLocal(element));
         }
       }
       assert(closureMappingCache[node] != null);
@@ -76,15 +77,19 @@
   }
 }
 
+/// Common interface for [BoxFieldElement] and [ClosureFieldElement] as
+/// non-elements.
+abstract class CapturedVariable {}
+
 // TODO(ahe): These classes continuously cause problems.  We need to
-// move these classes to elements/modelx.dart or see if we can find a
-// more general solution.
-class ClosureFieldElement extends ElementX implements VariableElement {
+// find a more general solution.
+class ClosureFieldElement extends ElementX
+    implements VariableElement, CapturedVariable {
   /// The source variable this element refers to.
-  final TypedElement variableElement;
+  final Local local;
 
   ClosureFieldElement(String name,
-                      this.variableElement,
+                      this.local,
                       ClosureClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
@@ -97,8 +102,7 @@
   bool get hasNode => false;
 
   Node get node {
-    throw new SpannableAssertionFailure(
-        variableElement,
+    throw new SpannableAssertionFailure(local,
         'Should not access node of ClosureFieldElement.');
   }
 
@@ -109,19 +113,22 @@
   }
 
   Expression get initializer {
-    throw new SpannableAssertionFailure(
-        variableElement,
+    throw new SpannableAssertionFailure(local,
         'Should not access initializer of ClosureFieldElement.');
   }
 
   bool get isInstanceMember => true;
   bool get isAssignable => false;
 
-  DartType computeType(Compiler compiler) {
-    return variableElement.type;
-  }
+  DartType computeType(Compiler compiler) => type;
 
-  DartType get type => variableElement.type;
+  DartType get type {
+    if (local is TypedElement) {
+      TypedElement element = local;
+      return element.type;
+    }
+    return const DynamicType();
+  }
 
   String toString() => "ClosureFieldElement($name)";
 
@@ -130,9 +137,8 @@
   Element get analyzableElement => closureClass.methodElement.analyzableElement;
 }
 
-// TODO(ahe): These classes continuously cause problems.  We need to
-// move these classes to elements/modelx.dart or see if we can find a
-// more general solution.
+// TODO(ahe): These classes continuously cause problems.  We need to find
+// a more general solution.
 class ClosureClassElement extends ClassElementX {
   DartType rawType;
   DartType thisType;
@@ -140,6 +146,8 @@
   /// Node that corresponds to this closure, used for source position.
   final FunctionExpression node;
 
+  final List<ClosureFieldElement> _closureFields = <ClosureFieldElement>[];
+
   ClosureClassElement(this.node,
                       String name,
                       Compiler compiler,
@@ -165,6 +173,13 @@
     callType = methodElement.type;
   }
 
+  Iterable<ClosureFieldElement> get closureFields => _closureFields;
+
+  void addField(ClosureFieldElement field, DiagnosticListener listener) {
+    _closureFields.add(field);
+    addMember(field, listener);
+  }
+
   bool get hasNode => true;
 
   bool get isClosure => true;
@@ -188,34 +203,24 @@
   accept(ElementVisitor visitor) => visitor.visitClosureClassElement(this);
 }
 
-// TODO(ahe): These classes continuously cause problems.  We need to
-// move these classes to elements/modelx.dart or see if we can find a
-// more general solution.
-class BoxElement extends ElementX implements TypedElement {
-  BoxElement(String name, Element enclosingElement)
-      : super(name, ElementKind.VARIABLE_LIST, enclosingElement);
+/// A local variable that contains the box object holding the [BoxFieldElement]
+/// fields.
+class BoxLocal extends Local {
+  final String name;
+  final Element enclosingElement;
 
-  DartType computeType(Compiler compiler) => type;
-
-  DartType get type => const DynamicType();
-
-  accept(ElementVisitor visitor) => visitor.visitBoxElement(this);
+  BoxLocal(String this.name, Element this.enclosingElement);
 }
 
 // TODO(ngeoffray, ahe): These classes continuously cause problems.  We need to
-// move these classes to elements/modelx.dart or see if we can find a
-// more general solution.
-class BoxFieldElement extends ElementX implements TypedElement {
-  BoxFieldElement(String name,
-                  this.variableElement,
-                  BoxElement enclosingBox)
-      : super(name, ElementKind.FIELD, enclosingBox);
+// find a more general solution.
+class BoxFieldElement extends ElementX
+    implements TypedElement, CapturedVariable {
+  final BoxLocal box;
 
-  /// Use [box] instead.
-  @deprecated
-  get enclosingElement;
-
-  BoxElement get box => super.enclosingElement;
+  BoxFieldElement(String name, this.variableElement, BoxLocal box)
+      : this.box = box,
+        super(name, ElementKind.FIELD, box.enclosingElement);
 
   DartType computeType(Compiler compiler) => type;
 
@@ -226,24 +231,16 @@
   accept(ElementVisitor visitor) => visitor.visitBoxFieldElement(this);
 }
 
-// TODO(ahe): These classes continuously cause problems.  We need to
-// move these classes to elements/modelx.dart or see if we can find a
-// more general solution.
-class ThisElement extends ElementX implements TypedElement {
-  ThisElement(Element enclosing)
-      : super('this', ElementKind.PARAMETER, enclosing);
+/// A local variable used encode the direct (uncaptured) references to [this].
+class ThisLocal extends Local {
+  final Element enclosingElement;
 
-  bool get isAssignable => false;
+  ThisLocal(Element enclosingElement)
+      : this.enclosingElement = enclosingElement;
 
-  DartType computeType(Compiler compiler) => type;
+  String get name => 'this';
 
-  DartType get type => const DynamicType();
-
-  // Since there is no declaration corresponding to 'this', use the position of
-  // the enclosing method.
-  Token get position => enclosingElement.position;
-
-  accept(ElementVisitor visitor) => visitor.visitThisElement(this);
+  ClassElement get enclosingClass => enclosingElement.enclosingClass;
 }
 
 /// Call method of a closure class.
@@ -280,22 +277,31 @@
 // The box-element for a scope, and the captured variables that need to be
 // stored in the box.
 class ClosureScope {
-  Element boxElement;
-  Map<Element, Element> capturedVariableMapping;
+  BoxLocal boxElement;
+  Map<VariableElement, BoxFieldElement> _capturedVariableMapping;
+
   // If the scope is attached to a [For] contains the variables that are
   // declared in the initializer of the [For] and that need to be boxed.
   // Otherwise contains the empty List.
-  List<Element> boxedLoopVariables;
+  List<VariableElement> boxedLoopVariables = const <VariableElement>[];
 
-  ClosureScope(this.boxElement, this.capturedVariableMapping)
-      : boxedLoopVariables = const <Element>[];
+  ClosureScope(this.boxElement, this._capturedVariableMapping);
 
   bool hasBoxedLoopVariables() => !boxedLoopVariables.isEmpty;
+
+  bool isCapturedVariable(VariableElement variable) {
+    return _capturedVariableMapping.containsKey(variable);
+  }
+
+  void forEachCapturedVariable(f(VariableElement variable,
+                                 BoxFieldElement boxField)) {
+    _capturedVariableMapping.forEach(f);
+  }
 }
 
 class ClosureClassMap {
   // The closure's element before any translation. Will be null for methods.
-  final Element closureElement;
+  final FunctionElement closureElement;
   // The closureClassElement will be null for methods that are not local
   // closures.
   final ClosureClassElement closureClassElement;
@@ -303,66 +309,111 @@
   final FunctionElement callElement;
   // The [thisElement] makes handling 'this' easier by treating it like any
   // other argument. It is only set for instance-members.
-  final ThisElement thisElement;
+  final ThisLocal thisLocal;
 
   // Maps free locals, arguments and function elements to their captured
   // copies.
-  final Map<Element, Element> freeVariableMapping;
+  final Map<Local, CapturedVariable> _freeVariableMapping =
+      new Map<Local, CapturedVariable>();
+
   // Maps closure-fields to their captured elements. This is somehow the inverse
   // mapping of [freeVariableMapping], but whereas [freeVariableMapping] does
   // not deal with boxes, here we map instance-fields (which might represent
   // boxes) to their boxElement.
-  final Map<Element, Element> capturedFieldMapping;
+  final Map<ClosureFieldElement, Local> _closureFieldMapping =
+      new Map<ClosureFieldElement, Local>();
 
   // Maps scopes ([Loop] and [FunctionExpression] nodes) to their
   // [ClosureScope] which contains their box and the
   // captured variables that are stored in the box.
   // This map will be empty if the method/closure of this [ClosureData] does not
   // contain any nested closure.
-  final Map<Node, ClosureScope> capturingScopes;
+  final Map<Node, ClosureScope> capturingScopes = new Map<Node, ClosureScope>();
 
-  final Set<Element> usedVariablesInTry;
+  final Set<Local> usedVariablesInTry = new Set<Local>();
 
   ClosureClassMap(this.closureElement,
                   this.closureClassElement,
                   this.callElement,
-                  this.thisElement)
-      : this.freeVariableMapping = new Map<Element, Element>(),
-        this.capturedFieldMapping = new Map<Element, Element>(),
-        this.capturingScopes = new Map<Node, ClosureScope>(),
-        this.usedVariablesInTry = new Set<Element>();
+                  this.thisLocal);
+
+  void addFreeVariable(Local element) {
+    assert(_freeVariableMapping[element] == null);
+    _freeVariableMapping[element] = null;
+  }
+
+  Iterable<Local> get freeVariables => _freeVariableMapping.keys;
+
+  bool isFreeVariable(Local element) {
+    return _freeVariableMapping.containsKey(element);
+  }
+
+  CapturedVariable getFreeVariableElement(Local element) {
+    return _freeVariableMapping[element];
+  }
+
+  /// Sets the free [variable] to be captured by the [boxField].
+  void setFreeVariableBoxField(Local variable,
+                               BoxFieldElement boxField) {
+    _freeVariableMapping[variable] = boxField;
+  }
+
+  /// Sets the free [variable] to be captured by the [closureField].
+  void setFreeVariableClosureField(Local variable,
+                                   ClosureFieldElement closureField) {
+    _freeVariableMapping[variable] = closureField;
+  }
+
+
+  void forEachFreeVariable(f(Local variable,
+                             CapturedVariable field)) {
+    _freeVariableMapping.forEach(f);
+  }
+
+  Local getLocalVariableForClosureField(ClosureFieldElement field) {
+    return _closureFieldMapping[field];
+  }
+
+  void setLocalVariableForClosureField(ClosureFieldElement field,
+      Local variable) {
+    _closureFieldMapping[field] = variable;
+  }
 
   bool get isClosure => closureElement != null;
 
-  bool capturingScopesBox(Element element) {
+  bool capturingScopesBox(Local variable) {
     return capturingScopes.values.any((scope) {
-      return scope.boxedLoopVariables.contains(element);
+      return scope.boxedLoopVariables.contains(variable);
     });
   }
 
-  bool isVariableBoxed(Element element) {
-    Element copy = freeVariableMapping[element];
-    if (copy != null && !copy.isMember) return true;
-    return capturingScopesBox(element);
+  bool isVariableBoxed(Local variable) {
+    CapturedVariable copy = _freeVariableMapping[variable];
+    if (copy is BoxFieldElement) {
+      return true;
+    }
+    return capturingScopesBox(variable);
   }
 
-  void forEachCapturedVariable(void f(Element local, Element field)) {
-    freeVariableMapping.forEach((variable, copy) {
-      if (variable is BoxElement) return;
+  void forEachCapturedVariable(void f(Local variable,
+                                      CapturedVariable field)) {
+    _freeVariableMapping.forEach((variable, copy) {
+      if (variable is BoxLocal) return;
       f(variable, copy);
     });
-    capturingScopes.values.forEach((scope) {
-      scope.capturedVariableMapping.forEach(f);
+    capturingScopes.values.forEach((ClosureScope scope) {
+      scope.forEachCapturedVariable(f);
     });
   }
 
-  void forEachBoxedVariable(void f(Element local, Element field)) {
-    freeVariableMapping.forEach((variable, copy) {
+  void forEachBoxedVariable(void f(VariableElement local,
+                                   BoxFieldElement field)) {
+    _freeVariableMapping.forEach((variable, copy) {
       if (!isVariableBoxed(variable)) return;
       f(variable, copy);
     });
-    capturingScopes.values.forEach((scope) {
-      scope.capturedVariableMapping.forEach(f);
+    capturingScopes.values.forEach((ClosureScope scope) {
+      scope.forEachCapturedVariable(f);
     });
   }
 }
@@ -375,19 +426,21 @@
   bool inTryStatement = false;
   final Map<Node, ClosureClassMap> closureMappingCache;
 
-  // Map of captured variables. Initially they will map to themselves. If
+  // Map of captured variables. Initially they will map to `null`. If
   // a variable needs to be boxed then the scope declaring the variable
-  // will update this mapping.
-  Map<Element, Element> capturedVariableMapping;
+  // will update this to mapping to the capturing [BoxFieldElement].
+  Map<Local, BoxFieldElement> _capturedVariableMapping =
+      new Map<Local, BoxFieldElement>();
+
   // List of encountered closures.
-  List<Expression> closures;
+  List<Expression> closures = <Expression>[];
 
   // The variables that have been declared in the current scope.
-  List<Element> scopeVariables;
+  List<Local> scopeVariables;
 
   // Keep track of the mutated variables so that we don't need to box
   // non-mutated variables.
-  Set<Element> mutatedVariables;
+  Set<VariableElement> mutatedVariables = new Set<VariableElement>();
 
   Element outermostElement;
   Element currentElement;
@@ -399,18 +452,38 @@
 
   bool insideClosure = false;
 
-  ClosureTranslator(this.compiler, this.elements, this.closureMappingCache,
-                    this.namer)
-      : capturedVariableMapping = new Map<Element, Element>(),
-        closures = <Expression>[],
-        mutatedVariables = new Set<Element>();
+  ClosureTranslator(this.compiler,
+                    this.elements,
+                    this.closureMappingCache,
+                    this.namer);
+
+  bool isCapturedVariable(Local element) {
+    return _capturedVariableMapping.containsKey(element);
+  }
+
+  void addCapturedVariable(Node node, Local variable) {
+    if (_capturedVariableMapping[variable] != null) {
+      compiler.internalError(node, 'In closure analyzer.');
+    }
+    _capturedVariableMapping[variable] = null;
+  }
+
+  void setCapturedVariableBoxField(Local variable,
+      BoxFieldElement boxField) {
+    assert(isCapturedVariable(variable));
+    _capturedVariableMapping[variable] = boxField;
+  }
+
+  BoxFieldElement getCapturedVariableBoxField(Local variable) {
+    return _capturedVariableMapping[variable];
+  }
 
   void translateFunction(Element element, FunctionExpression node) {
     // For constructors the [element] and the [:elements[node]:] may differ.
     // The [:elements[node]:] always points to the generative-constructor
     // element, whereas the [element] might be the constructor-body element.
-    visit(node);  // [visitFunctionExpression] will call [visitInvokable].
-    // When variables need to be boxed their [capturedVariableMapping] is
+    visit(node); // [visitFunctionExpression] will call [visitInvokable].
+    // When variables need to be boxed their [_capturedVariableMapping] is
     // updated, but we delay updating the similar freeVariableMapping in the
     // closure datas that capture these variables.
     // The closures don't have their fields (in the closure class) set, either.
@@ -426,93 +499,106 @@
 
   // This function runs through all of the existing closures and updates their
   // free variables to the boxed value. It also adds the field-elements to the
-  // class representing the closure. At the same time it fills the
-  // [capturedFieldMapping].
+  // class representing the closure.
   void updateClosures() {
     for (Expression closure in closures) {
       // The captured variables that need to be stored in a field of the closure
       // class.
-      Set<Element> fieldCaptures = new Set<Element>();
-      Set<Element> boxes = new Set<Element>();
+      Set<Local> fieldCaptures = new Set<Local>();
+      Set<BoxLocal> boxes = new Set<BoxLocal>();
       ClosureClassMap data = closureMappingCache[closure];
-      Map<Element, Element> freeVariableMapping = data.freeVariableMapping;
       // We get a copy of the keys and iterate over it, to avoid modifications
       // to the map while iterating over it.
-      freeVariableMapping.keys.toList().forEach((Element fromElement) {
-        assert(fromElement == freeVariableMapping[fromElement]);
-        Element updatedElement = capturedVariableMapping[fromElement];
-        assert(updatedElement != null);
-        if (fromElement == updatedElement) {
-          assert(freeVariableMapping[fromElement] == updatedElement);
-          assert(Elements.isLocal(updatedElement)
-                 || updatedElement.isTypeVariable);
+      Iterable<Local> freeVariables = data.freeVariables.toList();
+      freeVariables.forEach((Local fromElement) {
+        assert(data.isFreeVariable(fromElement));
+        assert(data.getFreeVariableElement(fromElement) == null);
+        assert(isCapturedVariable(fromElement));
+        BoxFieldElement boxFieldElement =
+            getCapturedVariableBoxField(fromElement);
+        if (boxFieldElement == null) {
+          assert(fromElement is! BoxLocal);
           // The variable has not been boxed.
-          fieldCaptures.add(updatedElement);
+          fieldCaptures.add(fromElement);
         } else {
           // A boxed element.
-          BoxFieldElement boxFieldElement = updatedElement;
-          freeVariableMapping[fromElement] = boxFieldElement;
-          BoxElement boxElement = boxFieldElement.box;
-          boxes.add(boxElement);
+          data.setFreeVariableBoxField(fromElement, boxFieldElement);
+          boxes.add(boxFieldElement.box);
         }
       });
-      ClassElement closureElement = data.closureClassElement;
-      assert(closureElement != null ||
+      ClosureClassElement closureClass = data.closureClassElement;
+      assert(closureClass != null ||
              (fieldCaptures.isEmpty && boxes.isEmpty));
-      void addElement(Element element, String name) {
-        Element fieldElement = new ClosureFieldElement(
-            name, element, closureElement);
-        closureElement.addMember(fieldElement, compiler);
-        data.capturedFieldMapping[fieldElement] = element;
-        freeVariableMapping[element] = fieldElement;
+
+      void addClosureField(Local local, String name) {
+        ClosureFieldElement closureField =
+            new ClosureFieldElement(name, local, closureClass);
+        closureClass.addField(closureField, compiler);
+        data.setLocalVariableForClosureField(closureField, local);
+        data.setFreeVariableClosureField(local, closureField);
       }
+
       // Add the box elements first so we get the same ordering.
       // TODO(sra): What is the canonical order of multiple boxes?
-      for (Element capturedElement in boxes) {
-        addElement(capturedElement, capturedElement.name);
+      for (BoxLocal capturedElement in boxes) {
+        addClosureField(capturedElement, capturedElement.name);
       }
-      for (Element capturedElement in
-               Elements.sortedByPosition(fieldCaptures)) {
+
+      /// Comparator for locals. Position boxes before elements.
+      int compareLocals(a, b) {
+        if (a is Element && b is Element) {
+          return Elements.compareByPosition(a, b);
+        } else if (a is Element) {
+          return 1;
+        } else if (b is Element) {
+          return -1;
+        } else {
+          return a.name.compareTo(b.name);
+        }
+      }
+
+      for (Local capturedLocal in fieldCaptures.toList()..sort(compareLocals)) {
         int id = closureFieldCounter++;
-        String name = namer.getClosureVariableName(capturedElement.name, id);
-        addElement(capturedElement, name);
+        String name = namer.getClosureVariableName(capturedLocal.name, id);
+        addClosureField(capturedLocal, name);
       }
-      closureElement.reverseBackendMembers();
+      closureClass.reverseBackendMembers();
     }
   }
 
-  void useLocal(Element element) {
+  void useLocal(Local variable) {
     // If the element is not declared in the current function and the element
     // is not the closure itself we need to mark the element as free variable.
     // Note that the check on [insideClosure] is not just an
     // optimization: factories have type parameters as function
     // parameters, and type parameters are declared in the class, not
     // the factory.
-    if (insideClosure &&
-        element.enclosingElement != currentElement &&
-        element != currentElement) {
-      assert(closureData.freeVariableMapping[element] == null ||
-             closureData.freeVariableMapping[element] == element);
-      closureData.freeVariableMapping[element] = element;
+    bool inCurrentContext(var variable) {
+      return variable == currentElement ||
+             variable.enclosingElement == currentElement;
+    }
+
+    if (insideClosure && !inCurrentContext(variable)) {
+      closureData.addFreeVariable(variable);
     } else if (inTryStatement) {
       // Don't mark the this-element or a self-reference. This would complicate
       // things in the builder.
       // Note that nested (named) functions are immutable.
-      if (element != closureData.thisElement &&
-          element != closureData.closureElement) {
+      if (variable != closureData.thisLocal &&
+          variable != closureData.closureElement) {
         // TODO(ngeoffray): only do this if the variable is mutated.
-        closureData.usedVariablesInTry.add(element);
+        closureData.usedVariablesInTry.add(variable);
       }
     }
   }
 
-  void declareLocal(Element element) {
+  void declareLocal(Local element) {
     scopeVariables.add(element);
   }
 
   void registerNeedsThis() {
-    if (closureData.thisElement != null) {
-      useLocal(closureData.thisElement);
+    if (closureData.thisLocal != null) {
+      useLocal(closureData.thisLocal);
     }
   }
 
@@ -530,7 +616,9 @@
       Node definition = link.head;
       VariableElement element = elements[definition];
       assert(element != null);
-      declareLocal(element);
+      if (!element.isFieldParameter) {
+        declareLocal(element);
+      }
       // We still need to visit the right-hand sides of the init-assignments.
       // For SendSets don't visit the left again. Otherwise it would be marked
       // as mutated.
@@ -576,9 +664,10 @@
       registerNeedsThis();
     } else {
       Element element = elements[node];
-      if (element != null && element.kind == ElementKind.TYPE_VARIABLE) {
+      if (element != null && element.isTypeVariable) {
         if (outermostElement.isConstructor) {
-          useLocal(element);
+          TypeVariableElement typeVariable = element;
+          useLocal(typeVariable);
         } else {
           registerNeedsThis();
         }
@@ -590,7 +679,8 @@
   visitSend(Send node) {
     Element element = elements[node];
     if (Elements.isLocal(element)) {
-      useLocal(element);
+      TypedElement localElement = element;
+      useLocal(localElement);
     } else if (element != null && element.isTypeVariable) {
       TypeVariableElement variable = element;
       analyzeType(variable.type);
@@ -667,32 +757,41 @@
   // current [closureData].
   // The boxed variables are updated in the [capturedVariableMapping].
   void attachCapturedScopeVariables(Node node) {
-    Element box = null;
-    Map<Element, Element> scopeMapping = new Map<Element, Element>();
-    for (Element element in scopeVariables) {
-      // No need to box non-assignable elements.
-      if (!element.isAssignable) continue;
-      if (!mutatedVariables.contains(element)) continue;
-      if (capturedVariableMapping.containsKey(element)) {
+    BoxLocal box = null;
+    Map<VariableElement, BoxFieldElement> scopeMapping =
+        new Map<VariableElement, BoxFieldElement>();
+
+    void boxCapturedVariable(VariableElement variable) {
+      if (isCapturedVariable(variable)) {
         if (box == null) {
           // TODO(floitsch): construct better box names.
           String boxName =
               namer.getClosureVariableName('box', closureFieldCounter++);
-          box = new BoxElement(
-              boxName, currentElement);
+          box = new BoxLocal(boxName, currentElement);
         }
-        String elementName = element.name;
+        String elementName = variable.name;
         String boxedName =
             namer.getClosureVariableName(elementName, boxedFieldCounter++);
         // TODO(kasperl): Should this be a FieldElement instead?
-        Element boxed = new BoxFieldElement(boxedName, element, box);
+        BoxFieldElement boxed = new BoxFieldElement(boxedName, variable, box);
         // No need to rename the fields of a box, so we give them a native name
         // right now.
         boxed.setFixedBackendName(boxedName);
-        scopeMapping[element] = boxed;
-        capturedVariableMapping[element] = boxed;
+        scopeMapping[variable] = boxed;
+        setCapturedVariableBoxField(variable, boxed);
       }
     }
+
+    bool isAssignable(var variable) {
+      return variable is Element && variable.isAssignable;
+    }
+
+    for (Local variable in scopeVariables) {
+      // No need to box non-assignable elements.
+      if (!isAssignable(variable)) continue;
+      if (!mutatedVariables.contains(variable)) continue;
+      boxCapturedVariable(variable);
+    }
     if (!scopeMapping.isEmpty) {
       ClosureScope scope = new ClosureScope(box, scopeMapping);
       closureData.capturingScopes[node] = scope;
@@ -700,13 +799,11 @@
   }
 
   void inNewScope(Node node, Function action) {
-    List<Element> oldScopeVariables = scopeVariables;
-    scopeVariables = new List<Element>();
+    List<Local> oldScopeVariables = scopeVariables;
+    scopeVariables = <Local>[];
     action();
     attachCapturedScopeVariables(node);
-    for (Element element in scopeVariables) {
-      mutatedVariables.remove(element);
-    }
+    mutatedVariables.removeAll(scopeVariables);
     scopeVariables = oldScopeVariables;
   }
 
@@ -724,15 +821,15 @@
     if (definitions == null) return;
     ClosureScope scopeData = closureData.capturingScopes[node];
     if (scopeData == null) return;
-    List<Element> result = <Element>[];
+    List<VariableElement> result = <VariableElement>[];
     for (Link<Node> link = definitions.definitions.nodes;
          !link.isEmpty;
          link = link.tail) {
       Node definition = link.head;
-      Element element = elements[definition];
-      if (capturedVariableMapping.containsKey(element)) {
+      VariableElement element = elements[definition];
+      if (isCapturedVariable(element)) {
         result.add(element);
-      };
+      }
     }
     scopeData.boxedLoopVariables = result;
   }
@@ -776,7 +873,7 @@
   }
 
   ClosureClassMap globalizeClosure(FunctionExpression node,
-                                   TypedElement element) {
+                                   FunctionElement element) {
     String closureName = computeClosureName(element);
     ClosureClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.compilationUnit);
@@ -790,7 +887,7 @@
     globalizedElement.computeAllClassMembers(compiler);
     // The nested function's 'this' is the same as the one for the outer
     // function. It could be [null] if we are inside a static method.
-    Element thisElement = closureData.thisElement;
+    ThisLocal thisElement = closureData.thisLocal;
 
     return new ClosureClassMap(element, globalizedElement,
                                callElement, thisElement);
@@ -802,15 +899,17 @@
     ClosureClassMap oldClosureData = closureData;
 
     insideClosure = outermostElement != null;
+    FunctionElement closure;
     currentElement = element;
     if (insideClosure) {
+      closure = element;
       closures.add(node);
-      closureData = globalizeClosure(node, element);
+      closureData = globalizeClosure(node, closure);
     } else {
       outermostElement = element;
-      Element thisElement = null;
+      ThisLocal thisElement = null;
       if (element.isInstanceMember || element.isGenerativeConstructor) {
-        thisElement = new ThisElement(element);
+        thisElement = new ThisLocal(element);
       }
       closureData = new ClosureClassMap(null, null, null, thisElement);
     }
@@ -818,15 +917,15 @@
 
     inNewScope(node, () {
       // We have to declare the implicit 'this' parameter.
-      if (!insideClosure && closureData.thisElement != null) {
-        declareLocal(closureData.thisElement);
+      if (!insideClosure && closureData.thisLocal != null) {
+        declareLocal(closureData.thisLocal);
       }
       // If we are inside a named closure we have to declare ourselve. For
       // simplicity we declare the local even if the closure does not have a
       // name.
       // It will simply not be used.
       if (insideClosure) {
-        declareLocal(element);
+        declareLocal(closure);
       }
 
       if (currentElement.isFactoryConstructor &&
@@ -839,12 +938,12 @@
         });
       }
 
-      DartType type = element.computeType(compiler);
+      DartType type = element.type;
       // If the method needs RTI, or checked mode is set, we need to
       // escape the potential type variables used in that closure.
-      if (element is FunctionElement
-          && (compiler.backend.methodNeedsRti(element) ||
-              compiler.enableTypeAssertions)) {
+      if (element is FunctionElement &&
+          (compiler.backend.methodNeedsRti(element) ||
+           compiler.enableTypeAssertions)) {
         analyzeTypeVariables(type);
       }
 
@@ -861,15 +960,11 @@
     currentElement = oldFunctionElement;
 
     // Mark all free variables as captured and use them in the outer function.
-    Iterable<Element> freeVariables = savedClosureData.freeVariableMapping.keys;
+    Iterable<Local> freeVariables = savedClosureData.freeVariables;
     assert(freeVariables.isEmpty || savedInsideClosure);
-    for (Element freeElement in freeVariables) {
-      if (capturedVariableMapping[freeElement] != null &&
-          capturedVariableMapping[freeElement] != freeElement) {
-        compiler.internalError(node, 'In closure analyzer.');
-      }
-      capturedVariableMapping[freeElement] = freeElement;
-      useLocal(freeElement);
+    for (Local freeVariable in freeVariables) {
+      addCapturedVariable(node, freeVariable);
+      useLocal(freeVariable);
     }
   }
 
@@ -894,7 +989,8 @@
 
   visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
-    declareLocal(elements[node]);
+    FunctionElement localFunction = elements[node];
+    declareLocal(localFunction);
   }
 
   visitTryStatement(TryStatement node) {
diff --git a/sdk/lib/_internal/compiler/implementation/common.dart b/sdk/lib/_internal/compiler/implementation/common.dart
index 89130c7..53f3a09 100644
--- a/sdk/lib/_internal/compiler/implementation/common.dart
+++ b/sdk/lib/_internal/compiler/implementation/common.dart
@@ -27,6 +27,7 @@
 export 'elements/elements.dart' show
     ClassElement,
     ClosureFieldElement,
+    CompilationUnitElement,
     Element,
     Elements,
     FunctionElement,
diff --git a/sdk/lib/_internal/compiler/implementation/compilation_info.dart b/sdk/lib/_internal/compiler/implementation/compilation_info.dart
new file mode 100644
index 0000000..3732338
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/compilation_info.dart
@@ -0,0 +1,66 @@
+library dart2js.compilation_info;
+
+import 'dart2jslib.dart';
+import 'elements/elements.dart';
+import 'tree/tree.dart';
+
+
+abstract class CompilationInformation {
+  factory CompilationInformation(Enqueuer enqueuer, bool dumpInfoEnabled) {
+    if (dumpInfoEnabled) {
+      return new _CompilationInformation(enqueuer);
+    } else {
+      return new _EmptyCompilationInformation();
+    }
+  }
+
+  Map<Element, Set<Element>> get enqueuesMap;
+  Map<Element, Set<Element>> get addsToWorkListMap;
+
+  void enqueues(Element function, Element source) {}
+  void addsToWorkList(Element context, Element element) {}
+  void registerCallSite(TreeElements context, Send node) {}
+}
+
+class _EmptyCompilationInformation implements CompilationInformation {
+  _EmptyCompilationInformation();
+  Map<Element, Set<Element>> get enqueuesMap => <Element, Set<Element>>{};
+  Map<Element, Set<Element>> get addsToWorkListMap => <Element, Set<Element>>{};
+
+  void enqueues(Element function, Element source) {}
+  void addsToWorkList(Element context, Element element) {}
+  void registerCallSite(TreeElements context, Send node) {}
+}
+
+
+class _CompilationInformation implements CompilationInformation {
+  final String prefix;
+
+  final Map<Element, Set<Element>> enqueuesMap = {};
+  final Map<Element, Set<Element>> addsToWorkListMap = {};
+
+  _CompilationInformation(Enqueuer enqueuer)
+    : prefix = enqueuer.isResolutionQueue ? 'resolution' : 'codegen';
+
+  Set<CallSite> callSites = new Set<CallSite>();
+
+  enqueues(Element function, Element source) {
+    enqueuesMap.putIfAbsent(function, () => new Set())
+    .add(source);
+  }
+
+  addsToWorkList(Element context, Element element) {
+    addsToWorkListMap.putIfAbsent(context, () => new Set())
+    .add(element);
+  }
+
+  registerCallSite(TreeElements context, Send node) {
+    callSites.add(new CallSite(context, node));
+  }
+}
+
+class CallSite {
+  final TreeElements context;
+  final Send node;
+  CallSite(this.context, this.node);
+}
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index e8e14e7..a08b609 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -58,6 +58,8 @@
 
   bool get isForResolution => false;
 
+  Element get currentElement => treeElements.currentElement;
+
   // TODO(johnniwinther): Remove this getter when [Registry] creates a
   // dependency node.
   Setlet<Element> get otherDependencies => treeElements.otherDependencies;
@@ -82,15 +84,15 @@
   }
 
   void registerDynamicInvocation(Selector selector) {
-    world.registerDynamicInvocation(selector);
+    world.registerDynamicInvocation(currentElement, selector);
   }
 
   void registerDynamicSetter(Selector selector) {
-    world.registerDynamicSetter(selector);
+    world.registerDynamicSetter(currentElement, selector);
   }
 
   void registerDynamicGetter(Selector selector) {
-    world.registerDynamicGetter(selector);
+    world.registerDynamicGetter(currentElement, selector);
   }
 
   void registerGetterForSuperMethod(Element element) {
@@ -129,7 +131,7 @@
   }
 
   void registerSelectorUse(Selector selector) {
-    world.registerSelectorUse(selector);
+    world.registerSelectorUse(currentElement, selector);
   }
 
   void registerFactoryWithTypeArguments() {
@@ -310,8 +312,8 @@
    * Call this method to enable [noSuchMethod] handling in the
    * backend.
    */
-  void enableNoSuchMethod(Enqueuer enqueuer) {
-    enqueuer.registerInvocation(compiler.noSuchMethodSelector);
+  void enableNoSuchMethod(Element context, Enqueuer enqueuer) {
+    enqueuer.registerInvocation(null, compiler.noSuchMethodSelector);
   }
 
   /// Call this method to enable support for isolates.
@@ -454,6 +456,12 @@
 
   // Does this element belong in the output
   bool shouldOutput(Element element) => true;
+
+  FunctionElement helperForBadMain() => null;
+
+  FunctionElement helperForMissingMain() => null;
+
+  FunctionElement helperForMainArity() => null;
 }
 
 /// Backend callbacks function specific to the resolution phase.
@@ -827,6 +835,9 @@
   DumpInfoTask dumpInfoTask;
   String buildId;
 
+  /// A customizable filter that is applied to enqueued work items.
+  QueueFilter enqueuerFilter = new QueueFilter();
+
   static const String MAIN = 'main';
   static const String CALL_OPERATOR_NAME = 'call';
   static const String NO_SUCH_METHOD = 'noSuchMethod';
@@ -1015,6 +1026,11 @@
     }
   }
 
+  Element _elementFromHInstruction(HInstruction instruction) {
+    return instruction.sourceElement is Element
+        ? instruction.sourceElement : null;
+  }
+
   /// Finds the approximate [Element] for [node]. [currentElement] is used as
   /// the default value.
   Element elementFromSpannable(Spannable node) {
@@ -1022,7 +1038,7 @@
     if (node is Element) {
       element = node;
     } else if (node is HInstruction) {
-      element = node.sourceElement;
+      element = _elementFromHInstruction(node);
     } else if (node is MetadataAnnotation) {
       element = node.annotatedElement;
     }
@@ -1274,53 +1290,75 @@
     });
   }
 
-  /// Performs the compilation when all libraries have been loaded.
-  void compileLoadedLibraries() {
-    Element main = null;
-    if (mainApp != null) {
-      main = mainApp.findExported(MAIN);
-      if (main == null) {
-        if (!analyzeOnly) {
-          // Allow analyze only of libraries with no main.
-          reportFatalError(
-              mainApp,
-              MessageKind.GENERIC,
-              {'text': "Could not find '$MAIN'."});
-        } else if (!analyzeAll) {
-          reportFatalError(mainApp, MessageKind.GENERIC,
-              {'text': "Could not find '$MAIN'. "
-                       "No source will be analyzed. "
-                       "Use '--analyze-all' to analyze all code in the "
-                       "library."});
+  void computeMain() {
+    if (mainApp == null) return;
+
+    Element main = mainApp.findExported(MAIN);
+    ErroneousElement errorElement = null;
+    if (main == null) {
+      if (analyzeOnly) {
+        if (!analyzeAll) {
+          errorElement = new ErroneousElementX(
+              MessageKind.CONSIDER_ANALYZE_ALL, {'main': MAIN}, MAIN, mainApp);
         }
       } else {
-        if (main.isErroneous && main.isSynthesized) {
-          reportFatalError(main, MessageKind.GENERIC,
-              {'text': "Cannot determine which '$MAIN' to use."});
-        } else if (!main.isFunction) {
-          reportFatalError(main, MessageKind.GENERIC,
-              {'text': "'$MAIN' is not a function."});
-        }
-        mainFunction = main;
-        FunctionSignature parameters = mainFunction.computeSignature(this);
-        if (parameters.parameterCount > 2) {
-          int index = 0;
-          parameters.forEachParameter((Element parameter) {
-            if (index++ < 2) return;
-            reportError(parameter, MessageKind.GENERIC,
-                {'text': "'$MAIN' cannot have more than two parameters."});
-          });
-        }
+        // Compilation requires a main method.
+        errorElement = new ErroneousElementX(
+            MessageKind.MISSING_MAIN, {'main': MAIN}, MAIN, mainApp);
       }
-
-      mirrorUsageAnalyzerTask.analyzeUsage(mainApp);
-
-      // In order to see if a library is deferred, we must compute the
-      // compile-time constants that are metadata.  This means adding
-      // something to the resolution queue.  So we cannot wait with
-      // this until after the resolution queue is processed.
-      deferredLoadTask.ensureMetadataResolved(this);
+      mainFunction = backend.helperForMissingMain();
+    } else if (main.isErroneous && main.isSynthesized) {
+      if (main is ErroneousElement) {
+        errorElement = main;
+      } else {
+        internalError(main, 'Problem with $MAIN.');
+      }
+      mainFunction = backend.helperForBadMain();
+    } else if (!main.isFunction) {
+      errorElement = new ErroneousElementX(
+          MessageKind.MAIN_NOT_A_FUNCTION, {'main': MAIN}, MAIN, main);
+      mainFunction = backend.helperForBadMain();
+    } else {
+      mainFunction = main;
+      FunctionSignature parameters = mainFunction.computeSignature(this);
+      if (parameters.requiredParameterCount > 2) {
+        int index = 0;
+        parameters.orderedForEachParameter((Element parameter) {
+          if (index++ < 2) return;
+          errorElement = new ErroneousElementX(
+              MessageKind.MAIN_WITH_EXTRA_PARAMETER, {'main': MAIN}, MAIN,
+              parameter);
+          mainFunction = backend.helperForMainArity();
+          // Don't warn about main not being used:
+          enqueuer.resolution.registerStaticUse(main);
+        });
+      }
     }
+    if (mainFunction == null) {
+      if (errorElement == null && !analyzeOnly && !analyzeAll) {
+        internalError(mainApp, "Problem with '$MAIN'.");
+      } else {
+        mainFunction = errorElement;
+      }
+    }
+    if (errorElement != null && errorElement.isSynthesized) {
+      reportWarning(
+          errorElement, errorElement.messageKind,
+          errorElement.messageArguments);
+    }
+  }
+
+  /// Performs the compilation when all libraries have been loaded.
+  void compileLoadedLibraries() {
+    computeMain();
+
+    mirrorUsageAnalyzerTask.analyzeUsage(mainApp);
+
+    // In order to see if a library is deferred, we must compute the
+    // compile-time constants that are metadata.  This means adding
+    // something to the resolution queue.  So we cannot wait with
+    // this until after the resolution queue is processed.
+    deferredLoadTask.ensureMetadataResolved(this);
 
     phase = PHASE_RESOLVING;
     if (analyzeAll) {
@@ -1336,7 +1374,7 @@
     backend.enqueueHelpers(enqueuer.resolution, globalDependencies);
     resolveLibraryMetadata();
     log('Resolving...');
-    processQueue(enqueuer.resolution, main);
+    processQueue(enqueuer.resolution, mainFunction);
     enqueuer.resolution.logSummary(log);
 
     if (compilationFailed) return;
@@ -1364,7 +1402,7 @@
       }
       return;
     }
-    assert(main != null);
+    assert(mainFunction != null);
     phase = PHASE_DONE_RESOLVING;
 
     // TODO(ahe): Remove this line. Eventually, enqueuer.resolution
@@ -1374,13 +1412,13 @@
     // require the information computed in [world.populate].)
     backend.onResolutionComplete();
 
-    deferredLoadTask.onResolutionComplete(main);
+    deferredLoadTask.onResolutionComplete(mainFunction);
 
     log('Building IR...');
     irBuilder.buildNodes();
 
     log('Inferring types...');
-    typesTask.onResolutionComplete(main);
+    typesTask.onResolutionComplete(mainFunction);
 
     if(stopAfterTypeInference) return;
 
@@ -1389,17 +1427,17 @@
     // TODO(johnniwinther): Move these to [CodegenEnqueuer].
     if (hasIsolateSupport) {
       backend.enableIsolateSupport(enqueuer.codegen);
-      enqueuer.codegen.registerGetOfStaticFunction(main);
+      enqueuer.codegen.registerGetOfStaticFunction(mainFunction);
     }
     if (enabledNoSuchMethod) {
-      backend.enableNoSuchMethod(enqueuer.codegen);
+      backend.enableNoSuchMethod(null, enqueuer.codegen);
     }
     if (compileAll) {
       libraryLoader.libraries.forEach((LibraryElement library) {
         fullyEnqueueLibrary(library, enqueuer.codegen);
       });
     }
-    processQueue(enqueuer.codegen, main);
+    processQueue(enqueuer.codegen, mainFunction);
     enqueuer.codegen.logSummary(log);
 
     if (compilationFailed) return;
@@ -1450,7 +1488,7 @@
 
   void processQueue(Enqueuer world, Element main) {
     world.nativeEnqueuer.processNativeClasses(libraryLoader.libraries);
-    if (main != null) {
+    if (main != null && !main.isErroneous) {
       FunctionElement mainMethod = main;
       if (mainMethod.computeSignature(this).parameterCount != 0) {
         // TODO(ngeoffray, floitsch): we should also ensure that the
@@ -1703,7 +1741,7 @@
   }
 
   SourceSpan spanFromHInstruction(HInstruction instruction) {
-    Element element = instruction.sourceElement;
+    Element element = _elementFromHInstruction(instruction);
     if (element == null) element = currentElement;
     var position = instruction.sourcePosition;
     if (position == null) return spanFromElement(element);
diff --git a/sdk/lib/_internal/compiler/implementation/ir/const_expression.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/const_expression.dart
similarity index 100%
rename from sdk/lib/_internal/compiler/implementation/ir/const_expression.dart
rename to sdk/lib/_internal/compiler/implementation/cps_ir/const_expression.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
similarity index 99%
rename from sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
rename to sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index f0d7b30..64bd682 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -4,7 +4,7 @@
 
 library dart2js.ir_builder;
 
-import 'ir_nodes.dart' as ir;
+import 'cps_ir_nodes.dart' as ir;
 import '../elements/elements.dart';
 import '../dart2jslib.dart';
 import '../dart_types.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
similarity index 99%
rename from sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
rename to sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
index dae5502..af8e95e 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_nodes.dart
@@ -11,8 +11,8 @@
 import '../elements/elements.dart';
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../dart_types.dart' show DartType, GenericType;
-import '../helpers/helpers.dart';
 import 'const_expression.dart';
+import '../helpers/helpers.dart';
 
 abstract class Node {
   static int hashCount = 0;
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
similarity index 71%
rename from sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
rename to sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
index 722d75c..639954c 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_tracer.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async' show EventSink;
 
-import 'ir_nodes.dart' as ir hide Function;
+import 'cps_ir_nodes.dart' as cps_ir hide Function;
 import '../tracer.dart';
 
 /**
@@ -14,15 +14,15 @@
  */
 const bool IR_TRACE_LET_CONT = false;
 
-class IRTracer extends TracerUtil implements ir.Visitor {
+class IRTracer extends TracerUtil implements cps_ir.Visitor {
   int indent = 0;
   EventSink<String> output;
 
   IRTracer(this.output);
 
-  visit(ir.Node node) => node.accept(this);
+  visit(cps_ir.Node node) => node.accept(this);
 
-  void traceGraph(String name, ir.FunctionDefinition graph) {
+  void traceGraph(String name, cps_ir.FunctionDefinition graph) {
     tag("cfg", () {
       printProperty("name", name);
       visitFunctionDefinition(graph);
@@ -32,7 +32,7 @@
   // Temporary field used during tree walk
   Names names;
 
-  visitFunctionDefinition(ir.FunctionDefinition f) {
+  visitFunctionDefinition(cps_ir.FunctionDefinition f) {
     names = new Names();
     BlockCollector builder = new BlockCollector(names);
     builder.visit(f);
@@ -44,9 +44,9 @@
     names = null;
   }
 
-  int countUses(ir.Definition definition) {
+  int countUses(cps_ir.Definition definition) {
     int count = 0;
-    ir.Reference ref = definition.firstRef;
+    cps_ir.Reference ref = definition.firstRef;
     while (ref != null) {
       ++count;
       ref = ref.nextRef;
@@ -70,7 +70,7 @@
         });
       });
       tag("HIR", () {
-        for (ir.Parameter param in block.parameters) {
+        for (cps_ir.Parameter param in block.parameters) {
           String name = names.name(param);
           printStmt(name, "Parameter $name [useCount=${countUses(param)}]");
         }
@@ -86,13 +86,13 @@
     add("$bci $uses $resultVar $contents <|@\n");
   }
 
-  visitLetPrim(ir.LetPrim node) {
+  visitLetPrim(cps_ir.LetPrim node) {
     String id = names.name(node.primitive);
     printStmt(id, "LetPrim $id = ${formatPrimitive(node.primitive)}");
     visit(node.body);
   }
 
-  visitLetCont(ir.LetCont node) {
+  visitLetCont(cps_ir.LetCont node) {
     if (IR_TRACE_LET_CONT) {
       String dummy = names.name(node);
       String id = names.name(node.continuation);
@@ -101,7 +101,7 @@
     visit(node.body);
   }
 
-  visitInvokeStatic(ir.InvokeStatic node) {
+  visitInvokeStatic(cps_ir.InvokeStatic node) {
     String dummy = names.name(node);
     String callName = node.selector.name;
     String args = node.arguments.map(formatReference).join(', ');
@@ -109,7 +109,7 @@
     printStmt(dummy, "InvokeStatic $callName ($args) $kont");
   }
 
-  visitInvokeMethod(ir.InvokeMethod node) {
+  visitInvokeMethod(cps_ir.InvokeMethod node) {
     String dummy = names.name(node);
     String receiver = formatReference(node.receiver);
     String callName = node.selector.name;
@@ -119,7 +119,7 @@
         "InvokeMethod $receiver $callName ($args) $kont");
   }
 
-  visitInvokeSuperMethod(ir.InvokeSuperMethod node) {
+  visitInvokeSuperMethod(cps_ir.InvokeSuperMethod node) {
     String dummy = names.name(node);
     String callName = node.selector.name;
     String args = node.arguments.map(formatReference).join(', ');
@@ -128,7 +128,7 @@
         "InvokeSuperMethod $callName ($args) $kont");
   }
 
-  visitInvokeConstructor(ir.InvokeConstructor node) {
+  visitInvokeConstructor(cps_ir.InvokeConstructor node) {
     String dummy = names.name(node);
     String callName;
     if (node.target.name.isEmpty) {
@@ -141,20 +141,20 @@
     printStmt(dummy, "InvokeConstructor $callName ($args) $kont");
   }
 
-  visitConcatenateStrings(ir.ConcatenateStrings node) {
+  visitConcatenateStrings(cps_ir.ConcatenateStrings node) {
     String dummy = names.name(node);
     String args = node.arguments.map(formatReference).join(', ');
     String kont = formatReference(node.continuation);
     printStmt(dummy, "ConcatenateStrings ($args) $kont");
   }
 
-  visitLiteralList(ir.LiteralList node) {
+  visitLiteralList(cps_ir.LiteralList node) {
     String dummy = names.name(node);
     String values = node.values.map(formatReference).join(', ');
     printStmt(dummy, "LiteralList ($values)");
   }
 
-  visitLiteralMap(ir.LiteralMap node) {
+  visitLiteralMap(cps_ir.LiteralMap node) {
     String dummy = names.name(node);
     List<String> entries = new List<String>();
     for (int i = 0; i < node.values.length; ++i) {
@@ -165,7 +165,7 @@
     printStmt(dummy, "LiteralMap (${entries.join(', ')})");
   }
 
-  visitTypeOperator(ir.TypeOperator node) {
+  visitTypeOperator(cps_ir.TypeOperator node) {
     String dummy = names.name(node);
     String operator = node.operator;
     List<String> entries = new List<String>();
@@ -173,14 +173,14 @@
     printStmt(dummy, "TypeOperator ($operator $receiver ${node.type})");
   }
 
-  visitInvokeContinuation(ir.InvokeContinuation node) {
+  visitInvokeContinuation(cps_ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
     String args = node.arguments.map(formatReference).join(', ');
     printStmt(dummy, "InvokeContinuation $kont ($args)");
   }
 
-  visitBranch(ir.Branch node) {
+  visitBranch(cps_ir.Branch node) {
     String dummy = names.name(node);
     String condition = visit(node.condition);
     String trueCont = formatReference(node.trueContinuation);
@@ -188,7 +188,7 @@
     printStmt(dummy, "Branch $condition ($trueCont, $falseCont)");
   }
 
-  visitSetClosureVariable(ir.SetClosureVariable node) {
+  visitSetClosureVariable(cps_ir.SetClosureVariable node) {
     String dummy = names.name(node);
     String variable = node.variable.name;
     String value = formatReference(node.value);
@@ -196,63 +196,63 @@
     visit(node.body);
   }
 
-  visitDeclareFunction(ir.DeclareFunction node) {
+  visitDeclareFunction(cps_ir.DeclareFunction node) {
     String dummy = names.name(node);
     String variable = node.variable.name;
     printStmt(dummy, 'DeclareFunction $variable');
     visit(node.body);
   }
 
-  String formatReference(ir.Reference ref) {
-    ir.Definition target = ref.definition;
-    if (target is ir.Continuation && target.body == null) {
+  String formatReference(cps_ir.Reference ref) {
+    cps_ir.Definition target = ref.definition;
+    if (target is cps_ir.Continuation && target.body == null) {
       return "return"; // Do not generate a name for the return continuation
     } else {
       return names.name(ref.definition);
     }
   }
 
-  String formatPrimitive(ir.Primitive p) => visit(p);
+  String formatPrimitive(cps_ir.Primitive p) => visit(p);
 
-  visitConstant(ir.Constant node) {
+  visitConstant(cps_ir.Constant node) {
     return "Constant ${node.value}";
   }
 
-  visitParameter(ir.Parameter node) {
+  visitParameter(cps_ir.Parameter node) {
     return "Parameter ${names.name(node)}";
   }
 
-  visitContinuation(ir.Continuation node) {
+  visitContinuation(cps_ir.Continuation node) {
     return "Continuation ${names.name(node)}";
   }
 
-  visitIsTrue(ir.IsTrue node) {
+  visitIsTrue(cps_ir.IsTrue node) {
     return "IsTrue(${names.name(node.value.definition)})";
   }
 
-  visitThis(ir.This node) {
+  visitThis(cps_ir.This node) {
     return "This";
   }
 
-  visitReifyTypeVar(ir.ReifyTypeVar node) {
+  visitReifyTypeVar(cps_ir.ReifyTypeVar node) {
     return "ReifyTypeVar ${node.typeVariable.name}";
   }
 
-  visitCreateFunction(ir.CreateFunction node) {
+  visitCreateFunction(cps_ir.CreateFunction node) {
     return "CreateFunction ${node.definition.element.name}";
   }
 
-  visitGetClosureVariable(ir.GetClosureVariable node) {
+  visitGetClosureVariable(cps_ir.GetClosureVariable node) {
     String variable = node.variable.name;
     return 'GetClosureVariable $variable';
   }
 
 
-  visitCondition(ir.Condition c) {}
-  visitExpression(ir.Expression e) {}
-  visitPrimitive(ir.Primitive p) {}
-  visitDefinition(ir.Definition d) {}
-  visitNode(ir.Node n) {}
+  visitCondition(cps_ir.Condition c) {}
+  visitExpression(cps_ir.Expression e) {}
+  visitPrimitive(cps_ir.Primitive p) {}
+  visitDefinition(cps_ir.Definition d) {}
+  visitNode(cps_ir.Node n) {}
 }
 
 /**
@@ -271,9 +271,9 @@
   };
 
   String prefix(x) {
-    if (x is ir.Parameter) return 'r';
-    if (x is ir.Continuation || x is ir.FunctionDefinition) return 'B';
-    if (x is ir.Primitive) return 'v';
+    if (x is cps_ir.Parameter) return 'r';
+    if (x is cps_ir.Continuation || x is cps_ir.FunctionDefinition) return 'B';
+    if (x is cps_ir.Primitive) return 'v';
     return 'x';
   }
 
@@ -293,8 +293,8 @@
  */
 class Block {
   String name;
-  final List<ir.Parameter> parameters;
-  final ir.Expression body;
+  final List<cps_ir.Parameter> parameters;
+  final cps_ir.Expression body;
   final List<Block> succ = <Block>[];
   final List<Block> pred = <Block>[];
 
@@ -306,15 +306,16 @@
   }
 }
 
-class BlockCollector extends ir.Visitor {
+class BlockCollector extends cps_ir.Visitor {
   Block entry;
-  final Map<ir.Continuation, Block> cont2block = <ir.Continuation, Block>{};
+  final Map<cps_ir.Continuation, Block> cont2block =
+      <cps_ir.Continuation, Block>{};
   Block current_block;
 
   Names names;
   BlockCollector(this.names);
 
-  Block getBlock(ir.Continuation c) {
+  Block getBlock(cps_ir.Continuation c) {
     Block block = cont2block[c];
     if (block == null) {
       block = new Block(names.name(c), c.parameters, c.body);
@@ -323,67 +324,67 @@
     return block;
   }
 
-  visitFunctionDefinition(ir.FunctionDefinition f) {
+  visitFunctionDefinition(cps_ir.FunctionDefinition f) {
     entry = current_block = new Block(names.name(f), [], f.body);
     visit(f.body);
   }
 
-  visitLetPrim(ir.LetPrim exp) {
+  visitLetPrim(cps_ir.LetPrim exp) {
     visit(exp.body);
   }
 
-  visitLetCont(ir.LetCont exp) {
+  visitLetCont(cps_ir.LetCont exp) {
     visit(exp.continuation);
     visit(exp.body);
   }
 
-  void addEdgeToContinuation(ir.Reference continuation) {
-    ir.Definition target = continuation.definition;
-    if (target is ir.Continuation && target.body != null) {
+  void addEdgeToContinuation(cps_ir.Reference continuation) {
+    cps_ir.Definition target = continuation.definition;
+    if (target is cps_ir.Continuation && target.body != null) {
       current_block.addEdgeTo(getBlock(target));
     }
   }
 
-  visitInvokeStatic(ir.InvokeStatic exp) {
+  visitInvokeStatic(cps_ir.InvokeStatic exp) {
     addEdgeToContinuation(exp.continuation);
   }
 
-  visitInvokeMethod(ir.InvokeMethod exp) {
+  visitInvokeMethod(cps_ir.InvokeMethod exp) {
     addEdgeToContinuation(exp.continuation);
   }
 
-  visitInvokeConstructor(ir.InvokeConstructor exp) {
+  visitInvokeConstructor(cps_ir.InvokeConstructor exp) {
     addEdgeToContinuation(exp.continuation);
   }
 
-  visitConcatenateStrings(ir.ConcatenateStrings exp) {
+  visitConcatenateStrings(cps_ir.ConcatenateStrings exp) {
     addEdgeToContinuation(exp.continuation);
   }
 
-  visitInvokeContinuation(ir.InvokeContinuation exp) {
+  visitInvokeContinuation(cps_ir.InvokeContinuation exp) {
     addEdgeToContinuation(exp.continuation);
   }
 
-  visitSetClosureVariable(ir.SetClosureVariable exp) {
+  visitSetClosureVariable(cps_ir.SetClosureVariable exp) {
     visit(exp.body);
   }
 
-  visitDeclareFunction(ir.DeclareFunction exp) {
+  visitDeclareFunction(cps_ir.DeclareFunction exp) {
     visit(exp.body);
   }
 
-  visitBranch(ir.Branch exp) {
-    ir.Continuation trueTarget = exp.trueContinuation.definition;
+  visitBranch(cps_ir.Branch exp) {
+    cps_ir.Continuation trueTarget = exp.trueContinuation.definition;
     if (trueTarget.body != null) {
       current_block.addEdgeTo(getBlock(trueTarget));
     }
-    ir.Continuation falseTarget = exp.falseContinuation.definition;
+    cps_ir.Continuation falseTarget = exp.falseContinuation.definition;
     if (falseTarget.body != null) {
       current_block.addEdgeTo(getBlock(falseTarget));
     }
   }
 
-  visitContinuation(ir.Continuation c) {
+  visitContinuation(cps_ir.Continuation c) {
     var old_node = current_block;
     current_block = getBlock(c);
     visit(c.body);
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 4191cd7..7267a0e 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -32,7 +32,7 @@
 import 'scanner/scannerlib.dart';
 import 'ssa/ssa.dart';
 import 'tree/tree.dart';
-import 'ir/ir_builder.dart' show IrBuilderTask;
+import 'cps_ir/cps_ir_builder.dart' show IrBuilderTask;
 import 'universe/universe.dart';
 import 'util/util.dart';
 import 'util/characters.dart' show $_;
@@ -48,6 +48,7 @@
 import 'dump_info.dart';
 import 'tracer.dart' show Tracer;
 import 'cache_strategy.dart';
+import 'compilation_info.dart';
 
 export 'resolution/resolution.dart' show TreeElements, TreeElementMapping;
 export 'scanner/scannerlib.dart' show isUserDefinableOperator,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 18aaff0..9c3c58b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -133,13 +133,13 @@
     // Enqueue the methods that the VM might invoke on user objects because
     // we don't trust the resolution to always get these included.
     world.registerInvocation(
-        new Selector.call("toString", null, 0));
+        null, new Selector.call("toString", null, 0));
     world.registerInvokedGetter(
-        new Selector.getter("hashCode", null));
+        null, new Selector.getter("hashCode", null));
     world.registerInvocation(
-        new Selector.binaryOperator("=="));
+        null, new Selector.binaryOperator("=="));
     world.registerInvocation(
-        new Selector.call("compareTo", null, 1));
+        null, new Selector.call("compareTo", null, 1));
   }
 
   void codegen(CodegenWorkItem work) { }
@@ -230,25 +230,27 @@
       if (!compiler.irBuilder.hasIr(element)) {
         return new ElementAst(element);
       } else {
-        ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
-        tree.Builder builder = new tree.Builder(compiler);
-        tree.FunctionDefinition definition = builder.build(function);
+        cps_ir.FunctionDefinition function = compiler.irBuilder.getIr(element);
+        tree_builder.Builder builder = new tree_builder.Builder(compiler);
+        tree_ir.FunctionDefinition definition = builder.build(function);
         assert(definition != null);
         compiler.tracer.traceCompilation(element.name, null, compiler);
         compiler.tracer.traceGraph('Tree builder', definition);
         TreeElementMapping treeElements = new TreeElementMapping(element);
-        new tree.StatementRewriter().rewrite(definition);
+        new StatementRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Statement rewriter', definition);
-        new tree.CopyPropagator().rewrite(definition);
+        new CopyPropagator().rewrite(definition);
         compiler.tracer.traceGraph('Copy propagation', definition);
-        new tree.LoopRewriter().rewrite(definition);
+        new LoopRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Loop rewriter', definition);
-        new tree.LogicalRewriter().rewrite(definition);
+        new LogicalRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Logical rewriter', definition);
-        new dart_codegen.UnshadowParameters().unshadow(definition);
+        new backend_ast_emitter.UnshadowParameters().unshadow(definition);
         compiler.tracer.traceGraph('Unshadow parameters', definition);
-        Node node = dart_codegen.emit(element, treeElements, definition);
-        return new ElementAst.internal(node, treeElements);
+        backend_ast.Node backendAst =
+            backend_ast_emitter.emit(definition);
+        Node frontend_ast = backend2frontend.emit(treeElements, backendAst);
+        return new ElementAst.internal(frontend_ast, treeElements);
       }
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
similarity index 97%
rename from sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
index 9d02580..8c18384 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_emitter.dart
@@ -2,26 +2,21 @@
 // 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 dart_codegen;
+library backend_ast_emitter;
 
-import 'dart_tree.dart' as tree;
-import 'dart_printer.dart';
-import 'dart_tree_printer.dart' show TreePrinter;
-import '../tree/tree.dart' as frontend;
+import 'tree_ir_nodes.dart' as tree;
+import 'backend_ast_nodes.dart';
 import '../dart2jslib.dart' as dart2js;
 import '../elements/elements.dart';
 import '../dart_types.dart';
 import '../elements/modelx.dart' as modelx;
 import '../universe/universe.dart';
 import '../tree/tree.dart' as tree show Modifiers;
-import '../ir/const_expression.dart';
+import '../cps_ir/const_expression.dart';
 
-/// Translates the dart_tree IR to Dart frontend AST.
-frontend.FunctionExpression emit(FunctionElement element,
-                                 dart2js.TreeElementMapping treeElements,
-                                 tree.FunctionDefinition definition) {
-  FunctionExpression fn = new ASTEmitter().emit(definition);
-  return new TreePrinter(treeElements).makeExpression(fn);
+/// Translates the dart_tree IR to Dart backend AST.
+Expression emit(tree.FunctionDefinition definition) {
+  return new ASTEmitter().emit(definition);
 }
 
 /// Translates the dart_tree IR to Dart backend AST.
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
similarity index 100%
rename from sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_nodes.dart
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
similarity index 98%
rename from sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
index cc15a54..d8af695 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart
@@ -4,7 +4,7 @@
 
 library dart_tree_printer;
 
-import 'dart_printer.dart';
+import 'backend_ast_nodes.dart';
 import '../tree/tree.dart' as tree;
 import '../scanner/scannerlib.dart';
 import '../util/util.dart';
@@ -12,6 +12,12 @@
 import '../elements/elements.dart' as elements;
 import '../dart_types.dart' as types;
 
+/// Translates the backend AST to Dart frontend AST.
+tree.FunctionExpression emit(dart2js.TreeElementMapping treeElements,
+                             Node definition) {
+  return new TreePrinter(treeElements).makeExpression(definition);
+}
+
 /// If true, the unparser will insert a coment in front of every function
 /// it emits. This helps indicate which functions were translated by the new
 /// backend.
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
new file mode 100644
index 0000000..3278224
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/copy_propagator.dart
@@ -0,0 +1,196 @@
+// Copyright (c) 2014, 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 dart_tree;
+
+import '../elements/elements.dart';
+import 'tree_ir_nodes.dart';
+
+/// Eliminates moving assignments, such as w := v, by assigning directly to w
+/// at the definition of v.
+///
+/// This compensates for suboptimal register allocation, and merges closure
+/// variables with local temporaries that were left behind when translating
+/// out of CPS (where closure variables live in a separate space).
+class CopyPropagator extends RecursiveVisitor {
+
+  /// After visitStatement returns, [move] maps a variable v to an
+  /// assignment A of form w := v, under the following conditions:
+  /// - there are no uses of w before A
+  /// - A is the only use of v
+  Map<Variable, Assign> move = <Variable, Assign>{};
+
+  /// Like [move], except w is the key instead of v.
+  Map<Variable, Assign> inverseMove = <Variable, Assign>{};
+
+  /// The function currently being rewritten.
+  FunctionElement functionElement;
+
+  void rewrite(FunctionDefinition function) {
+    functionElement = function.element;
+    visitFunctionDefinition(function);
+  }
+
+  void visitFunctionDefinition(FunctionDefinition function) {
+    assert(functionElement == function.element);
+    function.body = visitStatement(function.body);
+
+    // Try to propagate moving assignments into function parameters.
+    // For example:
+    // foo(x) {
+    //   var v1 = x;
+    //   BODY
+    // }
+    //   ==>
+    // foo(v1) {
+    //   BODY
+    // }
+
+    // Variables must not occur more than once in the parameter list, so
+    // invalidate all moving assignments that would propagate a parameter
+    // into another parameter. For example:
+    // foo(x,y) {
+    //   y = x;
+    //   BODY
+    // }
+    // Cannot declare function as foo(x,x)!
+    function.parameters.forEach(visitVariable);
+
+    // Now do the propagation.
+    for (int i=0; i<function.parameters.length; i++) {
+      Variable param = function.parameters[i];
+      Variable replacement = copyPropagateVariable(param);
+      replacement.element = param.element; // Preserve parameter name.
+      function.parameters[i] = replacement;
+    }
+  }
+
+  Statement visitBasicBlock(Statement node) {
+    node = visitStatement(node);
+    move.clear();
+    inverseMove.clear();
+    return node;
+  }
+
+  void visitVariable(Variable variable) {
+    // We have found a use of w.
+    // Remove assignments of form w := v from the move maps.
+    Assign movingAssignment = inverseMove.remove(variable);
+    if (movingAssignment != null) {
+      move.remove(movingAssignment.definition);
+    }
+  }
+
+  /**
+   * Called when a definition of [v] is encountered.
+   * Attempts to propagate the assignment through a moving assignment.
+   * Returns the variable to be assigned into, defaulting to [v] itself if
+   * no optimization could be performed.
+   */
+  Variable copyPropagateVariable(Variable v) {
+    Assign movingAssign = move[v];
+    if (movingAssign != null) {
+      // We found the pattern:
+      //   v := EXPR
+      //   BLOCK   (does not use w)
+      //   w := v  (only use of v)
+      //
+      // Rewrite to:
+      //   w := EXPR
+      //   BLOCK
+      //   w := w  (to be removed later)
+      Variable w = movingAssign.variable;
+
+      // Make w := w.
+      // We can't remove the statement from here because we don't have
+      // parent pointers. So just make it a no-op so it can be removed later.
+      movingAssign.definition = w;
+
+      // The intermediate variable 'v' should now be orphaned, so don't bother
+      // updating its read/write counters.
+      // Due to the nop trick, the variable 'w' now has one additional read
+      // and write.
+      ++w.writeCount;
+      ++w.readCount;
+
+      // Make w := EXPR
+      return w;
+    }
+    return v;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.next = visitStatement(node.next);
+    node.variable = copyPropagateVariable(node.variable);
+    visitExpression(node.definition);
+    visitVariable(node.variable);
+
+    // If this is a moving assignment w := v, with this being the only use of v,
+    // try to propagate it backwards.  Do not propagate assignments where w
+    // is from an outer function scope.
+    if (node.definition is Variable) {
+      Variable def = node.definition;
+      if (def.readCount == 1 &&
+          node.variable.host.element == functionElement) {
+        move[node.definition] = node;
+        inverseMove[node.variable] = node;
+      }
+    }
+
+    return node;
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    node.next = visitBasicBlock(node.next);
+    node.body = visitStatement(node.body);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    visitExpression(node.value);
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    visitExpression(node.condition);
+    node.thenStatement = visitBasicBlock(node.thenStatement);
+    node.elseStatement = visitBasicBlock(node.elseStatement);
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    node.body = visitBasicBlock(node.body);
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    throw "WhileCondition before LoopRewriter";
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new CopyPropagator().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    node.variable = copyPropagateVariable(node.variable);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.next = visitStatement(node.next);
+    visitExpression(node.expression);
+    return node;
+  }
+
+  void visitFunctionExpression(FunctionExpression node) {
+    new CopyPropagator().rewrite(node.definition);
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
index 518c5d0..f05438a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart
@@ -10,11 +10,18 @@
 import '../dart2jslib.dart';
 import '../dart_types.dart';
 import '../tree/tree.dart';
-import '../ir/ir_nodes.dart' as ir;
-import 'dart_tree.dart' as tree;
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
+import 'tree_ir_builder.dart' as tree_builder;
+import 'tree_ir_nodes.dart' as tree_ir;
 import '../util/util.dart';
 import '../mirror_renamer/mirror_renamer.dart';
-import 'dart_codegen.dart' as dart_codegen;
+import 'logical_rewriter.dart' show LogicalRewriter;
+import 'loop_rewriter.dart' show LoopRewriter;
+import 'copy_propagator.dart' show CopyPropagator;
+import 'statement_rewriter.dart' show StatementRewriter;
+import 'backend_ast_emitter.dart' as backend_ast_emitter;
+import 'backend_ast_nodes.dart' as backend_ast;
+import 'backend_ast_to_frontend_ast.dart' as backend2frontend;
 
 import '../scanner/scannerlib.dart' show StringToken,
                                          Keyword,
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
deleted file mode 100644
index a060b98..0000000
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ /dev/null
@@ -1,2407 +0,0 @@
-// Copyright (c) 2014, 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 dart_tree;
-
-import '../dart2jslib.dart' as dart2js;
-import '../elements/elements.dart';
-import '../universe/universe.dart';
-import '../ir/ir_nodes.dart' as ir;
-import '../dart_types.dart' show DartType, GenericType;
-import '../universe/universe.dart' show Selector;
-import '../ir/const_expression.dart';
-
-// The Tree language is the target of translation out of the CPS-based IR.
-//
-// The translation from CPS to Dart consists of several stages.  Among the
-// stages are translation to direct style, translation out of SSA, eliminating
-// unnecessary names, recognizing high-level control constructs.  Combining
-// these separate concerns is complicated and the constraints of the CPS-based
-// language do not permit a multi-stage translation.
-//
-// For that reason, CPS is translated to the direct-style language Tree.
-// Translation out of SSA, unnaming, and control-flow, as well as 'instruction
-// selection' are performed on the Tree language.
-//
-// In contrast to the CPS-based IR, non-primitive expressions can be named and
-// arguments (to calls, primitives, and blocks) can be arbitrary expressions.
-//
-// Additionally, variables are considered in scope within inner functions;
-// closure variables are thus handled directly instead of using ref cells.
-
-/**
- * The base class of all Tree nodes.
- */
-abstract class Node {
-}
-
-/**
- * The base class of [Expression]s.
- */
-abstract class Expression extends Node {
-  accept(ExpressionVisitor v);
-
-  /// Temporary variable used by [StatementRewriter].
-  /// If set to true, this expression has already had enclosing assignments
-  /// propagated into its variables, and should not be processed again.
-  /// It is only set for expressions that are known to be in risk of redundant
-  /// processing.
-  bool processed = false;
-}
-
-abstract class Statement extends Node {
-  Statement get next;
-  void set next(Statement s);
-  accept(StatementVisitor v);
-}
-
-/**
- * Labels name [LabeledStatement]s.
- */
-class Label {
-  // A counter used to generate names.  The counter is reset to 0 for each
-  // function emitted.
-  static int counter = 0;
-  static String _newName() => 'L${counter++}';
-
-  String cachedName;
-
-  String get name {
-    if (cachedName == null) cachedName = _newName();
-    return cachedName;
-  }
-
-  /// Number of [Break] or [Continue] statements that target this label.
-  /// The [Break] constructor will increment this automatically, but the
-  /// counter must be decremented by hand when a [Break] becomes orphaned.
-  int useCount = 0;
-
-  /// The [LabeledStatement] or [WhileTrue] binding this label.
-  JumpTarget binding;
-}
-
-/**
- * Variables are [Expression]s.
- */
-class Variable extends Expression {
-  /// Function that declares this variable.
-  FunctionDefinition host;
-
-  /// Element used for synthesizing a name for the variable.
-  /// Different variables may have the same element. May be null.
-  Element element;
-
-  int readCount = 0;
-
-  /// Number of places where this variable occurs as:
-  /// - left-hand of an [Assign]
-  /// - left-hand of a [FunctionDeclaration]
-  /// - parameter in a [FunctionDefinition]
-  int writeCount = 0;
-
-  Variable(this.host, this.element) {
-    assert(host != null);
-  }
-
-  accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
-}
-
-/**
- * Common interface for invocations with arguments.
- */
-abstract class Invoke {
-  List<Expression> get arguments;
-  Selector get selector;
-}
-
-/**
- * A call to a static function or getter/setter to a static field.
- *
- * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
- */
-class InvokeStatic extends Expression implements Invoke {
-  final Element target;
-  final List<Expression> arguments;
-  final Selector selector;
-
-  InvokeStatic(this.target, this.selector, this.arguments);
-
-  accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
-}
-
-/**
- * A call to a method, operator, getter, setter or index getter/setter.
- *
- * In contrast to the CPS-based IR, the receiver and arguments can be
- * arbitrary expressions.
- */
-class InvokeMethod extends Expression implements Invoke {
-  Expression receiver;
-  final Selector selector;
-  final List<Expression> arguments;
-
-  InvokeMethod(this.receiver, this.selector, this.arguments) {
-    assert(receiver != null);
-  }
-
-  accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this);
-}
-
-class InvokeSuperMethod extends Expression implements Invoke {
-  final Selector selector;
-  final List<Expression> arguments;
-
-  InvokeSuperMethod(this.selector, this.arguments) ;
-
-  accept(ExpressionVisitor visitor) => visitor.visitInvokeSuperMethod(this);
-}
-
-/**
- * Call to a factory or generative constructor.
- */
-class InvokeConstructor extends Expression implements Invoke {
-  final DartType type;
-  final FunctionElement target;
-  final List<Expression> arguments;
-  final Selector selector;
-  final dart2js.Constant constant;
-
-  InvokeConstructor(this.type, this.target, this.selector, this.arguments,
-      [this.constant]);
-
-  ClassElement get targetClass => target.enclosingElement;
-
-  accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
-}
-
-/// Calls [toString] on each argument and concatenates the results.
-class ConcatenateStrings extends Expression {
-  final List<Expression> arguments;
-  final dart2js.Constant constant;
-
-  ConcatenateStrings(this.arguments, [this.constant]);
-
-  accept(ExpressionVisitor visitor) => visitor.visitConcatenateStrings(this);
-}
-
-/**
- * A constant.
- */
-class Constant extends Expression {
-  final ConstExp expression;
-  final dart2js.Constant value;
-
-  Constant(this.expression, this.value);
-
-  Constant.primitive(dart2js.PrimitiveConstant primitiveValue)
-      : expression = new PrimitiveConstExp(primitiveValue),
-        value = primitiveValue;
-
-  accept(ExpressionVisitor visitor) => visitor.visitConstant(this);
-}
-
-class This extends Expression {
-  accept(ExpressionVisitor visitor) => visitor.visitThis(this);
-}
-
-class ReifyTypeVar extends Expression {
-  TypeVariableElement typeVariable;
-
-  ReifyTypeVar(this.typeVariable);
-
-  accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this);
-}
-
-class LiteralList extends Expression {
-  final GenericType type;
-  final List<Expression> values;
-
-  LiteralList(this.type, this.values);
-
-  accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
-}
-
-class LiteralMap extends Expression {
-  final GenericType type;
-  final List<Expression> keys;
-  final List<Expression> values;
-
-  LiteralMap(this.type, this.keys, this.values);
-
-  accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
-}
-
-class TypeOperator extends Expression {
-  Expression receiver;
-  final DartType type;
-  final String operator;
-
-  TypeOperator(this.receiver, this.type, this.operator) ;
-
-  accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
-}
-
-/// A conditional expression.
-class Conditional extends Expression {
-  Expression condition;
-  Expression thenExpression;
-  Expression elseExpression;
-
-  Conditional(this.condition, this.thenExpression, this.elseExpression);
-
-  accept(ExpressionVisitor visitor) => visitor.visitConditional(this);
-}
-
-/// An && or || expression. The operator is internally represented as a boolean
-/// [isAnd] to simplify rewriting of logical operators.
-class LogicalOperator extends Expression {
-  Expression left;
-  bool isAnd;
-  Expression right;
-
-  LogicalOperator(this.left, this.right, this.isAnd);
-  LogicalOperator.and(this.left, this.right) : isAnd = true;
-  LogicalOperator.or(this.left, this.right) : isAnd = false;
-
-  String get operator => isAnd ? '&&' : '||';
-
-  accept(ExpressionVisitor visitor) => visitor.visitLogicalOperator(this);
-}
-
-/// Logical negation.
-class Not extends Expression {
-  Expression operand;
-
-  Not(this.operand);
-
-  accept(ExpressionVisitor visitor) => visitor.visitNot(this);
-}
-
-class FunctionExpression extends Expression {
-  final FunctionDefinition definition;
-
-  FunctionExpression(this.definition) {
-    assert(definition.element.functionSignature.type.returnType.treatAsDynamic);
-  }
-
-  accept(ExpressionVisitor visitor) => visitor.visitFunctionExpression(this);
-}
-
-/// Declares a local function.
-/// Used for functions that may not occur in expression context due to
-/// being recursive or having a return type.
-/// The [variable] must not occur as the left-hand side of an [Assign] or
-/// any other [FunctionDeclaration].
-class FunctionDeclaration extends Statement {
-  Variable variable;
-  final FunctionDefinition definition;
-  Statement next;
-
-  FunctionDeclaration(this.variable, this.definition, this.next) {
-    ++variable.writeCount;
-  }
-
-  accept(StatementVisitor visitor) => visitor.visitFunctionDeclaration(this);
-}
-
-/// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
-abstract class JumpTarget extends Statement {
-  Label get label;
-  Statement get body;
-}
-
-/**
- * A labeled statement.  Breaks to the label within the labeled statement
- * target the successor statement.
- */
-class LabeledStatement extends JumpTarget {
-  Statement next;
-  final Label label;
-  Statement body;
-
-  LabeledStatement(this.label, this.body, this.next) {
-    assert(label.binding == null);
-    label.binding = this;
-  }
-
-  accept(StatementVisitor visitor) => visitor.visitLabeledStatement(this);
-}
-
-/// A [WhileTrue] or [WhileCondition] loop.
-abstract class Loop extends JumpTarget {
-}
-
-/**
- * A labeled while(true) loop.
- */
-class WhileTrue extends Loop {
-  final Label label;
-  Statement body;
-
-  WhileTrue(this.label, this.body) {
-    assert(label.binding == null);
-    label.binding = this;
-  }
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
-}
-
-/**
- * A while loop with a condition. If the condition is false, control resumes
- * at the [next] statement.
- *
- * It is NOT valid to target this statement with a [Break].
- * The only way to reach [next] is for the condition to evaluate to false.
- *
- * [WhileCondition] statements are introduced in the [LoopRewriter] and is
- * assumed not to occur before then.
- */
-class WhileCondition extends Loop {
-  final Label label;
-  Expression condition;
-  Statement body;
-  Statement next;
-
-  WhileCondition(this.label, this.condition, this.body,
-                 this.next) {
-    assert(label.binding == null);
-    label.binding = this;
-  }
-
-  accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
-}
-
-/// A [Break] or [Continue] statement.
-abstract class Jump extends Statement {
-  Label get target;
-}
-
-/**
- * A break from an enclosing [LabeledStatement].  The break targets the
- * labeled statement's successor statement.
- */
-class Break extends Jump {
-  final Label target;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Break(this.target) {
-    ++target.useCount;
-  }
-
-  accept(StatementVisitor visitor) => visitor.visitBreak(this);
-}
-
-/**
- * A continue to an enclosing [WhileTrue] or [WhileCondition] loop.
- * The continue targets the loop's body.
- */
-class Continue extends Jump {
-  final Label target;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Continue(this.target) {
-    ++target.useCount;
-  }
-
-  accept(StatementVisitor visitor) => visitor.visitContinue(this);
-}
-
-/**
- * An assignments of an [Expression] to a [Variable].
- *
- * In contrast to the CPS-based IR, non-primitive expressions can be assigned
- * to variables.
- */
-class Assign extends Statement {
-  Statement next;
-  Variable variable;
-  Expression definition;
-
-  /// If true, this declares a new copy of the closure variable.
-  /// The consequences are similar to [ir.SetClosureVariable].
-  /// All uses of the variable must be nested inside the [next] statement.
-  bool isDeclaration;
-
-  Assign(this.variable, this.definition, this.next,
-         { this.isDeclaration: false }) {
-    variable.writeCount++;
-  }
-
-  bool get hasExactlyOneUse => variable.readCount == 1;
-
-  accept(StatementVisitor visitor) => visitor.visitAssign(this);
-}
-
-/**
- * A return exit from the function.
- *
- * In contrast to the CPS-based IR, the return value is an arbitrary
- * expression.
- */
-class Return extends Statement {
-  /// Should not be null. Use [Constant] with [NullConstant] for void returns.
-  Expression value;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Return(this.value);
-
-  accept(StatementVisitor visitor) => visitor.visitReturn(this);
-}
-
-/**
- * A conditional branch based on the true value of an [Expression].
- */
-class If extends Statement {
-  Expression condition;
-  Statement thenStatement;
-  Statement elseStatement;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  If(this.condition, this.thenStatement, this.elseStatement);
-
-  accept(StatementVisitor visitor) => visitor.visitIf(this);
-}
-
-class ExpressionStatement extends Statement {
-  Statement next;
-  Expression expression;
-
-  ExpressionStatement(this.expression, this.next);
-
-  accept(StatementVisitor visitor) => visitor.visitExpressionStatement(this);
-}
-
-class FunctionDefinition extends Node {
-  final FunctionElement element;
-  final List<Variable> parameters;
-  Statement body;
-  final List<ConstDeclaration> localConstants;
-  final List<ConstExp> defaultParameterValues;
-
-  FunctionDefinition(this.element, this.parameters, this.body,
-      this.localConstants, this.defaultParameterValues);
-}
-
-abstract class ExpressionVisitor<E> {
-  E visitExpression(Expression e) => e.accept(this);
-  E visitVariable(Variable node);
-  E visitInvokeStatic(InvokeStatic node);
-  E visitInvokeMethod(InvokeMethod node);
-  E visitInvokeSuperMethod(InvokeSuperMethod node);
-  E visitInvokeConstructor(InvokeConstructor node);
-  E visitConcatenateStrings(ConcatenateStrings node);
-  E visitConstant(Constant node);
-  E visitThis(This node);
-  E visitReifyTypeVar(ReifyTypeVar node);
-  E visitConditional(Conditional node);
-  E visitLogicalOperator(LogicalOperator node);
-  E visitNot(Not node);
-  E visitLiteralList(LiteralList node);
-  E visitLiteralMap(LiteralMap node);
-  E visitTypeOperator(TypeOperator node);
-  E visitFunctionExpression(FunctionExpression node);
-}
-
-abstract class StatementVisitor<S> {
-  S visitStatement(Statement s) => s.accept(this);
-  S visitLabeledStatement(LabeledStatement node);
-  S visitAssign(Assign node);
-  S visitReturn(Return node);
-  S visitBreak(Break node);
-  S visitContinue(Continue node);
-  S visitIf(If node);
-  S visitWhileTrue(WhileTrue node);
-  S visitWhileCondition(WhileCondition node);
-  S visitFunctionDeclaration(FunctionDeclaration node);
-  S visitExpressionStatement(ExpressionStatement node);
-}
-
-abstract class Visitor<S,E> implements ExpressionVisitor<E>,
-                                       StatementVisitor<S> {
-   E visitExpression(Expression e) => e.accept(this);
-   S visitStatement(Statement s) => s.accept(this);
-}
-
-class RecursiveVisitor extends Visitor {
-  visitFunctionDefinition(FunctionDefinition node) {
-    visitStatement(node.body);
-  }
-
-  visitVariable(Variable node) {}
-
-  visitInvokeStatic(InvokeStatic node) {
-    node.arguments.forEach(visitExpression);
-  }
-
-  visitInvokeMethod(InvokeMethod node) {
-    visitExpression(node.receiver);
-    node.arguments.forEach(visitExpression);
-  }
-
-  visitInvokeSuperMethod(InvokeSuperMethod node) {
-    node.arguments.forEach(visitExpression);
-  }
-
-  visitInvokeConstructor(InvokeConstructor node) {
-    node.arguments.forEach(visitExpression);
-  }
-
-  visitConcatenateStrings(ConcatenateStrings node) {
-    node.arguments.forEach(visitExpression);
-  }
-
-  visitConstant(Constant node) {}
-
-  visitThis(This node) {}
-
-  visitReifyTypeVar(ReifyTypeVar node) {}
-
-  visitConditional(Conditional node) {
-    visitExpression(node.condition);
-    visitExpression(node.thenExpression);
-    visitExpression(node.elseExpression);
-  }
-
-  visitLogicalOperator(LogicalOperator node) {
-    visitExpression(node.left);
-    visitExpression(node.right);
-  }
-
-  visitNot(Not node) {
-    visitExpression(node.operand);
-  }
-
-  visitLiteralList(LiteralList node) {
-    node.values.forEach(visitExpression);
-  }
-
-  visitLiteralMap(LiteralMap node) {
-    for (int i=0; i<node.keys.length; i++) {
-      visitExpression(node.keys[i]);
-      visitExpression(node.values[i]);
-    }
-  }
-
-  visitTypeOperator(TypeOperator node) {
-    visitExpression(node.receiver);
-  }
-
-  visitFunctionExpression(FunctionExpression node) {
-    visitFunctionDefinition(node.definition);
-  }
-
-  visitLabeledStatement(LabeledStatement node) {
-    visitStatement(node.body);
-    visitStatement(node.next);
-  }
-
-  visitAssign(Assign node) {
-    visitExpression(node.definition);
-    visitVariable(node.variable);
-    visitStatement(node.next);
-  }
-
-  visitReturn(Return node) {
-    visitExpression(node.value);
-  }
-
-  visitBreak(Break node) {}
-
-  visitContinue(Continue node) {}
-
-  visitIf(If node) {
-    visitExpression(node.condition);
-    visitStatement(node.thenStatement);
-    visitStatement(node.elseStatement);
-  }
-
-  visitWhileTrue(WhileTrue node) {
-    visitStatement(node.body);
-  }
-
-  visitWhileCondition(WhileCondition node) {
-    visitExpression(node.condition);
-    visitStatement(node.body);
-    visitStatement(node.next);
-  }
-
-  visitFunctionDeclaration(FunctionDeclaration node) {
-    visitFunctionDefinition(node.definition);
-    visitStatement(node.next);
-  }
-
-  visitExpressionStatement(ExpressionStatement node) {
-    visitExpression(node.expression);
-    visitStatement(node.next);
-  }
-}
-
-/**
- * Builder translates from CPS-based IR to direct-style Tree.
- *
- * A call `Invoke(fun, cont, args)`, where cont is a singly-referenced
- * non-exit continuation `Cont(v, body)` is translated into a direct-style call
- * whose value is bound in the continuation body:
- *
- * `LetVal(v, Invoke(fun, args), body)`
- *
- * and the continuation definition is eliminated.  A similar translation is
- * applied to continuation invocations where the continuation is
- * singly-referenced, though such invocations should not appear in optimized
- * IR.
- *
- * A call `Invoke(fun, cont, args)`, where cont is multiply referenced, is
- * translated into a call followed by a jump with an argument:
- *
- * `Jump L(Invoke(fun, args))`
- *
- * and the continuation is translated into a named block that takes an
- * argument:
- *
- * `LetLabel(L, v, body)`
- *
- * Block arguments are later replaced with data flow during the Tree-to-Tree
- * translation out of SSA.  Jumps are eliminated during the Tree-to-Tree
- * control-flow recognition.
- *
- * Otherwise, the output of Builder looks very much like the input.  In
- * particular, intermediate values and blocks used for local control flow are
- * still all named.
- */
-class Builder extends ir.Visitor<Node> {
-  final dart2js.Compiler compiler;
-
-  /// Maps variable/parameter elements to the Tree variables that represent it.
-  final Map<Element, List<Variable>> element2variables =
-      <Element,List<Variable>>{};
-
-  /// Like [element2variables], except for closure variables. Closure variables
-  /// are not subject to SSA, so at most one variable is used per element.
-  final Map<Element, Variable> element2closure = <Element, Variable>{};
-
-  // Continuations with more than one use are replaced with Tree labels.  This
-  // is the mapping from continuations to labels.
-  final Map<ir.Continuation, Label> labels = <ir.Continuation, Label>{};
-
-  FunctionDefinition function;
-  ir.Continuation returnContinuation;
-
-  Builder parent;
-
-  Builder(this.compiler);
-
-  Builder.inner(Builder parent)
-      : this.parent = parent,
-        compiler = parent.compiler;
-
-  /// Variable used in [buildPhiAssignments] as a temporary when swapping
-  /// variables.
-  Variable phiTempVar;
-
-  Variable getClosureVariable(Element element) {
-    if (element.enclosingElement != function.element) {
-      return parent.getClosureVariable(element);
-    }
-    Variable variable = element2closure[element];
-    if (variable == null) {
-      variable = new Variable(function, element);
-      element2closure[element] = variable;
-    }
-    return variable;
-  }
-
-  /// Obtains the variable representing the given primitive. Returns null for
-  /// primitives that have no reference and do not need a variable.
-  Variable getVariable(ir.Primitive primitive) {
-    if (primitive.registerIndex == null) {
-      return null; // variable is unused
-    }
-    List<Variable> variables = element2variables[primitive.hint];
-    if (variables == null) {
-      variables = <Variable>[];
-      element2variables[primitive.hint] = variables;
-    }
-    while (variables.length <= primitive.registerIndex) {
-      variables.add(new Variable(function, primitive.hint));
-    }
-    return variables[primitive.registerIndex];
-  }
-
-  /// Obtains a reference to the tree Variable corresponding to the IR primitive
-  /// referred to by [reference].
-  /// This increments the reference count for the given variable, so the
-  /// returned expression must be used in the tree.
-  Expression getVariableReference(ir.Reference reference) {
-    Variable variable = getVariable(reference.definition);
-    if (variable == null) {
-      compiler.internalError(
-          compiler.currentElement,
-          "Reference to ${reference.definition} has no register");
-    }
-    ++variable.readCount;
-    return variable;
-  }
-
-  FunctionDefinition build(ir.FunctionDefinition node) {
-    visit(node);
-    return function;
-  }
-
-  List<Expression> translateArguments(List<ir.Reference> args) {
-    return new List<Expression>.generate(args.length,
-         (int index) => getVariableReference(args[index]));
-  }
-
-  List<Variable> translatePhiArguments(List<ir.Reference> args) {
-    return new List<Variable>.generate(args.length,
-         (int index) => getVariableReference(args[index]));
-  }
-
-  Statement buildContinuationAssignment(
-      ir.Parameter parameter,
-      Expression argument,
-      Statement buildRest()) {
-    Variable variable = getVariable(parameter);
-    Statement assignment;
-    if (variable == null) {
-      assignment = new ExpressionStatement(argument, null);
-    } else {
-      assignment = new Assign(variable, argument, null);
-    }
-    assignment.next = buildRest();
-    return assignment;
-  }
-
-  /// Simultaneously assigns each argument to the corresponding parameter,
-  /// then continues at the statement created by [buildRest].
-  Statement buildPhiAssignments(
-      List<ir.Parameter> parameters,
-      List<Variable> arguments,
-      Statement buildRest()) {
-    assert(parameters.length == arguments.length);
-    // We want a parallel assignment to all parameters simultaneously.
-    // Since we do not have parallel assignments in dart_tree, we must linearize
-    // the assignments without attempting to read a previously-overwritten
-    // value. For example {x,y = y,x} cannot be linearized to {x = y; y = x},
-    // for this we must introduce a temporary variable: {t = x; x = y; y = t}.
-
-    // [rightHand] is the inverse of [arguments], that is, it maps variables
-    // to the assignments on which is occurs as the right-hand side.
-    Map<Variable, List<int>> rightHand = <Variable, List<int>>{};
-    for (int i = 0; i < parameters.length; i++) {
-      Variable param = getVariable(parameters[i]);
-      Variable arg = arguments[i];
-      if (param == null || param == arg) {
-        continue; // No assignment necessary.
-      }
-      List<int> list = rightHand[arg];
-      if (list == null) {
-        rightHand[arg] = list = <int>[];
-      }
-      list.add(i);
-    }
-
-    Statement first, current;
-    void addAssignment(Variable dst, Variable src) {
-      if (first == null) {
-        first = current = new Assign(dst, src, null);
-      } else {
-        current = current.next = new Assign(dst, src, null);
-      }
-    }
-
-    List<Variable> assignmentSrc = new List<Variable>(parameters.length);
-    List<bool> done = new List<bool>(parameters.length);
-    void visitAssignment(int i) {
-      if (done[i] == true) {
-        return;
-      }
-      Variable param = getVariable(parameters[i]);
-      Variable arg = arguments[i];
-      if (param == null || param == arg) {
-        return; // No assignment necessary.
-      }
-      if (assignmentSrc[i] != null) {
-        // Cycle found; store argument in a temporary variable.
-        // The temporary will then be used as right-hand side when the
-        // assignment gets added.
-        if (assignmentSrc[i] != phiTempVar) { // Only move to temporary once.
-          assignmentSrc[i] = phiTempVar;
-          addAssignment(phiTempVar, arg);
-        }
-        return;
-      }
-      assignmentSrc[i] = arg;
-      List<int> paramUses = rightHand[param];
-      if (paramUses != null) {
-        for (int useIndex in paramUses) {
-          visitAssignment(useIndex);
-        }
-      }
-      addAssignment(param, assignmentSrc[i]);
-      done[i] = true;
-    }
-
-    for (int i = 0; i < parameters.length; i++) {
-      if (done[i] == null) {
-        visitAssignment(i);
-      }
-    }
-
-    if (first == null) {
-      first = buildRest();
-    } else {
-      current.next = buildRest();
-    }
-    return first;
-  }
-
-  visitNode(ir.Node node) => throw "Unhandled node: $node";
-
-  Expression visitFunctionDefinition(ir.FunctionDefinition node) {
-    List<Variable> parameters = <Variable>[];
-    function = new FunctionDefinition(node.element, parameters,
-        null, node.localConstants, node.defaultParameterValues);
-    returnContinuation = node.returnContinuation;
-    for (ir.Parameter p in node.parameters) {
-      Variable parameter = getVariable(p);
-      assert(parameter != null);
-      ++parameter.writeCount; // Being a parameter counts as a write.
-      parameters.add(parameter);
-    }
-    phiTempVar = new Variable(function, null);
-    function.body = visit(node.body);
-    return null;
-  }
-
-  Statement visitLetPrim(ir.LetPrim node) {
-    Variable variable = getVariable(node.primitive);
-
-    // Don't translate unused primitives.
-    if (variable == null) return visit(node.body);
-
-    Node definition = visit(node.primitive);
-
-    // visitPrimitive returns a Statement without successor if it cannot occur
-    // in expression context (currently only the case for FunctionDeclarations).
-    if (definition is Statement) {
-      definition.next = visit(node.body);
-      return definition;
-    } else {
-      return new Assign(variable, definition, visit(node.body));
-    }
-  }
-
-  Statement visitLetCont(ir.LetCont node) {
-    Label label;
-    if (node.continuation.hasMultipleUses) {
-      label = new Label();
-      labels[node.continuation] = label;
-    }
-    Statement body = visit(node.body);
-    // The continuation's body is not always translated directly here because
-    // it may have been already translated:
-    //   * For singly-used continuations, the continuation's body is
-    //     translated at the site of the continuation invocation.
-    //   * For recursive continuations, there is a single non-recursive
-    //     invocation.  The continuation's body is translated at the site
-    //     of the non-recursive continuation invocation.
-    // See visitInvokeContinuation for the implementation.
-    if (label == null || node.continuation.isRecursive) return body;
-    return new LabeledStatement(label, body, visit(node.continuation.body));
-  }
-
-  Statement visitInvokeStatic(ir.InvokeStatic node) {
-    // Calls are translated to direct style.
-    List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke = new InvokeStatic(node.target, node.selector, arguments);
-    return continueWithExpression(node.continuation, invoke);
-  }
-
-  Statement visitInvokeMethod(ir.InvokeMethod node) {
-    Expression receiver = getVariableReference(node.receiver);
-    List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke = new InvokeMethod(receiver, node.selector, arguments);
-    return continueWithExpression(node.continuation, invoke);
-  }
-
-  Statement visitInvokeSuperMethod(ir.InvokeSuperMethod node) {
-    List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke = new InvokeSuperMethod(node.selector, arguments);
-    return continueWithExpression(node.continuation, invoke);
-  }
-
-  Statement visitConcatenateStrings(ir.ConcatenateStrings node) {
-    List<Expression> arguments = translateArguments(node.arguments);
-    Expression concat = new ConcatenateStrings(arguments);
-    return continueWithExpression(node.continuation, concat);
-  }
-
-  Statement continueWithExpression(ir.Reference continuation,
-                                   Expression expression) {
-    ir.Continuation cont = continuation.definition;
-    if (cont == returnContinuation) {
-      return new Return(expression);
-    } else {
-      assert(cont.hasExactlyOneUse);
-      assert(cont.parameters.length == 1);
-      return buildContinuationAssignment(cont.parameters.single, expression,
-          () => visit(cont.body));
-    }
-  }
-
-  Expression visitGetClosureVariable(ir.GetClosureVariable node) {
-    return getClosureVariable(node.variable);
-  }
-
-  Statement visitSetClosureVariable(ir.SetClosureVariable node) {
-    Variable variable = getClosureVariable(node.variable);
-    Expression value = getVariableReference(node.value);
-    return new Assign(variable, value, visit(node.body),
-                      isDeclaration: node.isDeclaration);
-  }
-
-  Statement visitDeclareFunction(ir.DeclareFunction node) {
-    Variable variable = getClosureVariable(node.variable);
-    FunctionDefinition function = makeSubFunction(node.definition);
-    return new FunctionDeclaration(variable, function, visit(node.body));
-  }
-
-  Statement visitTypeOperator(ir.TypeOperator node) {
-    Expression receiver = getVariableReference(node.receiver);
-    Expression concat = new TypeOperator(receiver, node.type, node.operator);
-    return continueWithExpression(node.continuation, concat);
-  }
-
-  Statement visitInvokeConstructor(ir.InvokeConstructor node) {
-    List<Expression> arguments = translateArguments(node.arguments);
-    Expression invoke =
-        new InvokeConstructor(node.type, node.target, node.selector, arguments);
-    return continueWithExpression(node.continuation, invoke);
-  }
-
-  Statement visitInvokeContinuation(ir.InvokeContinuation node) {
-    // Invocations of the return continuation are translated to returns.
-    // Other continuation invocations are replaced with assignments of the
-    // arguments to formal parameter variables, followed by the body if
-    // the continuation is singly reference or a break if it is multiply
-    // referenced.
-    ir.Continuation cont = node.continuation.definition;
-    if (cont == returnContinuation) {
-      assert(node.arguments.length == 1);
-      return new Return(getVariableReference(node.arguments.single));
-    } else {
-      List<Expression> arguments = translatePhiArguments(node.arguments);
-      return buildPhiAssignments(cont.parameters, arguments,
-          () {
-            // Translate invocations of recursive and non-recursive
-            // continuations differently.
-            //   * Non-recursive continuations
-            //     - If there is one use, translate the continuation body
-            //       inline at the invocation site.
-            //     - If there are multiple uses, translate to Break.
-            //   * Recursive continuations
-            //     - There is a single non-recursive invocation.  Translate
-            //       the continuation body inline as a labeled loop at the
-            //       invocation site.
-            //     - Translate the recursive invocations to Continue.
-            if (cont.isRecursive) {
-              return node.isRecursive
-                  ? new Continue(labels[cont])
-                  : new WhileTrue(labels[cont], visit(cont.body));
-            } else {
-              return cont.hasExactlyOneUse
-                  ? visit(cont.body)
-                  : new Break(labels[cont]);
-            }
-          });
-    }
-  }
-
-  Statement visitBranch(ir.Branch node) {
-    Expression condition = visit(node.condition);
-    Statement thenStatement, elseStatement;
-    ir.Continuation cont = node.trueContinuation.definition;
-    assert(cont.parameters.isEmpty);
-    thenStatement =
-        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
-    cont = node.falseContinuation.definition;
-    assert(cont.parameters.isEmpty);
-    elseStatement =
-        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
-    return new If(condition, thenStatement, elseStatement);
-  }
-
-  Expression visitConstant(ir.Constant node) {
-    return new Constant(node.expression, node.value);
-  }
-
-  Expression visitThis(ir.This node) {
-    return new This();
-  }
-
-  Expression visitReifyTypeVar(ir.ReifyTypeVar node) {
-    return new ReifyTypeVar(node.typeVariable);
-  }
-
-  Expression visitLiteralList(ir.LiteralList node) {
-    return new LiteralList(
-            node.type,
-            translateArguments(node.values));
-  }
-
-  Expression visitLiteralMap(ir.LiteralMap node) {
-    return new LiteralMap(
-        node.type,
-        translateArguments(node.keys),
-        translateArguments(node.values));
-  }
-
-  FunctionDefinition makeSubFunction(ir.FunctionDefinition function) {
-    return new Builder.inner(this).build(function);
-  }
-
-  Node visitCreateFunction(ir.CreateFunction node) {
-    FunctionDefinition def = makeSubFunction(node.definition);
-    FunctionSignature signature = node.definition.element.functionSignature;
-    bool hasReturnType = !signature.type.returnType.treatAsDynamic;
-    if (hasReturnType) {
-      // This function cannot occur in expression context.
-      // The successor will be filled in by visitLetPrim.
-      return new FunctionDeclaration(getVariable(node), def, null);
-    } else {
-      return new FunctionExpression(def);
-    }
-  }
-
-  Expression visitParameter(ir.Parameter node) {
-    // Continuation parameters are not visited (continuations themselves are
-    // not visited yet).
-    compiler.internalError(compiler.currentElement, 'Unexpected IR node.');
-    return null;
-  }
-
-  Expression visitContinuation(ir.Continuation node) {
-    // Until continuations with multiple uses are supported, they are not
-    // visited.
-    compiler.internalError(compiler.currentElement, 'Unexpected IR node.');
-    return null;
-  }
-
-  Expression visitIsTrue(ir.IsTrue node) {
-    return getVariableReference(node.value);
-  }
-}
-
-
-/**
- * Performs the following transformations on the tree:
- * - Assignment propagation
- * - If-to-conditional conversion
- * - Flatten nested ifs
- * - Break inlining
- * - Redirect breaks
- *
- * The above transformations all eliminate statements from the tree, and may
- * introduce redexes of each other.
- *
- *
- * ASSIGNMENT PROPAGATION:
- * Single-use definitions are propagated to their use site when possible.
- * For example:
- *
- *   { v0 = foo(); return v0; }
- *     ==>
- *   return foo()
- *
- * After translating out of CPS, all intermediate values are bound by [Assign].
- * This transformation propagates such definitions to their uses when it is
- * safe and profitable.  Bindings are processed "on demand" when their uses are
- * seen, but are only processed once to keep this transformation linear in
- * the size of the tree.
- *
- * The transformation builds an environment containing [Assign] bindings that
- * are in scope.  These bindings have yet-untranslated definitions.  When a use
- * is encountered the transformation determines if it is safe and profitable
- * to propagate the definition to its use.  If so, it is removed from the
- * environment and the definition is recursively processed (in the
- * new environment at the use site) before being propagated.
- *
- * See [visitVariable] for the implementation of the heuristic for propagating
- * a definition.
- *
- *
- * IF-TO-CONDITIONAL CONVERSION:
- * If-statement are converted to conditional expressions when possible.
- * For example:
- *
- *   if (v0) { v1 = foo(); break L } else { v1 = bar(); break L }
- *     ==>
- *   { v1 = v0 ? foo() : bar(); break L }
- *
- * This can lead to inlining of L, which in turn can lead to further propagation
- * of the variable v1.
- *
- * See [visitIf].
- *
- *
- * FLATTEN NESTED IFS:
- * An if inside an if is converted to an if with a logical operator.
- * For example:
- *
- *   if (E1) { if (E2) {S} else break L } else break L
- *     ==>
- *   if (E1 && E2) {S} else break L
- *
- * This may lead to inlining of L.
- *
- *
- * BREAK INLINING:
- * Single-use labels are inlined at [Break] statements.
- * For example:
- *
- *   L0: { v0 = foo(); break L0 }; return v0;
- *     ==>
- *   v0 = foo(); return v0;
- *
- * This can lead to propagation of v0.
- *
- * See [visitBreak] and [visitLabeledStatement].
- *
- *
- * REDIRECT BREAKS:
- * Labeled statements whose next is a break become flattened and all breaks
- * to their label are redirected.
- * For example, where 'jump' is either break or continue:
- *
- *   L0: {... break L0 ...}; jump L1
- *     ==>
- *   {... jump L1 ...}
- *
- * This may trigger a flattening of nested ifs in case the eliminated label
- * separated two ifs.
- */
-class StatementRewriter extends Visitor<Statement, Expression> {
-  // The binding environment.  The rightmost element of the list is the nearest
-  // available enclosing binding.
-  List<Assign> environment;
-
-  /// Substitution map for labels. Any break to a label L should be substituted
-  /// for a break to L' if L maps to L'.
-  Map<Label, Jump> labelRedirects = <Label, Jump>{};
-
-  /// Returns the redirect target of [label] or [label] itself if it should not
-  /// be redirected.
-  Jump redirect(Jump jump) {
-    Jump newJump = labelRedirects[jump.target];
-    return newJump != null ? newJump : jump;
-  }
-
-  void rewrite(FunctionDefinition definition) {
-    environment = <Assign>[];
-    definition.body = visitStatement(definition.body);
-
-    // TODO(kmillikin):  Allow definitions that are not propagated.  Here,
-    // this means rebuilding the binding with a recursively unnamed definition,
-    // or else introducing a variable definition and an assignment.
-    assert(environment.isEmpty);
-  }
-
-  Expression visitExpression(Expression e) => e.processed ? e : e.accept(this);
-
-  Expression visitVariable(Variable node) {
-    // Propagate a variable's definition to its use site if:
-    // 1.  It has a single use, to avoid code growth and potential duplication
-    //     of side effects, AND
-    // 2.  It was the most recent expression evaluated so that we do not
-    //     reorder expressions with side effects.
-    if (!environment.isEmpty &&
-        environment.last.variable == node &&
-        environment.last.hasExactlyOneUse) {
-      return visitExpression(environment.removeLast().definition);
-    }
-    // If the definition could not be propagated, leave the variable use.
-    return node;
-  }
-
-
-  Statement visitAssign(Assign node) {
-    environment.add(node);
-    Statement next = visitStatement(node.next);
-
-    if (!environment.isEmpty && environment.last == node) {
-      // The definition could not be propagated.  Residualize the let binding.
-      node.next = next;
-      environment.removeLast();
-      node.definition = visitExpression(node.definition);
-      return node;
-    }
-    assert(!environment.contains(node));
-    return next;
-  }
-
-  Expression visitInvokeStatic(InvokeStatic node) {
-    // Process arguments right-to-left, the opposite of evaluation order.
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    return node;
-  }
-
-  Expression visitInvokeMethod(InvokeMethod node) {
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    node.receiver = visitExpression(node.receiver);
-    return node;
-  }
-
-  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    return node;
-  }
-
-  Expression visitInvokeConstructor(InvokeConstructor node) {
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    return node;
-  }
-
-  Expression visitConcatenateStrings(ConcatenateStrings node) {
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    return node;
-  }
-
-  Expression visitConditional(Conditional node) {
-    node.condition = visitExpression(node.condition);
-
-    List<Assign> savedEnvironment = environment;
-    environment = <Assign>[];
-    node.thenExpression = visitExpression(node.thenExpression);
-    assert(environment.isEmpty);
-    node.elseExpression = visitExpression(node.elseExpression);
-    assert(environment.isEmpty);
-    environment = savedEnvironment;
-
-    return node;
-  }
-
-  Expression visitLogicalOperator(LogicalOperator node) {
-    node.left = visitExpression(node.left);
-
-    environment.add(null); // impure expressions may not propagate across branch
-    node.right = visitExpression(node.right);
-    environment.removeLast();
-
-    return node;
-  }
-
-  Expression visitNot(Not node) {
-    node.operand = visitExpression(node.operand);
-    return node;
-  }
-
-  Expression visitFunctionExpression(FunctionExpression node) {
-    new StatementRewriter().rewrite(node.definition);
-    return node;
-  }
-
-  Statement visitFunctionDeclaration(FunctionDeclaration node) {
-    new StatementRewriter().rewrite(node.definition);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitReturn(Return node) {
-    node.value = visitExpression(node.value);
-    return node;
-  }
-
-
-  Statement visitBreak(Break node) {
-    // Redirect through chain of breaks.
-    // Note that useCount was accounted for at visitLabeledStatement.
-    // Note redirect may return either a Break or Continue statement.
-    Jump jump = redirect(node);
-    if (jump is Break && jump.target.useCount == 1) {
-      --jump.target.useCount;
-      return visitStatement(jump.target.binding.next);
-    }
-    return jump;
-  }
-
-  Statement visitContinue(Continue node) {
-    return node;
-  }
-
-  Statement visitLabeledStatement(LabeledStatement node) {
-    if (node.next is Jump) {
-      // Eliminate label if next is a break or continue statement
-      // Breaks to this label are redirected to the outer label.
-      // Note that breakCount for the two labels is updated proactively here
-      // so breaks can reliably tell if they should inline their target.
-      Jump next = node.next;
-      Jump newJump = redirect(next);
-      labelRedirects[node.label] = newJump;
-      newJump.target.useCount += node.label.useCount - 1;
-      node.label.useCount = 0;
-      Statement result = visitStatement(node.body);
-      labelRedirects.remove(node.label); // Save some space.
-      return result;
-    }
-
-    node.body = visitStatement(node.body);
-
-    if (node.label.useCount == 0) {
-      // Eliminate the label if next was inlined at a break
-      return node.body;
-    }
-
-    // Do not propagate assignments into the successor statements, since they
-    // may be overwritten by assignments in the body.
-    List<Assign> savedEnvironment = environment;
-    environment = <Assign>[];
-    node.next = visitStatement(node.next);
-    environment = savedEnvironment;
-
-    return node;
-  }
-
-  Statement visitIf(If node) {
-    node.condition = visitExpression(node.condition);
-
-    // Do not propagate assignments into branches.  Doing so will lead to code
-    // duplication.
-    // TODO(kmillikin): Rethink this.  Propagating some assignments (e.g.,
-    // constants or variables) is benign.  If they can occur here, they should
-    // be handled well.
-    List<Assign> savedEnvironment = environment;
-    environment = <Assign>[];
-    node.thenStatement = visitStatement(node.thenStatement);
-    assert(environment.isEmpty);
-    node.elseStatement = visitStatement(node.elseStatement);
-    assert(environment.isEmpty);
-    environment = savedEnvironment;
-
-    tryCollapseIf(node);
-
-    Statement reduced = combineStatementsWithSubexpressions(
-        node.thenStatement,
-        node.elseStatement,
-        (t,f) => new Conditional(node.condition, t, f)..processed = true);
-    if (reduced != null) {
-      if (reduced.next is Break) {
-        // In case the break can now be inlined.
-        reduced = visitStatement(reduced);
-      }
-      return reduced;
-    }
-
-    return node;
-  }
-
-  Statement visitWhileTrue(WhileTrue node) {
-    // Do not propagate assignments into loops.  Doing so is not safe for
-    // variables modified in the loop (the initial value will be propagated).
-    List<Assign> savedEnvironment = environment;
-    environment = <Assign>[];
-    node.body = visitStatement(node.body);
-    assert(environment.isEmpty);
-    environment = savedEnvironment;
-    return node;
-  }
-
-  Statement visitWhileCondition(WhileCondition node) {
-    // Not introduced yet
-    throw "Unexpected WhileCondition in StatementRewriter";
-  }
-
-  Expression visitConstant(Constant node) {
-    return node;
-  }
-
-  Expression visitThis(This node) {
-    return node;
-  }
-
-  Expression visitReifyTypeVar(ReifyTypeVar node) {
-    return node;
-  }
-
-  Expression visitLiteralList(LiteralList node) {
-    // Process values right-to-left, the opposite of evaluation order.
-    for (int i = node.values.length - 1; i >= 0; --i) {
-      node.values[i] = visitExpression(node.values[i]);
-    }
-    return node;
-  }
-
-  Expression visitLiteralMap(LiteralMap node) {
-    // Process arguments right-to-left, the opposite of evaluation order.
-    for (int i = node.values.length - 1; i >= 0; --i) {
-      node.values[i] = visitExpression(node.values[i]);
-      node.keys[i] = visitExpression(node.keys[i]);
-    }
-    return node;
-  }
-
-  Expression visitTypeOperator(TypeOperator node) {
-    node.receiver = visitExpression(node.receiver);
-    return node;
-  }
-
-  Statement visitExpressionStatement(ExpressionStatement node) {
-    node.expression = visitExpression(node.expression);
-    // Do not allow propagation of assignments past an expression evaluated
-    // for its side effects because it risks reordering side effects.
-    // TODO(kmillikin): Rethink this.  Some propagation is benign, e.g.,
-    // constants, variables, or other pure values that are not destroyed by
-    // the expression statement.  If they can occur here they should be
-    // handled well.
-    List<Assign> savedEnvironment = environment;
-    environment = <Assign>[];
-    node.next = visitStatement(node.next);
-    assert(environment.isEmpty);
-    environment = savedEnvironment;
-    return node;
-  }
-
-  /// If [s] and [t] are similar statements we extract their subexpressions
-  /// and returns a new statement of the same type using expressions combined
-  /// with the [combine] callback. For example:
-  ///
-  ///   combineStatements(Return E1, Return E2) = Return combine(E1, E2)
-  ///
-  /// If [combine] returns E1 then the unified statement is equivalent to [s],
-  /// and if [combine] returns E2 the unified statement is equivalence to [t].
-  ///
-  /// It is guaranteed that no side effects occur between the beginning of the
-  /// statement and the position of the combined expression.
-  ///
-  /// Returns null if the statements are too different.
-  ///
-  /// If non-null is returned, the caller MUST discard [s] and [t] and use
-  /// the returned statement instead.
-  static Statement combineStatementsWithSubexpressions(
-      Statement s,
-      Statement t,
-      Expression combine(Expression s, Expression t)) {
-    if (s is Return && t is Return) {
-      return new Return(combine(s.value, t.value));
-    }
-    if (s is Assign && t is Assign && s.variable == t.variable) {
-      Statement next = combineStatements(s.next, t.next);
-      if (next != null) {
-        --t.variable.writeCount; // Two assignments become one.
-        return new Assign(s.variable,
-                          combine(s.definition, t.definition),
-                          next);
-      }
-    }
-    if (s is ExpressionStatement && t is ExpressionStatement) {
-      Statement next = combineStatements(s.next, t.next);
-      if (next != null) {
-        return new ExpressionStatement(combine(s.expression, t.expression),
-                                       next);
-      }
-    }
-    return null;
-  }
-
-  /// Returns a statement equivalent to both [s] and [t], or null if [s] and
-  /// [t] are incompatible.
-  /// If non-null is returned, the caller MUST discard [s] and [t] and use
-  /// the returned statement instead.
-  /// If two breaks are combined, the label's break counter will be decremented.
-  static Statement combineStatements(Statement s, Statement t) {
-    if (s is Break && t is Break && s.target == t.target) {
-      --t.target.useCount; // Two breaks become one.
-      return s;
-    }
-    if (s is Continue && t is Continue && s.target == t.target) {
-      --t.target.useCount; // Two continues become one.
-      return s;
-    }
-    if (s is Return && t is Return) {
-      Expression e = combineExpressions(s.value, t.value);
-      if (e != null) {
-        return new Return(e);
-      }
-    }
-    return null;
-  }
-
-  /// Returns an expression equivalent to both [e1] and [e2].
-  /// If non-null is returned, the caller must discard [e1] and [e2] and use
-  /// the resulting expression in the tree.
-  static Expression combineExpressions(Expression e1, Expression e2) {
-    if (e1 is Variable && e1 == e2) {
-      --e1.readCount; // Two references become one.
-      return e1;
-    }
-    if (e1 is Constant && e2 is Constant && e1.value == e2.value) {
-      return e1;
-    }
-    return null;
-  }
-
-  /// Try to collapse nested ifs using && and || expressions.
-  /// For example:
-  ///
-  ///   if (E1) { if (E2) S else break L } else break L
-  ///     ==>
-  ///   if (E1 && E2) S else break L
-  ///
-  /// [branch1] and [branch2] control the position of the S statement.
-  ///
-  /// Returns true if another collapse redex might have been introduced.
-  void tryCollapseIf(If node) {
-    // Repeatedly try to collapse nested ifs.
-    // The transformation is shrinking (destroys an if) so it remains linear.
-    // Here is an example where more than one iteration is required:
-    //
-    //   if (E1)
-    //     if (E2) break L2 else break L1
-    //   else
-    //     break L1
-    //
-    // L1.target ::=
-    //   if (E3) S else break L2
-    //
-    // After first collapse:
-    //
-    //   if (E1 && E2)
-    //     break L2
-    //   else
-    //     {if (E3) S else break L2}  (inlined from break L1)
-    //
-    // We can then do another collapse using the inlined nested if.
-    bool changed = true;
-    while (changed) {
-      changed = false;
-      if (tryCollapseIfAux(node, true, true)) {
-        changed = true;
-      }
-      if (tryCollapseIfAux(node, true, false)) {
-        changed = true;
-      }
-      if (tryCollapseIfAux(node, false, true)) {
-        changed = true;
-      }
-      if (tryCollapseIfAux(node, false, false)) {
-        changed = true;
-      }
-    }
-  }
-
-  bool tryCollapseIfAux(If outerIf, bool branch1, bool branch2) {
-    // NOTE: We name variables here as if S is in the then-then position.
-    Statement outerThen = getBranch(outerIf, branch1);
-    Statement outerElse = getBranch(outerIf, !branch1);
-    if (outerThen is If && outerElse is Break) {
-      If innerIf = outerThen;
-      Statement innerThen = getBranch(innerIf, branch2);
-      Statement innerElse = getBranch(innerIf, !branch2);
-      if (innerElse is Break && innerElse.target == outerElse.target) {
-        // We always put S in the then branch of the result, and adjust the
-        // condition expression if S was actually found in the else branch(es).
-        outerIf.condition = new LogicalOperator.and(
-            makeCondition(outerIf.condition, branch1),
-            makeCondition(innerIf.condition, branch2));
-        outerIf.thenStatement = innerThen;
-        --innerElse.target.useCount;
-
-        // Try to inline the remaining break.  Do not propagate assignments.
-        List<Assign> savedEnvironment = environment;
-        environment = <Assign>[];
-        outerIf.elseStatement = visitStatement(outerElse);
-        assert(environment.isEmpty);
-        environment = savedEnvironment;
-
-        return outerIf.elseStatement is If && innerThen is Break;
-      }
-    }
-    return false;
-  }
-
-  Expression makeCondition(Expression e, bool polarity) {
-    return polarity ? e : new Not(e);
-  }
-
-  Statement getBranch(If node, bool polarity) {
-    return polarity ? node.thenStatement : node.elseStatement;
-  }
-}
-
-/// Eliminates moving assignments, such as w := v, by assigning directly to w
-/// at the definition of v.
-///
-/// This compensates for suboptimal register allocation, and merges closure
-/// variables with local temporaries that were left behind when translating
-/// out of CPS (where closure variables live in a separate space).
-class CopyPropagator extends RecursiveVisitor {
-
-  /// After visitStatement returns, [move] maps a variable v to an
-  /// assignment A of form w := v, under the following conditions:
-  /// - there are no uses of w before A
-  /// - A is the only use of v
-  Map<Variable, Assign> move = <Variable, Assign>{};
-
-  /// Like [move], except w is the key instead of v.
-  Map<Variable, Assign> inverseMove = <Variable, Assign>{};
-
-  /// The function currently being rewritten.
-  FunctionElement functionElement;
-
-  void rewrite(FunctionDefinition function) {
-    functionElement = function.element;
-    visitFunctionDefinition(function);
-  }
-
-  void visitFunctionDefinition(FunctionDefinition function) {
-    assert(functionElement == function.element);
-    function.body = visitStatement(function.body);
-
-    // Try to propagate moving assignments into function parameters.
-    // For example:
-    // foo(x) {
-    //   var v1 = x;
-    //   BODY
-    // }
-    //   ==>
-    // foo(v1) {
-    //   BODY
-    // }
-
-    // Variables must not occur more than once in the parameter list, so
-    // invalidate all moving assignments that would propagate a parameter
-    // into another parameter. For example:
-    // foo(x,y) {
-    //   y = x;
-    //   BODY
-    // }
-    // Cannot declare function as foo(x,x)!
-    function.parameters.forEach(visitVariable);
-
-    // Now do the propagation.
-    for (int i=0; i<function.parameters.length; i++) {
-      Variable param = function.parameters[i];
-      Variable replacement = copyPropagateVariable(param);
-      replacement.element = param.element; // Preserve parameter name.
-      function.parameters[i] = replacement;
-    }
-  }
-
-  Statement visitBasicBlock(Statement node) {
-    node = visitStatement(node);
-    move.clear();
-    inverseMove.clear();
-    return node;
-  }
-
-  void visitVariable(Variable variable) {
-    // We have found a use of w.
-    // Remove assignments of form w := v from the move maps.
-    Assign movingAssignment = inverseMove.remove(variable);
-    if (movingAssignment != null) {
-      move.remove(movingAssignment.definition);
-    }
-  }
-
-  /**
-   * Called when a definition of [v] is encountered.
-   * Attempts to propagate the assignment through a moving assignment.
-   * Returns the variable to be assigned into, defaulting to [v] itself if
-   * no optimization could be performed.
-   */
-  Variable copyPropagateVariable(Variable v) {
-    Assign movingAssign = move[v];
-    if (movingAssign != null) {
-      // We found the pattern:
-      //   v := EXPR
-      //   BLOCK   (does not use w)
-      //   w := v  (only use of v)
-      //
-      // Rewrite to:
-      //   w := EXPR
-      //   BLOCK
-      //   w := w  (to be removed later)
-      Variable w = movingAssign.variable;
-
-      // Make w := w.
-      // We can't remove the statement from here because we don't have
-      // parent pointers. So just make it a no-op so it can be removed later.
-      movingAssign.definition = w;
-
-      // The intermediate variable 'v' should now be orphaned, so don't bother
-      // updating its read/write counters.
-      // Due to the nop trick, the variable 'w' now has one additional read
-      // and write.
-      ++w.writeCount;
-      ++w.readCount;
-
-      // Make w := EXPR
-      return w;
-    }
-    return v;
-  }
-
-  Statement visitAssign(Assign node) {
-    node.next = visitStatement(node.next);
-    node.variable = copyPropagateVariable(node.variable);
-    visitExpression(node.definition);
-    visitVariable(node.variable);
-
-    // If this is a moving assignment w := v, with this being the only use of v,
-    // try to propagate it backwards.  Do not propagate assignments where w
-    // is from an outer function scope.
-    if (node.definition is Variable) {
-      Variable def = node.definition;
-      if (def.readCount == 1 &&
-          node.variable.host.element == functionElement) {
-        move[node.definition] = node;
-        inverseMove[node.variable] = node;
-      }
-    }
-
-    return node;
-  }
-
-  Statement visitLabeledStatement(LabeledStatement node) {
-    node.next = visitBasicBlock(node.next);
-    node.body = visitStatement(node.body);
-    return node;
-  }
-
-  Statement visitReturn(Return node) {
-    visitExpression(node.value);
-    return node;
-  }
-
-  Statement visitBreak(Break node) {
-    return node;
-  }
-
-  Statement visitContinue(Continue node) {
-    return node;
-  }
-
-  Statement visitIf(If node) {
-    visitExpression(node.condition);
-    node.thenStatement = visitBasicBlock(node.thenStatement);
-    node.elseStatement = visitBasicBlock(node.elseStatement);
-    return node;
-  }
-
-  Statement visitWhileTrue(WhileTrue node) {
-    node.body = visitBasicBlock(node.body);
-    return node;
-  }
-
-  Statement visitWhileCondition(WhileCondition node) {
-    throw "WhileCondition before LoopRewriter";
-  }
-
-  Statement visitFunctionDeclaration(FunctionDeclaration node) {
-    new CopyPropagator().rewrite(node.definition);
-    node.next = visitStatement(node.next);
-    node.variable = copyPropagateVariable(node.variable);
-    return node;
-  }
-
-  Statement visitExpressionStatement(ExpressionStatement node) {
-    node.next = visitStatement(node.next);
-    visitExpression(node.expression);
-    return node;
-  }
-
-  void visitFunctionExpression(FunctionExpression node) {
-    new CopyPropagator().rewrite(node.definition);
-  }
-
-}
-
-/// Rewrites [WhileTrue] statements with an [If] body into a [WhileCondition],
-/// in situations where only one of the branches contains a [Continue] to the
-/// loop. Schematically:
-///
-///   L:
-///   while (true) {
-///     if (E) {
-///       S1  (has references to L)
-///     } else {
-///       S2  (has no references to L)
-///     }
-///   }
-///     ==>
-///   L:
-///   while (E) {
-///     S1
-///   };
-///   S2
-///
-/// A similar transformation is used when S2 occurs in the 'then' position.
-///
-/// Note that the above pattern needs no iteration since nested ifs
-/// have been collapsed previously in the [StatementRewriter] phase.
-class LoopRewriter extends RecursiveVisitor {
-
-  Set<Label> usedContinueLabels = new Set<Label>();
-
-  void rewrite(FunctionDefinition function) {
-    function.body = visitStatement(function.body);
-  }
-
-  Statement visitLabeledStatement(LabeledStatement node) {
-    node.body = visitStatement(node.body);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitAssign(Assign node) {
-    // Clean up redundant assignments left behind in the previous phase.
-    if (node.variable == node.definition) {
-      --node.variable.readCount;
-      --node.variable.writeCount;
-      return visitStatement(node.next);
-    }
-    visitExpression(node.definition);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitReturn(Return node) {
-    visitExpression(node.value);
-    return node;
-  }
-
-  Statement visitBreak(Break node) {
-    return node;
-  }
-
-  Statement visitContinue(Continue node) {
-    usedContinueLabels.add(node.target);
-    return node;
-  }
-
-  Statement visitIf(If node) {
-    visitExpression(node.condition);
-    node.thenStatement = visitStatement(node.thenStatement);
-    node.elseStatement = visitStatement(node.elseStatement);
-    return node;
-  }
-
-  Statement visitWhileTrue(WhileTrue node) {
-    assert(!usedContinueLabels.contains(node.label));
-    if (node.body is If) {
-      If body = node.body;
-      body.thenStatement = visitStatement(body.thenStatement);
-      bool thenHasContinue = usedContinueLabels.remove(node.label);
-      body.elseStatement = visitStatement(body.elseStatement);
-      bool elseHasContinue = usedContinueLabels.remove(node.label);
-      if (thenHasContinue && !elseHasContinue) {
-        node.label.binding = null; // Prepare to rebind the label.
-        return new WhileCondition(
-            node.label,
-            body.condition,
-            body.thenStatement,
-            body.elseStatement);
-      } else if (!thenHasContinue && elseHasContinue) {
-        node.label.binding = null;
-        return new WhileCondition(
-            node.label,
-            new Not(body.condition),
-            body.elseStatement,
-            body.thenStatement);
-      }
-    } else {
-      node.body = visitStatement(node.body);
-      usedContinueLabels.remove(node.label);
-    }
-    return node;
-  }
-
-  Statement visitWhileCondition(WhileCondition node) {
-    // Note: not reachable but the implementation is trivial
-    visitExpression(node.condition);
-    node.body = visitStatement(node.body);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitExpressionStatement(ExpressionStatement node) {
-    visitExpression(node.expression);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitFunctionDeclaration(FunctionDeclaration node) {
-    new LoopRewriter().rewrite(node.definition);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  void visitFunctionExpression(FunctionExpression node) {
-    new LoopRewriter().rewrite(node.definition);
-  }
-
-}
-
-
-/// Rewrites logical expressions to be more compact.
-///
-/// In this class an expression is said to occur in "boolean context" if
-/// its result is immediately applied to boolean conversion.
-///
-/// IF STATEMENTS:
-///
-/// We apply the following two rules to [If] statements (see [visitIf]).
-///
-///   if (E) {} else S  ==>  if (!E) S else {}    (else can be omitted)
-///   if (!E) S1 else S2  ==>  if (E) S2 else S1  (unless previous rule applied)
-///
-/// NEGATION:
-///
-/// De Morgan's Laws are used to rewrite negations of logical operators so
-/// negations are closer to the root:
-///
-///   !x && !y  -->  !(x || y)
-///
-/// This is to enable other rewrites, such as branch swapping in an if. In some
-/// contexts, the rule is reversed because we do not expect to apply a rewrite
-/// rule to the result. For example:
-///
-///   z = !(x || y)  ==>  z = !x && !y;
-///
-/// CONDITIONALS:
-///
-/// Conditionals with boolean constant operands occur frequently in the input.
-/// They can often the re-written to logical operators, for instance:
-///
-///   if (x ? y : false) S1 else S2
-///     ==>
-///   if (x && y) S1 else S2
-///
-/// Conditionals are tricky to rewrite when they occur out of boolean context.
-/// Here we must apply more conservative rules, such as:
-///
-///   x ? true : false  ==>  !!x
-///
-/// If an operand is known to be a boolean, we can introduce a logical operator:
-///
-///   x ? y : false  ==>  x && y   (if y is known to be a boolean)
-///
-/// The following sequence of rewrites demonstrates the merit of these rules:
-///
-///   x ? (y ? true : false) : false
-///   x ? !!y : false   (double negation introduced by [toBoolean])
-///   x && !!y          (!!y validated by [isBooleanValued])
-///   x && y            (double negation removed by [putInBooleanContext])
-///
-class LogicalRewriter extends Visitor<Statement, Expression> {
-
-  /// Statement to be executed next by natural fallthrough. Although fallthrough
-  /// is not introduced in this phase, we need to reason about fallthrough when
-  /// evaluating the benefit of swapping the branches of an [If].
-  Statement fallthrough;
-
-  void rewrite(FunctionDefinition definition) {
-    definition.body = visitStatement(definition.body);
-  }
-
-  Statement visitLabeledStatement(LabeledStatement node) {
-    Statement savedFallthrough = fallthrough;
-    fallthrough = node.next;
-    node.body = visitStatement(node.body);
-    fallthrough = savedFallthrough;
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitAssign(Assign node) {
-    node.definition = visitExpression(node.definition);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitReturn(Return node) {
-    node.value = visitExpression(node.value);
-    return node;
-  }
-
-  Statement visitBreak(Break node) {
-    return node;
-  }
-
-  Statement visitContinue(Continue node) {
-    return node;
-  }
-
-  bool isFallthroughBreak(Statement node) {
-    return node is Break && node.target.binding.next == fallthrough;
-  }
-
-  Statement visitIf(If node) {
-    // If one of the branches is empty (i.e. just a fallthrough), then that
-    // branch should preferrably be the 'else' so we won't have to print it.
-    // In other words, we wish to perform this rewrite:
-    //   if (E) {} else {S}
-    //     ==>
-    //   if (!E) {S}
-    // In the tree language, empty statements do not exist yet, so we must check
-    // if one branch contains a break that can be eliminated by fallthrough.
-
-    // Swap branches if then is a fallthrough break.
-    if (isFallthroughBreak(node.thenStatement)) {
-      node.condition = new Not(node.condition);
-      Statement tmp = node.thenStatement;
-      node.thenStatement = node.elseStatement;
-      node.elseStatement = tmp;
-    }
-
-    // Can the else part be eliminated?
-    // (Either due to the above swap or if the break was already there).
-    bool emptyElse = isFallthroughBreak(node.elseStatement);
-
-    node.condition = makeCondition(node.condition, true, liftNots: !emptyElse);
-    node.thenStatement = visitStatement(node.thenStatement);
-    node.elseStatement = visitStatement(node.elseStatement);
-
-    // If neither branch is empty, eliminate a negation in the condition
-    // if (!E) S1 else S2
-    //   ==>
-    // if (E) S2 else S1
-    if (!emptyElse && node.condition is Not) {
-      node.condition = (node.condition as Not).operand;
-      Statement tmp = node.thenStatement;
-      node.thenStatement = node.elseStatement;
-      node.elseStatement = tmp;
-    }
-
-    return node;
-  }
-
-  Statement visitWhileTrue(WhileTrue node) {
-    node.body = visitStatement(node.body);
-    return node;
-  }
-
-  Statement visitWhileCondition(WhileCondition node) {
-    node.condition = makeCondition(node.condition, true, liftNots: false);
-    node.body = visitStatement(node.body);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Statement visitExpressionStatement(ExpressionStatement node) {
-    node.expression = visitExpression(node.expression);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-
-  Expression visitVariable(Variable node) {
-    return node;
-  }
-
-  Expression visitInvokeStatic(InvokeStatic node) {
-    _rewriteList(node.arguments);
-    return node;
-  }
-
-  Expression visitInvokeMethod(InvokeMethod node) {
-    node.receiver = visitExpression(node.receiver);
-    _rewriteList(node.arguments);
-    return node;
-  }
-
-  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
-    _rewriteList(node.arguments);
-    return node;
-  }
-
-  Expression visitInvokeConstructor(InvokeConstructor node) {
-    _rewriteList(node.arguments);
-    return node;
-  }
-
-  Expression visitConcatenateStrings(ConcatenateStrings node) {
-    _rewriteList(node.arguments);
-    return node;
-  }
-
-  Expression visitLiteralList(LiteralList node) {
-    _rewriteList(node.values);
-    return node;
-  }
-
-  Expression visitLiteralMap(LiteralMap node) {
-    _rewriteList(node.keys);
-    _rewriteList(node.values);
-    return node;
-  }
-
-  Expression visitTypeOperator(TypeOperator node) {
-    node.receiver = visitExpression(node.receiver);
-    return node;
-  }
-
-  Expression visitConstant(Constant node) {
-    return node;
-  }
-
-  Expression visitThis(This node) {
-    return node;
-  }
-
-  Expression visitReifyTypeVar(ReifyTypeVar node) {
-    return node;
-  }
-
-  Expression visitFunctionExpression(FunctionExpression node) {
-    new LogicalRewriter().rewrite(node.definition);
-    return node;
-  }
-
-  Statement visitFunctionDeclaration(FunctionDeclaration node) {
-    new LogicalRewriter().rewrite(node.definition);
-    node.next = visitStatement(node.next);
-    return node;
-  }
-
-  Expression visitNot(Not node) {
-    return toBoolean(makeCondition(node.operand, false, liftNots: false));
-  }
-
-  Expression visitConditional(Conditional node) {
-    // node.condition will be visited after the then and else parts, because its
-    // polarity depends on what rewrite we use.
-    node.thenExpression = visitExpression(node.thenExpression);
-    node.elseExpression = visitExpression(node.elseExpression);
-
-    // In the following, we must take care not to eliminate or introduce a
-    // boolean conversion.
-
-    // x ? true : false --> !!x
-    if (isTrue(node.thenExpression) && isFalse(node.elseExpression)) {
-      return toBoolean(makeCondition(node.condition, true, liftNots: false));
-    }
-    // x ? false : true --> !x
-    if (isFalse(node.thenExpression) && isTrue(node.elseExpression)) {
-      return toBoolean(makeCondition(node.condition, false, liftNots: false));
-    }
-
-    // x ? y : false ==> x && y  (if y is known to be a boolean)
-    if (isBooleanValued(node.thenExpression) && isFalse(node.elseExpression)) {
-      return new LogicalOperator.and(
-          makeCondition(node.condition, true, liftNots:false),
-          putInBooleanContext(node.thenExpression));
-    }
-    // x ? y : true ==> !x || y  (if y is known to be a boolean)
-    if (isBooleanValued(node.thenExpression) && isTrue(node.elseExpression)) {
-      return new LogicalOperator.or(
-          makeCondition(node.condition, false, liftNots: false),
-          putInBooleanContext(node.thenExpression));
-    }
-    // x ? true : y ==> x || y  (if y if known to be boolean)
-    if (isBooleanValued(node.elseExpression) && isTrue(node.thenExpression)) {
-      return new LogicalOperator.or(
-          makeCondition(node.condition, true, liftNots: false),
-          putInBooleanContext(node.elseExpression));
-    }
-    // x ? false : y ==> !x && y  (if y is known to be a boolean)
-    if (isBooleanValued(node.elseExpression) && isFalse(node.thenExpression)) {
-      return new LogicalOperator.and(
-          makeCondition(node.condition, false, liftNots: false),
-          putInBooleanContext(node.elseExpression));
-    }
-
-    node.condition = makeCondition(node.condition, true);
-
-    // !x ? y : z ==> x ? z : y
-    if (node.condition is Not) {
-      node.condition = (node.condition as Not).operand;
-      Expression tmp = node.thenExpression;
-      node.thenExpression = node.elseExpression;
-      node.elseExpression = tmp;
-    }
-
-    return node;
-  }
-
-  Expression visitLogicalOperator(LogicalOperator node) {
-    node.left = makeCondition(node.left, true);
-    node.right = makeCondition(node.right, true);
-    return node;
-  }
-
-  /// True if the given expression is known to evaluate to a boolean.
-  /// This will not recursively traverse [Conditional] expressions, but if
-  /// applied to the result of [visitExpression] conditionals will have been
-  /// rewritten anyway.
-  bool isBooleanValued(Expression e) {
-    return isTrue(e) || isFalse(e) || e is Not || e is LogicalOperator;
-  }
-
-  /// Rewrite an expression that was originally processed in a non-boolean
-  /// context.
-  Expression putInBooleanContext(Expression e) {
-    if (e is Not && e.operand is Not) {
-      return (e.operand as Not).operand;
-    } else {
-      return e;
-    }
-  }
-
-  /// Forces a boolean conversion of the given expression.
-  Expression toBoolean(Expression e) {
-    if (isBooleanValued(e))
-      return e;
-    else
-      return new Not(new Not(e));
-  }
-
-  /// Creates an equivalent boolean expression. The expression must occur in a
-  /// context where its result is immediately subject to boolean conversion.
-  /// If [polarity] if false, the negated condition will be created instead.
-  /// If [liftNots] is true (default) then Not expressions will be lifted toward
-  /// the root the condition so they can be eliminated by the caller.
-  Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
-    if (e is Not) {
-      // !!E ==> E
-      return makeCondition(e.operand, !polarity, liftNots: liftNots);
-    }
-    if (e is LogicalOperator) {
-      // If polarity=false, then apply the rewrite !(x && y) ==> !x || !y
-      e.left = makeCondition(e.left, polarity);
-      e.right = makeCondition(e.right, polarity);
-      if (!polarity) {
-        e.isAnd = !e.isAnd;
-      }
-      // !x && !y ==> !(x || y)  (only if lifting nots)
-      if (e.left is Not && e.right is Not && liftNots) {
-        e.left = (e.left as Not).operand;
-        e.right = (e.right as Not).operand;
-        e.isAnd = !e.isAnd;
-        return new Not(e);
-      }
-      return e;
-    }
-    if (e is Conditional) {
-      // Handle polarity by: !(x ? y : z) ==> x ? !y : !z
-      // Rewrite individual branches now. The condition will be rewritten
-      // when we know what polarity to use (depends on which rewrite is used).
-      e.thenExpression = makeCondition(e.thenExpression, polarity);
-      e.elseExpression = makeCondition(e.elseExpression, polarity);
-
-      // x ? true : false ==> x
-      if (isTrue(e.thenExpression) && isFalse(e.elseExpression)) {
-        return makeCondition(e.condition, true, liftNots: liftNots);
-      }
-      // x ? false : true ==> !x
-      if (isFalse(e.thenExpression) && isTrue(e.elseExpression)) {
-        return makeCondition(e.condition, false, liftNots: liftNots);
-      }
-      // x ? true : y  ==> x || y
-      if (isTrue(e.thenExpression)) {
-        return makeOr(makeCondition(e.condition, true),
-                      e.elseExpression,
-                      liftNots: liftNots);
-      }
-      // x ? false : y  ==> !x && y
-      if (isFalse(e.thenExpression)) {
-        return makeAnd(makeCondition(e.condition, false),
-                       e.elseExpression,
-                       liftNots: liftNots);
-      }
-      // x ? y : true  ==> !x || y
-      if (isTrue(e.elseExpression)) {
-        return makeOr(makeCondition(e.condition, false),
-                      e.thenExpression,
-                      liftNots: liftNots);
-      }
-      // x ? y : false  ==> x && y
-      if (isFalse(e.elseExpression)) {
-        return makeAnd(makeCondition(e.condition, true),
-                       e.thenExpression,
-                       liftNots: liftNots);
-      }
-
-      e.condition = makeCondition(e.condition, true);
-
-      // !x ? y : z ==> x ? z : y
-      if (e.condition is Not) {
-        e.condition = (e.condition as Not).operand;
-        Expression tmp = e.thenExpression;
-        e.thenExpression = e.elseExpression;
-        e.elseExpression = tmp;
-      }
-      // x ? !y : !z ==> !(x ? y : z)  (only if lifting nots)
-      if (e.thenExpression is Not && e.elseExpression is Not && liftNots) {
-        e.thenExpression = (e.thenExpression as Not).operand;
-        e.elseExpression = (e.elseExpression as Not).operand;
-        return new Not(e);
-      }
-      return e;
-    }
-    if (e is Constant && e.value is dart2js.BoolConstant) {
-      // !true ==> false
-      if (!polarity) {
-        dart2js.BoolConstant value = e.value;
-        return new Constant.primitive(value.negate());
-      }
-      return e;
-    }
-    e = visitExpression(e);
-    return polarity ? e : new Not(e);
-  }
-
-  bool isTrue(Expression e) {
-    return e is Constant && e.value is dart2js.TrueConstant;
-  }
-
-  bool isFalse(Expression e) {
-    return e is Constant && e.value is dart2js.FalseConstant;
-  }
-
-  Expression makeAnd(Expression e1, Expression e2, {bool liftNots: true}) {
-    if (e1 is Not && e2 is Not && liftNots) {
-      return new Not(new LogicalOperator.or(e1.operand, e2.operand));
-    } else {
-      return new LogicalOperator.and(e1, e2);
-    }
-  }
-
-  Expression makeOr(Expression e1, Expression e2, {bool liftNots: true}) {
-    if (e1 is Not && e2 is Not && liftNots) {
-      return new Not(new LogicalOperator.and(e1.operand, e2.operand));
-    } else {
-      return new LogicalOperator.or(e1, e2);
-    }
-  }
-
-  /// Destructively updates each entry of [l] with the result of visiting it.
-  void _rewriteList(List<Expression> l) {
-    for (int i = 0; i < l.length; i++) {
-      l[i] = visitExpression(l[i]);
-    }
-  }
-}
-
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart
new file mode 100644
index 0000000..b8114fb
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/logical_rewriter.dart
@@ -0,0 +1,449 @@
+// Copyright (c) 2014, 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 logical_rewriter;
+
+import '../dart2jslib.dart' as dart2js;
+import 'tree_ir_nodes.dart';
+
+/// Rewrites logical expressions to be more compact in the Tree IR.
+///
+/// In this class an expression is said to occur in "boolean context" if
+/// its result is immediately applied to boolean conversion.
+///
+/// IF STATEMENTS:
+///
+/// We apply the following two rules to [If] statements (see [visitIf]).
+///
+///   if (E) {} else S  ==>  if (!E) S else {}    (else can be omitted)
+///   if (!E) S1 else S2  ==>  if (E) S2 else S1  (unless previous rule applied)
+///
+/// NEGATION:
+///
+/// De Morgan's Laws are used to rewrite negations of logical operators so
+/// negations are closer to the root:
+///
+///   !x && !y  -->  !(x || y)
+///
+/// This is to enable other rewrites, such as branch swapping in an if. In some
+/// contexts, the rule is reversed because we do not expect to apply a rewrite
+/// rule to the result. For example:
+///
+///   z = !(x || y)  ==>  z = !x && !y;
+///
+/// CONDITIONALS:
+///
+/// Conditionals with boolean constant operands occur frequently in the input.
+/// They can often the re-written to logical operators, for instance:
+///
+///   if (x ? y : false) S1 else S2
+///     ==>
+///   if (x && y) S1 else S2
+///
+/// Conditionals are tricky to rewrite when they occur out of boolean context.
+/// Here we must apply more conservative rules, such as:
+///
+///   x ? true : false  ==>  !!x
+///
+/// If an operand is known to be a boolean, we can introduce a logical operator:
+///
+///   x ? y : false  ==>  x && y   (if y is known to be a boolean)
+///
+/// The following sequence of rewrites demonstrates the merit of these rules:
+///
+///   x ? (y ? true : false) : false
+///   x ? !!y : false   (double negation introduced by [toBoolean])
+///   x && !!y          (!!y validated by [isBooleanValued])
+///   x && y            (double negation removed by [putInBooleanContext])
+///
+class LogicalRewriter extends Visitor<Statement, Expression> {
+
+  /// Statement to be executed next by natural fallthrough. Although fallthrough
+  /// is not introduced in this phase, we need to reason about fallthrough when
+  /// evaluating the benefit of swapping the branches of an [If].
+  Statement fallthrough;
+
+  void rewrite(FunctionDefinition definition) {
+    definition.body = visitStatement(definition.body);
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    Statement savedFallthrough = fallthrough;
+    fallthrough = node.next;
+    node.body = visitStatement(node.body);
+    fallthrough = savedFallthrough;
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.definition = visitExpression(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    node.value = visitExpression(node.value);
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    return node;
+  }
+
+  bool isFallthroughBreak(Statement node) {
+    return node is Break && node.target.binding.next == fallthrough;
+  }
+
+  Statement visitIf(If node) {
+    // If one of the branches is empty (i.e. just a fallthrough), then that
+    // branch should preferrably be the 'else' so we won't have to print it.
+    // In other words, we wish to perform this rewrite:
+    //   if (E) {} else {S}
+    //     ==>
+    //   if (!E) {S}
+    // In the tree language, empty statements do not exist yet, so we must check
+    // if one branch contains a break that can be eliminated by fallthrough.
+
+    // Swap branches if then is a fallthrough break.
+    if (isFallthroughBreak(node.thenStatement)) {
+      node.condition = new Not(node.condition);
+      Statement tmp = node.thenStatement;
+      node.thenStatement = node.elseStatement;
+      node.elseStatement = tmp;
+    }
+
+    // Can the else part be eliminated?
+    // (Either due to the above swap or if the break was already there).
+    bool emptyElse = isFallthroughBreak(node.elseStatement);
+
+    node.condition = makeCondition(node.condition, true, liftNots: !emptyElse);
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+
+    // If neither branch is empty, eliminate a negation in the condition
+    // if (!E) S1 else S2
+    //   ==>
+    // if (E) S2 else S1
+    if (!emptyElse && node.condition is Not) {
+      node.condition = (node.condition as Not).operand;
+      Statement tmp = node.thenStatement;
+      node.thenStatement = node.elseStatement;
+      node.elseStatement = tmp;
+    }
+
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    node.body = visitStatement(node.body);
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    node.condition = makeCondition(node.condition, true, liftNots: false);
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.expression = visitExpression(node.expression);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+
+  Expression visitVariable(Variable node) {
+    return node;
+  }
+
+  Expression visitInvokeStatic(InvokeStatic node) {
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitInvokeMethod(InvokeMethod node) {
+    node.receiver = visitExpression(node.receiver);
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitInvokeConstructor(InvokeConstructor node) {
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitConcatenateStrings(ConcatenateStrings node) {
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitLiteralList(LiteralList node) {
+    _rewriteList(node.values);
+    return node;
+  }
+
+  Expression visitLiteralMap(LiteralMap node) {
+    _rewriteList(node.keys);
+    _rewriteList(node.values);
+    return node;
+  }
+
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
+  Expression visitConstant(Constant node) {
+    return node;
+  }
+
+  Expression visitThis(This node) {
+    return node;
+  }
+
+  Expression visitReifyTypeVar(ReifyTypeVar node) {
+    return node;
+  }
+
+  Expression visitFunctionExpression(FunctionExpression node) {
+    new LogicalRewriter().rewrite(node.definition);
+    return node;
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new LogicalRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Expression visitNot(Not node) {
+    return toBoolean(makeCondition(node.operand, false, liftNots: false));
+  }
+
+  Expression visitConditional(Conditional node) {
+    // node.condition will be visited after the then and else parts, because its
+    // polarity depends on what rewrite we use.
+    node.thenExpression = visitExpression(node.thenExpression);
+    node.elseExpression = visitExpression(node.elseExpression);
+
+    // In the following, we must take care not to eliminate or introduce a
+    // boolean conversion.
+
+    // x ? true : false --> !!x
+    if (isTrue(node.thenExpression) && isFalse(node.elseExpression)) {
+      return toBoolean(makeCondition(node.condition, true, liftNots: false));
+    }
+    // x ? false : true --> !x
+    if (isFalse(node.thenExpression) && isTrue(node.elseExpression)) {
+      return toBoolean(makeCondition(node.condition, false, liftNots: false));
+    }
+
+    // x ? y : false ==> x && y  (if y is known to be a boolean)
+    if (isBooleanValued(node.thenExpression) && isFalse(node.elseExpression)) {
+      return new LogicalOperator.and(
+          makeCondition(node.condition, true, liftNots:false),
+          putInBooleanContext(node.thenExpression));
+    }
+    // x ? y : true ==> !x || y  (if y is known to be a boolean)
+    if (isBooleanValued(node.thenExpression) && isTrue(node.elseExpression)) {
+      return new LogicalOperator.or(
+          makeCondition(node.condition, false, liftNots: false),
+          putInBooleanContext(node.thenExpression));
+    }
+    // x ? true : y ==> x || y  (if y if known to be boolean)
+    if (isBooleanValued(node.elseExpression) && isTrue(node.thenExpression)) {
+      return new LogicalOperator.or(
+          makeCondition(node.condition, true, liftNots: false),
+          putInBooleanContext(node.elseExpression));
+    }
+    // x ? false : y ==> !x && y  (if y is known to be a boolean)
+    if (isBooleanValued(node.elseExpression) && isFalse(node.thenExpression)) {
+      return new LogicalOperator.and(
+          makeCondition(node.condition, false, liftNots: false),
+          putInBooleanContext(node.elseExpression));
+    }
+
+    node.condition = makeCondition(node.condition, true);
+
+    // !x ? y : z ==> x ? z : y
+    if (node.condition is Not) {
+      node.condition = (node.condition as Not).operand;
+      Expression tmp = node.thenExpression;
+      node.thenExpression = node.elseExpression;
+      node.elseExpression = tmp;
+    }
+
+    return node;
+  }
+
+  Expression visitLogicalOperator(LogicalOperator node) {
+    node.left = makeCondition(node.left, true);
+    node.right = makeCondition(node.right, true);
+    return node;
+  }
+
+  /// True if the given expression is known to evaluate to a boolean.
+  /// This will not recursively traverse [Conditional] expressions, but if
+  /// applied to the result of [visitExpression] conditionals will have been
+  /// rewritten anyway.
+  bool isBooleanValued(Expression e) {
+    return isTrue(e) || isFalse(e) || e is Not || e is LogicalOperator;
+  }
+
+  /// Rewrite an expression that was originally processed in a non-boolean
+  /// context.
+  Expression putInBooleanContext(Expression e) {
+    if (e is Not && e.operand is Not) {
+      return (e.operand as Not).operand;
+    } else {
+      return e;
+    }
+  }
+
+  /// Forces a boolean conversion of the given expression.
+  Expression toBoolean(Expression e) {
+    if (isBooleanValued(e))
+      return e;
+    else
+      return new Not(new Not(e));
+  }
+
+  /// Creates an equivalent boolean expression. The expression must occur in a
+  /// context where its result is immediately subject to boolean conversion.
+  /// If [polarity] if false, the negated condition will be created instead.
+  /// If [liftNots] is true (default) then Not expressions will be lifted toward
+  /// the root the condition so they can be eliminated by the caller.
+  Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
+    if (e is Not) {
+      // !!E ==> E
+      return makeCondition(e.operand, !polarity, liftNots: liftNots);
+    }
+    if (e is LogicalOperator) {
+      // If polarity=false, then apply the rewrite !(x && y) ==> !x || !y
+      e.left = makeCondition(e.left, polarity);
+      e.right = makeCondition(e.right, polarity);
+      if (!polarity) {
+        e.isAnd = !e.isAnd;
+      }
+      // !x && !y ==> !(x || y)  (only if lifting nots)
+      if (e.left is Not && e.right is Not && liftNots) {
+        e.left = (e.left as Not).operand;
+        e.right = (e.right as Not).operand;
+        e.isAnd = !e.isAnd;
+        return new Not(e);
+      }
+      return e;
+    }
+    if (e is Conditional) {
+      // Handle polarity by: !(x ? y : z) ==> x ? !y : !z
+      // Rewrite individual branches now. The condition will be rewritten
+      // when we know what polarity to use (depends on which rewrite is used).
+      e.thenExpression = makeCondition(e.thenExpression, polarity);
+      e.elseExpression = makeCondition(e.elseExpression, polarity);
+
+      // x ? true : false ==> x
+      if (isTrue(e.thenExpression) && isFalse(e.elseExpression)) {
+        return makeCondition(e.condition, true, liftNots: liftNots);
+      }
+      // x ? false : true ==> !x
+      if (isFalse(e.thenExpression) && isTrue(e.elseExpression)) {
+        return makeCondition(e.condition, false, liftNots: liftNots);
+      }
+      // x ? true : y  ==> x || y
+      if (isTrue(e.thenExpression)) {
+        return makeOr(makeCondition(e.condition, true),
+                      e.elseExpression,
+                      liftNots: liftNots);
+      }
+      // x ? false : y  ==> !x && y
+      if (isFalse(e.thenExpression)) {
+        return makeAnd(makeCondition(e.condition, false),
+                       e.elseExpression,
+                       liftNots: liftNots);
+      }
+      // x ? y : true  ==> !x || y
+      if (isTrue(e.elseExpression)) {
+        return makeOr(makeCondition(e.condition, false),
+                      e.thenExpression,
+                      liftNots: liftNots);
+      }
+      // x ? y : false  ==> x && y
+      if (isFalse(e.elseExpression)) {
+        return makeAnd(makeCondition(e.condition, true),
+                       e.thenExpression,
+                       liftNots: liftNots);
+      }
+
+      e.condition = makeCondition(e.condition, true);
+
+      // !x ? y : z ==> x ? z : y
+      if (e.condition is Not) {
+        e.condition = (e.condition as Not).operand;
+        Expression tmp = e.thenExpression;
+        e.thenExpression = e.elseExpression;
+        e.elseExpression = tmp;
+      }
+      // x ? !y : !z ==> !(x ? y : z)  (only if lifting nots)
+      if (e.thenExpression is Not && e.elseExpression is Not && liftNots) {
+        e.thenExpression = (e.thenExpression as Not).operand;
+        e.elseExpression = (e.elseExpression as Not).operand;
+        return new Not(e);
+      }
+      return e;
+    }
+    if (e is Constant && e.value is dart2js.BoolConstant) {
+      // !true ==> false
+      if (!polarity) {
+        dart2js.BoolConstant value = e.value;
+        return new Constant.primitive(value.negate());
+      }
+      return e;
+    }
+    e = visitExpression(e);
+    return polarity ? e : new Not(e);
+  }
+
+  bool isTrue(Expression e) {
+    return e is Constant && e.value is dart2js.TrueConstant;
+  }
+
+  bool isFalse(Expression e) {
+    return e is Constant && e.value is dart2js.FalseConstant;
+  }
+
+  Expression makeAnd(Expression e1, Expression e2, {bool liftNots: true}) {
+    if (e1 is Not && e2 is Not && liftNots) {
+      return new Not(new LogicalOperator.or(e1.operand, e2.operand));
+    } else {
+      return new LogicalOperator.and(e1, e2);
+    }
+  }
+
+  Expression makeOr(Expression e1, Expression e2, {bool liftNots: true}) {
+    if (e1 is Not && e2 is Not && liftNots) {
+      return new Not(new LogicalOperator.and(e1.operand, e2.operand));
+    } else {
+      return new LogicalOperator.or(e1, e2);
+    }
+  }
+
+  /// Destructively updates each entry of [l] with the result of visiting it.
+  void _rewriteList(List<Expression> l) {
+    for (int i = 0; i < l.length; i++) {
+      l[i] = visitExpression(l[i]);
+    }
+  }
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/loop_rewriter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/loop_rewriter.dart
new file mode 100644
index 0000000..9797e0d
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/loop_rewriter.dart
@@ -0,0 +1,132 @@
+// Copyright (c) 2014, 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 loop_rewriter;
+
+import 'tree_ir_nodes.dart';
+
+/// Rewrites [WhileTrue] statements with an [If] body into a [WhileCondition],
+/// in situations where only one of the branches contains a [Continue] to the
+/// loop. Schematically:
+///
+///   L:
+///   while (true) {
+///     if (E) {
+///       S1  (has references to L)
+///     } else {
+///       S2  (has no references to L)
+///     }
+///   }
+///     ==>
+///   L:
+///   while (E) {
+///     S1
+///   };
+///   S2
+///
+/// A similar transformation is used when S2 occurs in the 'then' position.
+///
+/// Note that the above pattern needs no iteration since nested ifs
+/// have been collapsed previously in the [StatementRewriter] phase.
+class LoopRewriter extends RecursiveVisitor {
+
+  Set<Label> usedContinueLabels = new Set<Label>();
+
+  void rewrite(FunctionDefinition function) {
+    function.body = visitStatement(function.body);
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitAssign(Assign node) {
+    // Clean up redundant assignments left behind in the previous phase.
+    if (node.variable == node.definition) {
+      --node.variable.readCount;
+      --node.variable.writeCount;
+      return visitStatement(node.next);
+    }
+    visitExpression(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    visitExpression(node.value);
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    usedContinueLabels.add(node.target);
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    visitExpression(node.condition);
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    assert(!usedContinueLabels.contains(node.label));
+    if (node.body is If) {
+      If body = node.body;
+      body.thenStatement = visitStatement(body.thenStatement);
+      bool thenHasContinue = usedContinueLabels.remove(node.label);
+      body.elseStatement = visitStatement(body.elseStatement);
+      bool elseHasContinue = usedContinueLabels.remove(node.label);
+      if (thenHasContinue && !elseHasContinue) {
+        node.label.binding = null; // Prepare to rebind the label.
+        return new WhileCondition(
+            node.label,
+            body.condition,
+            body.thenStatement,
+            body.elseStatement);
+      } else if (!thenHasContinue && elseHasContinue) {
+        node.label.binding = null;
+        return new WhileCondition(
+            node.label,
+            new Not(body.condition),
+            body.elseStatement,
+            body.thenStatement);
+      }
+    } else {
+      node.body = visitStatement(node.body);
+      usedContinueLabels.remove(node.label);
+    }
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    // Note: not reachable but the implementation is trivial
+    visitExpression(node.condition);
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    visitExpression(node.expression);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new LoopRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  void visitFunctionExpression(FunctionExpression node) {
+    new LoopRewriter().rewrite(node.definition);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart
new file mode 100644
index 0000000..78fa98f
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/statement_rewriter.dart
@@ -0,0 +1,551 @@
+// Copyright (c) 2014, 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 statement_rewriter;
+
+import 'tree_ir_nodes.dart';
+
+/**
+ * Performs the following transformations on the tree:
+ * - Assignment propagation
+ * - If-to-conditional conversion
+ * - Flatten nested ifs
+ * - Break inlining
+ * - Redirect breaks
+ *
+ * The above transformations all eliminate statements from the tree, and may
+ * introduce redexes of each other.
+ *
+ *
+ * ASSIGNMENT PROPAGATION:
+ * Single-use definitions are propagated to their use site when possible.
+ * For example:
+ *
+ *   { v0 = foo(); return v0; }
+ *     ==>
+ *   return foo()
+ *
+ * After translating out of CPS, all intermediate values are bound by [Assign].
+ * This transformation propagates such definitions to their uses when it is
+ * safe and profitable.  Bindings are processed "on demand" when their uses are
+ * seen, but are only processed once to keep this transformation linear in
+ * the size of the tree.
+ *
+ * The transformation builds an environment containing [Assign] bindings that
+ * are in scope.  These bindings have yet-untranslated definitions.  When a use
+ * is encountered the transformation determines if it is safe and profitable
+ * to propagate the definition to its use.  If so, it is removed from the
+ * environment and the definition is recursively processed (in the
+ * new environment at the use site) before being propagated.
+ *
+ * See [visitVariable] for the implementation of the heuristic for propagating
+ * a definition.
+ *
+ *
+ * IF-TO-CONDITIONAL CONVERSION:
+ * If-statement are converted to conditional expressions when possible.
+ * For example:
+ *
+ *   if (v0) { v1 = foo(); break L } else { v1 = bar(); break L }
+ *     ==>
+ *   { v1 = v0 ? foo() : bar(); break L }
+ *
+ * This can lead to inlining of L, which in turn can lead to further propagation
+ * of the variable v1.
+ *
+ * See [visitIf].
+ *
+ *
+ * FLATTEN NESTED IFS:
+ * An if inside an if is converted to an if with a logical operator.
+ * For example:
+ *
+ *   if (E1) { if (E2) {S} else break L } else break L
+ *     ==>
+ *   if (E1 && E2) {S} else break L
+ *
+ * This may lead to inlining of L.
+ *
+ *
+ * BREAK INLINING:
+ * Single-use labels are inlined at [Break] statements.
+ * For example:
+ *
+ *   L0: { v0 = foo(); break L0 }; return v0;
+ *     ==>
+ *   v0 = foo(); return v0;
+ *
+ * This can lead to propagation of v0.
+ *
+ * See [visitBreak] and [visitLabeledStatement].
+ *
+ *
+ * REDIRECT BREAKS:
+ * Labeled statements whose next is a break become flattened and all breaks
+ * to their label are redirected.
+ * For example, where 'jump' is either break or continue:
+ *
+ *   L0: {... break L0 ...}; jump L1
+ *     ==>
+ *   {... jump L1 ...}
+ *
+ * This may trigger a flattening of nested ifs in case the eliminated label
+ * separated two ifs.
+ */
+class StatementRewriter extends Visitor<Statement, Expression> {
+  // The binding environment.  The rightmost element of the list is the nearest
+  // available enclosing binding.
+  List<Assign> environment;
+
+  /// Substitution map for labels. Any break to a label L should be substituted
+  /// for a break to L' if L maps to L'.
+  Map<Label, Jump> labelRedirects = <Label, Jump>{};
+
+  /// Returns the redirect target of [label] or [label] itself if it should not
+  /// be redirected.
+  Jump redirect(Jump jump) {
+    Jump newJump = labelRedirects[jump.target];
+    return newJump != null ? newJump : jump;
+  }
+
+  void rewrite(FunctionDefinition definition) {
+    environment = <Assign>[];
+    definition.body = visitStatement(definition.body);
+
+    // TODO(kmillikin):  Allow definitions that are not propagated.  Here,
+    // this means rebuilding the binding with a recursively unnamed definition,
+    // or else introducing a variable definition and an assignment.
+    assert(environment.isEmpty);
+  }
+
+  Expression visitExpression(Expression e) => e.processed ? e : e.accept(this);
+
+  Expression visitVariable(Variable node) {
+    // Propagate a variable's definition to its use site if:
+    // 1.  It has a single use, to avoid code growth and potential duplication
+    //     of side effects, AND
+    // 2.  It was the most recent expression evaluated so that we do not
+    //     reorder expressions with side effects.
+    if (!environment.isEmpty &&
+        environment.last.variable == node &&
+        environment.last.hasExactlyOneUse) {
+      return visitExpression(environment.removeLast().definition);
+    }
+    // If the definition could not be propagated, leave the variable use.
+    return node;
+  }
+
+
+  Statement visitAssign(Assign node) {
+    environment.add(node);
+    Statement next = visitStatement(node.next);
+
+    if (!environment.isEmpty && environment.last == node) {
+      // The definition could not be propagated.  Residualize the let binding.
+      node.next = next;
+      environment.removeLast();
+      node.definition = visitExpression(node.definition);
+      return node;
+    }
+    assert(!environment.contains(node));
+    return next;
+  }
+
+  Expression visitInvokeStatic(InvokeStatic node) {
+    // Process arguments right-to-left, the opposite of evaluation order.
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitInvokeMethod(InvokeMethod node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
+  Expression visitInvokeSuperMethod(InvokeSuperMethod node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitInvokeConstructor(InvokeConstructor node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConcatenateStrings(ConcatenateStrings node) {
+    for (int i = node.arguments.length - 1; i >= 0; --i) {
+      node.arguments[i] = visitExpression(node.arguments[i]);
+    }
+    return node;
+  }
+
+  Expression visitConditional(Conditional node) {
+    node.condition = visitExpression(node.condition);
+
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
+    node.thenExpression = visitExpression(node.thenExpression);
+    assert(environment.isEmpty);
+    node.elseExpression = visitExpression(node.elseExpression);
+    assert(environment.isEmpty);
+    environment = savedEnvironment;
+
+    return node;
+  }
+
+  Expression visitLogicalOperator(LogicalOperator node) {
+    node.left = visitExpression(node.left);
+
+    environment.add(null); // impure expressions may not propagate across branch
+    node.right = visitExpression(node.right);
+    environment.removeLast();
+
+    return node;
+  }
+
+  Expression visitNot(Not node) {
+    node.operand = visitExpression(node.operand);
+    return node;
+  }
+
+  Expression visitFunctionExpression(FunctionExpression node) {
+    new StatementRewriter().rewrite(node.definition);
+    return node;
+  }
+
+  Statement visitFunctionDeclaration(FunctionDeclaration node) {
+    new StatementRewriter().rewrite(node.definition);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    node.value = visitExpression(node.value);
+    return node;
+  }
+
+
+  Statement visitBreak(Break node) {
+    // Redirect through chain of breaks.
+    // Note that useCount was accounted for at visitLabeledStatement.
+    // Note redirect may return either a Break or Continue statement.
+    Jump jump = redirect(node);
+    if (jump is Break && jump.target.useCount == 1) {
+      --jump.target.useCount;
+      return visitStatement(jump.target.binding.next);
+    }
+    return jump;
+  }
+
+  Statement visitContinue(Continue node) {
+    return node;
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    if (node.next is Jump) {
+      // Eliminate label if next is a break or continue statement
+      // Breaks to this label are redirected to the outer label.
+      // Note that breakCount for the two labels is updated proactively here
+      // so breaks can reliably tell if they should inline their target.
+      Jump next = node.next;
+      Jump newJump = redirect(next);
+      labelRedirects[node.label] = newJump;
+      newJump.target.useCount += node.label.useCount - 1;
+      node.label.useCount = 0;
+      Statement result = visitStatement(node.body);
+      labelRedirects.remove(node.label); // Save some space.
+      return result;
+    }
+
+    node.body = visitStatement(node.body);
+
+    if (node.label.useCount == 0) {
+      // Eliminate the label if next was inlined at a break
+      return node.body;
+    }
+
+    // Do not propagate assignments into the successor statements, since they
+    // may be overwritten by assignments in the body.
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
+    node.next = visitStatement(node.next);
+    environment = savedEnvironment;
+
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    node.condition = visitExpression(node.condition);
+
+    // Do not propagate assignments into branches.  Doing so will lead to code
+    // duplication.
+    // TODO(kmillikin): Rethink this.  Propagating some assignments (e.g.,
+    // constants or variables) is benign.  If they can occur here, they should
+    // be handled well.
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
+    node.thenStatement = visitStatement(node.thenStatement);
+    assert(environment.isEmpty);
+    node.elseStatement = visitStatement(node.elseStatement);
+    assert(environment.isEmpty);
+    environment = savedEnvironment;
+
+    tryCollapseIf(node);
+
+    Statement reduced = combineStatementsWithSubexpressions(
+        node.thenStatement,
+        node.elseStatement,
+        (t,f) => new Conditional(node.condition, t, f)..processed = true);
+    if (reduced != null) {
+      if (reduced.next is Break) {
+        // In case the break can now be inlined.
+        reduced = visitStatement(reduced);
+      }
+      return reduced;
+    }
+
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    // Do not propagate assignments into loops.  Doing so is not safe for
+    // variables modified in the loop (the initial value will be propagated).
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
+    node.body = visitStatement(node.body);
+    assert(environment.isEmpty);
+    environment = savedEnvironment;
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    // Not introduced yet
+    throw "Unexpected WhileCondition in StatementRewriter";
+  }
+
+  Expression visitConstant(Constant node) {
+    return node;
+  }
+
+  Expression visitThis(This node) {
+    return node;
+  }
+
+  Expression visitReifyTypeVar(ReifyTypeVar node) {
+    return node;
+  }
+
+  Expression visitLiteralList(LiteralList node) {
+    // Process values right-to-left, the opposite of evaluation order.
+    for (int i = node.values.length - 1; i >= 0; --i) {
+      node.values[i] = visitExpression(node.values[i]);
+    }
+    return node;
+  }
+
+  Expression visitLiteralMap(LiteralMap node) {
+    // Process arguments right-to-left, the opposite of evaluation order.
+    for (int i = node.values.length - 1; i >= 0; --i) {
+      node.values[i] = visitExpression(node.values[i]);
+      node.keys[i] = visitExpression(node.keys[i]);
+    }
+    return node;
+  }
+
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.expression = visitExpression(node.expression);
+    // Do not allow propagation of assignments past an expression evaluated
+    // for its side effects because it risks reordering side effects.
+    // TODO(kmillikin): Rethink this.  Some propagation is benign, e.g.,
+    // constants, variables, or other pure values that are not destroyed by
+    // the expression statement.  If they can occur here they should be
+    // handled well.
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
+    node.next = visitStatement(node.next);
+    assert(environment.isEmpty);
+    environment = savedEnvironment;
+    return node;
+  }
+
+  /// If [s] and [t] are similar statements we extract their subexpressions
+  /// and returns a new statement of the same type using expressions combined
+  /// with the [combine] callback. For example:
+  ///
+  ///   combineStatements(Return E1, Return E2) = Return combine(E1, E2)
+  ///
+  /// If [combine] returns E1 then the unified statement is equivalent to [s],
+  /// and if [combine] returns E2 the unified statement is equivalence to [t].
+  ///
+  /// It is guaranteed that no side effects occur between the beginning of the
+  /// statement and the position of the combined expression.
+  ///
+  /// Returns null if the statements are too different.
+  ///
+  /// If non-null is returned, the caller MUST discard [s] and [t] and use
+  /// the returned statement instead.
+  static Statement combineStatementsWithSubexpressions(
+      Statement s,
+      Statement t,
+      Expression combine(Expression s, Expression t)) {
+    if (s is Return && t is Return) {
+      return new Return(combine(s.value, t.value));
+    }
+    if (s is Assign && t is Assign && s.variable == t.variable) {
+      Statement next = combineStatements(s.next, t.next);
+      if (next != null) {
+        --t.variable.writeCount; // Two assignments become one.
+        return new Assign(s.variable,
+                          combine(s.definition, t.definition),
+                          next);
+      }
+    }
+    if (s is ExpressionStatement && t is ExpressionStatement) {
+      Statement next = combineStatements(s.next, t.next);
+      if (next != null) {
+        return new ExpressionStatement(combine(s.expression, t.expression),
+                                       next);
+      }
+    }
+    return null;
+  }
+
+  /// Returns a statement equivalent to both [s] and [t], or null if [s] and
+  /// [t] are incompatible.
+  /// If non-null is returned, the caller MUST discard [s] and [t] and use
+  /// the returned statement instead.
+  /// If two breaks are combined, the label's break counter will be decremented.
+  static Statement combineStatements(Statement s, Statement t) {
+    if (s is Break && t is Break && s.target == t.target) {
+      --t.target.useCount; // Two breaks become one.
+      return s;
+    }
+    if (s is Continue && t is Continue && s.target == t.target) {
+      --t.target.useCount; // Two continues become one.
+      return s;
+    }
+    if (s is Return && t is Return) {
+      Expression e = combineExpressions(s.value, t.value);
+      if (e != null) {
+        return new Return(e);
+      }
+    }
+    return null;
+  }
+
+  /// Returns an expression equivalent to both [e1] and [e2].
+  /// If non-null is returned, the caller must discard [e1] and [e2] and use
+  /// the resulting expression in the tree.
+  static Expression combineExpressions(Expression e1, Expression e2) {
+    if (e1 is Variable && e1 == e2) {
+      --e1.readCount; // Two references become one.
+      return e1;
+    }
+    if (e1 is Constant && e2 is Constant && e1.value == e2.value) {
+      return e1;
+    }
+    return null;
+  }
+
+  /// Try to collapse nested ifs using && and || expressions.
+  /// For example:
+  ///
+  ///   if (E1) { if (E2) S else break L } else break L
+  ///     ==>
+  ///   if (E1 && E2) S else break L
+  ///
+  /// [branch1] and [branch2] control the position of the S statement.
+  ///
+  /// Returns true if another collapse redex might have been introduced.
+  void tryCollapseIf(If node) {
+    // Repeatedly try to collapse nested ifs.
+    // The transformation is shrinking (destroys an if) so it remains linear.
+    // Here is an example where more than one iteration is required:
+    //
+    //   if (E1)
+    //     if (E2) break L2 else break L1
+    //   else
+    //     break L1
+    //
+    // L1.target ::=
+    //   if (E3) S else break L2
+    //
+    // After first collapse:
+    //
+    //   if (E1 && E2)
+    //     break L2
+    //   else
+    //     {if (E3) S else break L2}  (inlined from break L1)
+    //
+    // We can then do another collapse using the inlined nested if.
+    bool changed = true;
+    while (changed) {
+      changed = false;
+      if (tryCollapseIfAux(node, true, true)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, true, false)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, false, true)) {
+        changed = true;
+      }
+      if (tryCollapseIfAux(node, false, false)) {
+        changed = true;
+      }
+    }
+  }
+
+  bool tryCollapseIfAux(If outerIf, bool branch1, bool branch2) {
+    // NOTE: We name variables here as if S is in the then-then position.
+    Statement outerThen = getBranch(outerIf, branch1);
+    Statement outerElse = getBranch(outerIf, !branch1);
+    if (outerThen is If && outerElse is Break) {
+      If innerIf = outerThen;
+      Statement innerThen = getBranch(innerIf, branch2);
+      Statement innerElse = getBranch(innerIf, !branch2);
+      if (innerElse is Break && innerElse.target == outerElse.target) {
+        // We always put S in the then branch of the result, and adjust the
+        // condition expression if S was actually found in the else branch(es).
+        outerIf.condition = new LogicalOperator.and(
+            makeCondition(outerIf.condition, branch1),
+            makeCondition(innerIf.condition, branch2));
+        outerIf.thenStatement = innerThen;
+        --innerElse.target.useCount;
+
+        // Try to inline the remaining break.  Do not propagate assignments.
+        List<Assign> savedEnvironment = environment;
+        environment = <Assign>[];
+        outerIf.elseStatement = visitStatement(outerElse);
+        assert(environment.isEmpty);
+        environment = savedEnvironment;
+
+        return outerIf.elseStatement is If && innerThen is Break;
+      }
+    }
+    return false;
+  }
+
+  Expression makeCondition(Expression e, bool polarity) {
+    return polarity ? e : new Not(e);
+  }
+
+  Statement getBranch(If node, bool polarity) {
+    return polarity ? node.thenStatement : node.elseStatement;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
new file mode 100644
index 0000000..faab874
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_builder.dart
@@ -0,0 +1,468 @@
+// Copyright (c) 2014, 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 cps_to_tree;
+
+import '../dart2jslib.dart' as dart2js;
+import '../elements/elements.dart';
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
+import 'tree_ir_nodes.dart';
+
+/**
+ * Builder translates from CPS-based IR to direct-style Tree.
+ *
+ * A call `Invoke(fun, cont, args)`, where cont is a singly-referenced
+ * non-exit continuation `Cont(v, body)` is translated into a direct-style call
+ * whose value is bound in the continuation body:
+ *
+ * `LetVal(v, Invoke(fun, args), body)`
+ *
+ * and the continuation definition is eliminated.  A similar translation is
+ * applied to continuation invocations where the continuation is
+ * singly-referenced, though such invocations should not appear in optimized
+ * IR.
+ *
+ * A call `Invoke(fun, cont, args)`, where cont is multiply referenced, is
+ * translated into a call followed by a jump with an argument:
+ *
+ * `Jump L(Invoke(fun, args))`
+ *
+ * and the continuation is translated into a named block that takes an
+ * argument:
+ *
+ * `LetLabel(L, v, body)`
+ *
+ * Block arguments are later replaced with data flow during the Tree-to-Tree
+ * translation out of SSA.  Jumps are eliminated during the Tree-to-Tree
+ * control-flow recognition.
+ *
+ * Otherwise, the output of Builder looks very much like the input.  In
+ * particular, intermediate values and blocks used for local control flow are
+ * still all named.
+ */
+class Builder extends cps_ir.Visitor<Node> {
+  final dart2js.Compiler compiler;
+
+  /// Maps variable/parameter elements to the Tree variables that represent it.
+  final Map<Element, List<Variable>> element2variables =
+      <Element,List<Variable>>{};
+
+  /// Like [element2variables], except for closure variables. Closure variables
+  /// are not subject to SSA, so at most one variable is used per element.
+  final Map<Element, Variable> element2closure = <Element, Variable>{};
+
+  // Continuations with more than one use are replaced with Tree labels.  This
+  // is the mapping from continuations to labels.
+  final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{};
+
+  FunctionDefinition function;
+  cps_ir.Continuation returnContinuation;
+
+  Builder parent;
+
+  Builder(this.compiler);
+
+  Builder.inner(Builder parent)
+      : this.parent = parent,
+        compiler = parent.compiler;
+
+  /// Variable used in [buildPhiAssignments] as a temporary when swapping
+  /// variables.
+  Variable phiTempVar;
+
+  Variable getClosureVariable(Element element) {
+    if (element.enclosingElement != function.element) {
+      return parent.getClosureVariable(element);
+    }
+    Variable variable = element2closure[element];
+    if (variable == null) {
+      variable = new Variable(function, element);
+      element2closure[element] = variable;
+    }
+    return variable;
+  }
+
+  /// Obtains the variable representing the given primitive. Returns null for
+  /// primitives that have no reference and do not need a variable.
+  Variable getVariable(cps_ir.Primitive primitive) {
+    if (primitive.registerIndex == null) {
+      return null; // variable is unused
+    }
+    List<Variable> variables = element2variables[primitive.hint];
+    if (variables == null) {
+      variables = <Variable>[];
+      element2variables[primitive.hint] = variables;
+    }
+    while (variables.length <= primitive.registerIndex) {
+      variables.add(new Variable(function, primitive.hint));
+    }
+    return variables[primitive.registerIndex];
+  }
+
+  /// Obtains a reference to the tree Variable corresponding to the IR primitive
+  /// referred to by [reference].
+  /// This increments the reference count for the given variable, so the
+  /// returned expression must be used in the tree.
+  Expression getVariableReference(cps_ir.Reference reference) {
+    Variable variable = getVariable(reference.definition);
+    if (variable == null) {
+      compiler.internalError(
+          compiler.currentElement,
+          "Reference to ${reference.definition} has no register");
+    }
+    ++variable.readCount;
+    return variable;
+  }
+
+  FunctionDefinition build(cps_ir.FunctionDefinition node) {
+    visit(node);
+    return function;
+  }
+
+  List<Expression> translateArguments(List<cps_ir.Reference> args) {
+    return new List<Expression>.generate(args.length,
+         (int index) => getVariableReference(args[index]));
+  }
+
+  List<Variable> translatePhiArguments(List<cps_ir.Reference> args) {
+    return new List<Variable>.generate(args.length,
+         (int index) => getVariableReference(args[index]));
+  }
+
+  Statement buildContinuationAssignment(
+      cps_ir.Parameter parameter,
+      Expression argument,
+      Statement buildRest()) {
+    Variable variable = getVariable(parameter);
+    Statement assignment;
+    if (variable == null) {
+      assignment = new ExpressionStatement(argument, null);
+    } else {
+      assignment = new Assign(variable, argument, null);
+    }
+    assignment.next = buildRest();
+    return assignment;
+  }
+
+  /// Simultaneously assigns each argument to the corresponding parameter,
+  /// then continues at the statement created by [buildRest].
+  Statement buildPhiAssignments(
+      List<cps_ir.Parameter> parameters,
+      List<Variable> arguments,
+      Statement buildRest()) {
+    assert(parameters.length == arguments.length);
+    // We want a parallel assignment to all parameters simultaneously.
+    // Since we do not have parallel assignments in dart_tree, we must linearize
+    // the assignments without attempting to read a previously-overwritten
+    // value. For example {x,y = y,x} cannot be linearized to {x = y; y = x},
+    // for this we must introduce a temporary variable: {t = x; x = y; y = t}.
+
+    // [rightHand] is the inverse of [arguments], that is, it maps variables
+    // to the assignments on which is occurs as the right-hand side.
+    Map<Variable, List<int>> rightHand = <Variable, List<int>>{};
+    for (int i = 0; i < parameters.length; i++) {
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        continue; // No assignment necessary.
+      }
+      List<int> list = rightHand[arg];
+      if (list == null) {
+        rightHand[arg] = list = <int>[];
+      }
+      list.add(i);
+    }
+
+    Statement first, current;
+    void addAssignment(Variable dst, Variable src) {
+      if (first == null) {
+        first = current = new Assign(dst, src, null);
+      } else {
+        current = current.next = new Assign(dst, src, null);
+      }
+    }
+
+    List<Variable> assignmentSrc = new List<Variable>(parameters.length);
+    List<bool> done = new List<bool>(parameters.length);
+    void visitAssignment(int i) {
+      if (done[i] == true) {
+        return;
+      }
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        return; // No assignment necessary.
+      }
+      if (assignmentSrc[i] != null) {
+        // Cycle found; store argument in a temporary variable.
+        // The temporary will then be used as right-hand side when the
+        // assignment gets added.
+        if (assignmentSrc[i] != phiTempVar) { // Only move to temporary once.
+          assignmentSrc[i] = phiTempVar;
+          addAssignment(phiTempVar, arg);
+        }
+        return;
+      }
+      assignmentSrc[i] = arg;
+      List<int> paramUses = rightHand[param];
+      if (paramUses != null) {
+        for (int useIndex in paramUses) {
+          visitAssignment(useIndex);
+        }
+      }
+      addAssignment(param, assignmentSrc[i]);
+      done[i] = true;
+    }
+
+    for (int i = 0; i < parameters.length; i++) {
+      if (done[i] == null) {
+        visitAssignment(i);
+      }
+    }
+
+    if (first == null) {
+      first = buildRest();
+    } else {
+      current.next = buildRest();
+    }
+    return first;
+  }
+
+  visitNode(cps_ir.Node node) => throw "Unhandled node: $node";
+
+  Expression visitFunctionDefinition(cps_ir.FunctionDefinition node) {
+    List<Variable> parameters = <Variable>[];
+    function = new FunctionDefinition(node.element, parameters,
+        null, node.localConstants, node.defaultParameterValues);
+    returnContinuation = node.returnContinuation;
+    for (cps_ir.Parameter p in node.parameters) {
+      Variable parameter = getVariable(p);
+      assert(parameter != null);
+      ++parameter.writeCount; // Being a parameter counts as a write.
+      parameters.add(parameter);
+    }
+    phiTempVar = new Variable(function, null);
+    function.body = visit(node.body);
+    return null;
+  }
+
+  Statement visitLetPrim(cps_ir.LetPrim node) {
+    Variable variable = getVariable(node.primitive);
+
+    // Don't translate unused primitives.
+    if (variable == null) return visit(node.body);
+
+    Node definition = visit(node.primitive);
+
+    // visitPrimitive returns a Statement without successor if it cannot occur
+    // in expression context (currently only the case for FunctionDeclarations).
+    if (definition is Statement) {
+      definition.next = visit(node.body);
+      return definition;
+    } else {
+      return new Assign(variable, definition, visit(node.body));
+    }
+  }
+
+  Statement visitLetCont(cps_ir.LetCont node) {
+    Label label;
+    if (node.continuation.hasMultipleUses) {
+      label = new Label();
+      labels[node.continuation] = label;
+    }
+    Statement body = visit(node.body);
+    // The continuation's body is not always translated directly here because
+    // it may have been already translated:
+    //   * For singly-used continuations, the continuation's body is
+    //     translated at the site of the continuation invocation.
+    //   * For recursive continuations, there is a single non-recursive
+    //     invocation.  The continuation's body is translated at the site
+    //     of the non-recursive continuation invocation.
+    // See visitInvokeContinuation for the implementation.
+    if (label == null || node.continuation.isRecursive) return body;
+    return new LabeledStatement(label, body, visit(node.continuation.body));
+  }
+
+  Statement visitInvokeStatic(cps_ir.InvokeStatic node) {
+    // Calls are translated to direct style.
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression invoke = new InvokeStatic(node.target, node.selector, arguments);
+    return continueWithExpression(node.continuation, invoke);
+  }
+
+  Statement visitInvokeMethod(cps_ir.InvokeMethod node) {
+    Expression receiver = getVariableReference(node.receiver);
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression invoke = new InvokeMethod(receiver, node.selector, arguments);
+    return continueWithExpression(node.continuation, invoke);
+  }
+
+  Statement visitInvokeSuperMethod(cps_ir.InvokeSuperMethod node) {
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression invoke = new InvokeSuperMethod(node.selector, arguments);
+    return continueWithExpression(node.continuation, invoke);
+  }
+
+  Statement visitConcatenateStrings(cps_ir.ConcatenateStrings node) {
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression concat = new ConcatenateStrings(arguments);
+    return continueWithExpression(node.continuation, concat);
+  }
+
+  Statement continueWithExpression(cps_ir.Reference continuation,
+                                   Expression expression) {
+    cps_ir.Continuation cont = continuation.definition;
+    if (cont == returnContinuation) {
+      return new Return(expression);
+    } else {
+      assert(cont.hasExactlyOneUse);
+      assert(cont.parameters.length == 1);
+      return buildContinuationAssignment(cont.parameters.single, expression,
+          () => visit(cont.body));
+    }
+  }
+
+  Expression visitGetClosureVariable(cps_ir.GetClosureVariable node) {
+    return getClosureVariable(node.variable);
+  }
+
+  Statement visitSetClosureVariable(cps_ir.SetClosureVariable node) {
+    Variable variable = getClosureVariable(node.variable);
+    Expression value = getVariableReference(node.value);
+    return new Assign(variable, value, visit(node.body),
+                      isDeclaration: node.isDeclaration);
+  }
+
+  Statement visitDeclareFunction(cps_ir.DeclareFunction node) {
+    Variable variable = getClosureVariable(node.variable);
+    FunctionDefinition function = makeSubFunction(node.definition);
+    return new FunctionDeclaration(variable, function, visit(node.body));
+  }
+
+  Statement visitTypeOperator(cps_ir.TypeOperator node) {
+    Expression receiver = getVariableReference(node.receiver);
+    Expression concat = new TypeOperator(receiver, node.type, node.operator);
+    return continueWithExpression(node.continuation, concat);
+  }
+
+  Statement visitInvokeConstructor(cps_ir.InvokeConstructor node) {
+    List<Expression> arguments = translateArguments(node.arguments);
+    Expression invoke =
+        new InvokeConstructor(node.type, node.target, node.selector, arguments);
+    return continueWithExpression(node.continuation, invoke);
+  }
+
+  Statement visitInvokeContinuation(cps_ir.InvokeContinuation node) {
+    // Invocations of the return continuation are translated to returns.
+    // Other continuation invocations are replaced with assignments of the
+    // arguments to formal parameter variables, followed by the body if
+    // the continuation is singly reference or a break if it is multiply
+    // referenced.
+    cps_ir.Continuation cont = node.continuation.definition;
+    if (cont == returnContinuation) {
+      assert(node.arguments.length == 1);
+      return new Return(getVariableReference(node.arguments.single));
+    } else {
+      List<Expression> arguments = translatePhiArguments(node.arguments);
+      return buildPhiAssignments(cont.parameters, arguments,
+          () {
+            // Translate invocations of recursive and non-recursive
+            // continuations differently.
+            //   * Non-recursive continuations
+            //     - If there is one use, translate the continuation body
+            //       inline at the invocation site.
+            //     - If there are multiple uses, translate to Break.
+            //   * Recursive continuations
+            //     - There is a single non-recursive invocation.  Translate
+            //       the continuation body inline as a labeled loop at the
+            //       invocation site.
+            //     - Translate the recursive invocations to Continue.
+            if (cont.isRecursive) {
+              return node.isRecursive
+                  ? new Continue(labels[cont])
+                  : new WhileTrue(labels[cont], visit(cont.body));
+            } else {
+              return cont.hasExactlyOneUse
+                  ? visit(cont.body)
+                  : new Break(labels[cont]);
+            }
+          });
+    }
+  }
+
+  Statement visitBranch(cps_ir.Branch node) {
+    Expression condition = visit(node.condition);
+    Statement thenStatement, elseStatement;
+    cps_ir.Continuation cont = node.trueContinuation.definition;
+    assert(cont.parameters.isEmpty);
+    thenStatement =
+        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
+    cont = node.falseContinuation.definition;
+    assert(cont.parameters.isEmpty);
+    elseStatement =
+        cont.hasExactlyOneUse ? visit(cont.body) : new Break(labels[cont]);
+    return new If(condition, thenStatement, elseStatement);
+  }
+
+  Expression visitConstant(cps_ir.Constant node) {
+    return new Constant(node.expression, node.value);
+  }
+
+  Expression visitThis(cps_ir.This node) {
+    return new This();
+  }
+
+  Expression visitReifyTypeVar(cps_ir.ReifyTypeVar node) {
+    return new ReifyTypeVar(node.typeVariable);
+  }
+
+  Expression visitLiteralList(cps_ir.LiteralList node) {
+    return new LiteralList(
+            node.type,
+            translateArguments(node.values));
+  }
+
+  Expression visitLiteralMap(cps_ir.LiteralMap node) {
+    return new LiteralMap(
+        node.type,
+        translateArguments(node.keys),
+        translateArguments(node.values));
+  }
+
+  FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) {
+    return new Builder.inner(this).build(function);
+  }
+
+  Node visitCreateFunction(cps_ir.CreateFunction node) {
+    FunctionDefinition def = makeSubFunction(node.definition);
+    FunctionSignature signature = node.definition.element.functionSignature;
+    bool hasReturnType = !signature.type.returnType.treatAsDynamic;
+    if (hasReturnType) {
+      // This function cannot occur in expression context.
+      // The successor will be filled in by visitLetPrim.
+      return new FunctionDeclaration(getVariable(node), def, null);
+    } else {
+      return new FunctionExpression(def);
+    }
+  }
+
+  Expression visitParameter(cps_ir.Parameter node) {
+    // Continuation parameters are not visited (continuations themselves are
+    // not visited yet).
+    compiler.internalError(compiler.currentElement, 'Unexpected IR node.');
+    return null;
+  }
+
+  Expression visitContinuation(cps_ir.Continuation node) {
+    // Until continuations with multiple uses are supported, they are not
+    // visited.
+    compiler.internalError(compiler.currentElement, 'Unexpected IR node.');
+    return null;
+  }
+
+  Expression visitIsTrue(cps_ir.IsTrue node) {
+    return getVariableReference(node.value);
+  }
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
new file mode 100644
index 0000000..6096966
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_nodes.dart
@@ -0,0 +1,650 @@
+// Copyright (c) 2014, 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 tree_ir;
+
+import '../dart2jslib.dart' as dart2js;
+import '../elements/elements.dart';
+import '../universe/universe.dart';
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir;
+import '../dart_types.dart' show DartType, GenericType;
+import '../universe/universe.dart' show Selector;
+import '../cps_ir/const_expression.dart';
+
+
+// The Tree language is the target of translation out of the CPS-based IR.
+//
+// The translation from CPS to Dart consists of several stages.  Among the
+// stages are translation to direct style, translation out of SSA, eliminating
+// unnecessary names, recognizing high-level control constructs.  Combining
+// these separate concerns is complicated and the constraints of the CPS-based
+// language do not permit a multi-stage translation.
+//
+// For that reason, CPS is translated to the direct-style language Tree.
+// Translation out of SSA, unnaming, and control-flow, as well as 'instruction
+// selection' are performed on the Tree language.
+//
+// In contrast to the CPS-based IR, non-primitive expressions can be named and
+// arguments (to calls, primitives, and blocks) can be arbitrary expressions.
+//
+// Additionally, variables are considered in scope within inner functions;
+// closure variables are thus handled directly instead of using ref cells.
+
+/**
+ * The base class of all Tree nodes.
+ */
+abstract class Node {
+}
+
+/**
+ * The base class of [Expression]s.
+ */
+abstract class Expression extends Node {
+  accept(ExpressionVisitor v);
+
+  /// Temporary variable used by [StatementRewriter].
+  /// If set to true, this expression has already had enclosing assignments
+  /// propagated into its variables, and should not be processed again.
+  /// It is only set for expressions that are known to be in risk of redundant
+  /// processing.
+  bool processed = false;
+}
+
+abstract class Statement extends Node {
+  Statement get next;
+  void set next(Statement s);
+  accept(StatementVisitor v);
+}
+
+/**
+ * Labels name [LabeledStatement]s.
+ */
+class Label {
+  // A counter used to generate names.  The counter is reset to 0 for each
+  // function emitted.
+  static int counter = 0;
+  static String _newName() => 'L${counter++}';
+
+  String cachedName;
+
+  String get name {
+    if (cachedName == null) cachedName = _newName();
+    return cachedName;
+  }
+
+  /// Number of [Break] or [Continue] statements that target this label.
+  /// The [Break] constructor will increment this automatically, but the
+  /// counter must be decremented by hand when a [Break] becomes orphaned.
+  int useCount = 0;
+
+  /// The [LabeledStatement] or [WhileTrue] binding this label.
+  JumpTarget binding;
+}
+
+/**
+ * Variables are [Expression]s.
+ */
+class Variable extends Expression {
+  /// Function that declares this variable.
+  FunctionDefinition host;
+
+  /// Element used for synthesizing a name for the variable.
+  /// Different variables may have the same element. May be null.
+  Element element;
+
+  int readCount = 0;
+
+  /// Number of places where this variable occurs as:
+  /// - left-hand of an [Assign]
+  /// - left-hand of a [FunctionDeclaration]
+  /// - parameter in a [FunctionDefinition]
+  int writeCount = 0;
+
+  Variable(this.host, this.element) {
+    assert(host != null);
+  }
+
+  accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
+}
+
+/**
+ * Common interface for invocations with arguments.
+ */
+abstract class Invoke {
+  List<Expression> get arguments;
+  Selector get selector;
+}
+
+/**
+ * A call to a static function or getter/setter to a static field.
+ *
+ * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
+ */
+class InvokeStatic extends Expression implements Invoke {
+  final Element target;
+  final List<Expression> arguments;
+  final Selector selector;
+
+  InvokeStatic(this.target, this.selector, this.arguments);
+
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
+}
+
+/**
+ * A call to a method, operator, getter, setter or index getter/setter.
+ *
+ * In contrast to the CPS-based IR, the receiver and arguments can be
+ * arbitrary expressions.
+ */
+class InvokeMethod extends Expression implements Invoke {
+  Expression receiver;
+  final Selector selector;
+  final List<Expression> arguments;
+
+  InvokeMethod(this.receiver, this.selector, this.arguments) {
+    assert(receiver != null);
+  }
+
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this);
+}
+
+class InvokeSuperMethod extends Expression implements Invoke {
+  final Selector selector;
+  final List<Expression> arguments;
+
+  InvokeSuperMethod(this.selector, this.arguments) ;
+
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeSuperMethod(this);
+}
+
+/**
+ * Call to a factory or generative constructor.
+ */
+class InvokeConstructor extends Expression implements Invoke {
+  final DartType type;
+  final FunctionElement target;
+  final List<Expression> arguments;
+  final Selector selector;
+  final dart2js.Constant constant;
+
+  InvokeConstructor(this.type, this.target, this.selector, this.arguments,
+      [this.constant]);
+
+  ClassElement get targetClass => target.enclosingElement;
+
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
+}
+
+/// Calls [toString] on each argument and concatenates the results.
+class ConcatenateStrings extends Expression {
+  final List<Expression> arguments;
+  final dart2js.Constant constant;
+
+  ConcatenateStrings(this.arguments, [this.constant]);
+
+  accept(ExpressionVisitor visitor) => visitor.visitConcatenateStrings(this);
+}
+
+/**
+ * A constant.
+ */
+class Constant extends Expression {
+  final ConstExp expression;
+  final dart2js.Constant value;
+
+  Constant(this.expression, this.value);
+
+  Constant.primitive(dart2js.PrimitiveConstant primitiveValue)
+      : expression = new PrimitiveConstExp(primitiveValue),
+        value = primitiveValue;
+
+  accept(ExpressionVisitor visitor) => visitor.visitConstant(this);
+}
+
+class This extends Expression {
+  accept(ExpressionVisitor visitor) => visitor.visitThis(this);
+}
+
+class ReifyTypeVar extends Expression {
+  TypeVariableElement typeVariable;
+
+  ReifyTypeVar(this.typeVariable);
+
+  accept(ExpressionVisitor visitor) => visitor.visitReifyTypeVar(this);
+}
+
+class LiteralList extends Expression {
+  final GenericType type;
+  final List<Expression> values;
+
+  LiteralList(this.type, this.values);
+
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
+}
+
+class LiteralMap extends Expression {
+  final GenericType type;
+  final List<Expression> keys;
+  final List<Expression> values;
+
+  LiteralMap(this.type, this.keys, this.values);
+
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
+}
+
+class TypeOperator extends Expression {
+  Expression receiver;
+  final DartType type;
+  final String operator;
+
+  TypeOperator(this.receiver, this.type, this.operator) ;
+
+  accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
+}
+
+/// A conditional expression.
+class Conditional extends Expression {
+  Expression condition;
+  Expression thenExpression;
+  Expression elseExpression;
+
+  Conditional(this.condition, this.thenExpression, this.elseExpression);
+
+  accept(ExpressionVisitor visitor) => visitor.visitConditional(this);
+}
+
+/// An && or || expression. The operator is internally represented as a boolean
+/// [isAnd] to simplify rewriting of logical operators.
+class LogicalOperator extends Expression {
+  Expression left;
+  bool isAnd;
+  Expression right;
+
+  LogicalOperator(this.left, this.right, this.isAnd);
+  LogicalOperator.and(this.left, this.right) : isAnd = true;
+  LogicalOperator.or(this.left, this.right) : isAnd = false;
+
+  String get operator => isAnd ? '&&' : '||';
+
+  accept(ExpressionVisitor visitor) => visitor.visitLogicalOperator(this);
+}
+
+/// Logical negation.
+class Not extends Expression {
+  Expression operand;
+
+  Not(this.operand);
+
+  accept(ExpressionVisitor visitor) => visitor.visitNot(this);
+}
+
+class FunctionExpression extends Expression {
+  final FunctionDefinition definition;
+
+  FunctionExpression(this.definition) {
+    assert(definition.element.functionSignature.type.returnType.treatAsDynamic);
+  }
+
+  accept(ExpressionVisitor visitor) => visitor.visitFunctionExpression(this);
+}
+
+/// Declares a local function.
+/// Used for functions that may not occur in expression context due to
+/// being recursive or having a return type.
+/// The [variable] must not occur as the left-hand side of an [Assign] or
+/// any other [FunctionDeclaration].
+class FunctionDeclaration extends Statement {
+  Variable variable;
+  final FunctionDefinition definition;
+  Statement next;
+
+  FunctionDeclaration(this.variable, this.definition, this.next) {
+    ++variable.writeCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitFunctionDeclaration(this);
+}
+
+/// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
+abstract class JumpTarget extends Statement {
+  Label get label;
+  Statement get body;
+}
+
+/**
+ * A labeled statement.  Breaks to the label within the labeled statement
+ * target the successor statement.
+ */
+class LabeledStatement extends JumpTarget {
+  Statement next;
+  final Label label;
+  Statement body;
+
+  LabeledStatement(this.label, this.body, this.next) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitLabeledStatement(this);
+}
+
+/// A [WhileTrue] or [WhileCondition] loop.
+abstract class Loop extends JumpTarget {
+}
+
+/**
+ * A labeled while(true) loop.
+ */
+class WhileTrue extends Loop {
+  final Label label;
+  Statement body;
+
+  WhileTrue(this.label, this.body) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
+}
+
+/**
+ * A while loop with a condition. If the condition is false, control resumes
+ * at the [next] statement.
+ *
+ * It is NOT valid to target this statement with a [Break].
+ * The only way to reach [next] is for the condition to evaluate to false.
+ *
+ * [WhileCondition] statements are introduced in the [LoopRewriter] and is
+ * assumed not to occur before then.
+ */
+class WhileCondition extends Loop {
+  final Label label;
+  Expression condition;
+  Statement body;
+  Statement next;
+
+  WhileCondition(this.label, this.condition, this.body,
+                 this.next) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
+}
+
+/// A [Break] or [Continue] statement.
+abstract class Jump extends Statement {
+  Label get target;
+}
+
+/**
+ * A break from an enclosing [LabeledStatement].  The break targets the
+ * labeled statement's successor statement.
+ */
+class Break extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Break(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitBreak(this);
+}
+
+/**
+ * A continue to an enclosing [WhileTrue] or [WhileCondition] loop.
+ * The continue targets the loop's body.
+ */
+class Continue extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Continue(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitContinue(this);
+}
+
+/**
+ * An assignments of an [Expression] to a [Variable].
+ *
+ * In contrast to the CPS-based IR, non-primitive expressions can be assigned
+ * to variables.
+ */
+class Assign extends Statement {
+  Statement next;
+  Variable variable;
+  Expression definition;
+
+  /// If true, this declares a new copy of the closure variable.
+  /// The consequences are similar to [cps_ir.SetClosureVariable].
+  /// All uses of the variable must be nested inside the [next] statement.
+  bool isDeclaration;
+
+  Assign(this.variable, this.definition, this.next,
+         { this.isDeclaration: false }) {
+    variable.writeCount++;
+  }
+
+  bool get hasExactlyOneUse => variable.readCount == 1;
+
+  accept(StatementVisitor visitor) => visitor.visitAssign(this);
+}
+
+/**
+ * A return exit from the function.
+ *
+ * In contrast to the CPS-based IR, the return value is an arbitrary
+ * expression.
+ */
+class Return extends Statement {
+  /// Should not be null. Use [Constant] with [NullConstant] for void returns.
+  Expression value;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Return(this.value);
+
+  accept(StatementVisitor visitor) => visitor.visitReturn(this);
+}
+
+/**
+ * A conditional branch based on the true value of an [Expression].
+ */
+class If extends Statement {
+  Expression condition;
+  Statement thenStatement;
+  Statement elseStatement;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  If(this.condition, this.thenStatement, this.elseStatement);
+
+  accept(StatementVisitor visitor) => visitor.visitIf(this);
+}
+
+class ExpressionStatement extends Statement {
+  Statement next;
+  Expression expression;
+
+  ExpressionStatement(this.expression, this.next);
+
+  accept(StatementVisitor visitor) => visitor.visitExpressionStatement(this);
+}
+
+class FunctionDefinition extends Node {
+  final FunctionElement element;
+  final List<Variable> parameters;
+  Statement body;
+  final List<ConstDeclaration> localConstants;
+  final List<ConstExp> defaultParameterValues;
+
+  FunctionDefinition(this.element, this.parameters, this.body,
+      this.localConstants, this.defaultParameterValues);
+}
+
+abstract class ExpressionVisitor<E> {
+  E visitExpression(Expression e) => e.accept(this);
+  E visitVariable(Variable node);
+  E visitInvokeStatic(InvokeStatic node);
+  E visitInvokeMethod(InvokeMethod node);
+  E visitInvokeSuperMethod(InvokeSuperMethod node);
+  E visitInvokeConstructor(InvokeConstructor node);
+  E visitConcatenateStrings(ConcatenateStrings node);
+  E visitConstant(Constant node);
+  E visitThis(This node);
+  E visitReifyTypeVar(ReifyTypeVar node);
+  E visitConditional(Conditional node);
+  E visitLogicalOperator(LogicalOperator node);
+  E visitNot(Not node);
+  E visitLiteralList(LiteralList node);
+  E visitLiteralMap(LiteralMap node);
+  E visitTypeOperator(TypeOperator node);
+  E visitFunctionExpression(FunctionExpression node);
+}
+
+abstract class StatementVisitor<S> {
+  S visitStatement(Statement s) => s.accept(this);
+  S visitLabeledStatement(LabeledStatement node);
+  S visitAssign(Assign node);
+  S visitReturn(Return node);
+  S visitBreak(Break node);
+  S visitContinue(Continue node);
+  S visitIf(If node);
+  S visitWhileTrue(WhileTrue node);
+  S visitWhileCondition(WhileCondition node);
+  S visitFunctionDeclaration(FunctionDeclaration node);
+  S visitExpressionStatement(ExpressionStatement node);
+}
+
+abstract class Visitor<S,E> implements ExpressionVisitor<E>,
+                                       StatementVisitor<S> {
+   E visitExpression(Expression e) => e.accept(this);
+   S visitStatement(Statement s) => s.accept(this);
+}
+
+class RecursiveVisitor extends Visitor {
+  visitFunctionDefinition(FunctionDefinition node) {
+    visitStatement(node.body);
+  }
+
+  visitVariable(Variable node) {}
+
+  visitInvokeStatic(InvokeStatic node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeMethod(InvokeMethod node) {
+    visitExpression(node.receiver);
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeSuperMethod(InvokeSuperMethod node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitInvokeConstructor(InvokeConstructor node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitConcatenateStrings(ConcatenateStrings node) {
+    node.arguments.forEach(visitExpression);
+  }
+
+  visitConstant(Constant node) {}
+
+  visitThis(This node) {}
+
+  visitReifyTypeVar(ReifyTypeVar node) {}
+
+  visitConditional(Conditional node) {
+    visitExpression(node.condition);
+    visitExpression(node.thenExpression);
+    visitExpression(node.elseExpression);
+  }
+
+  visitLogicalOperator(LogicalOperator node) {
+    visitExpression(node.left);
+    visitExpression(node.right);
+  }
+
+  visitNot(Not node) {
+    visitExpression(node.operand);
+  }
+
+  visitLiteralList(LiteralList node) {
+    node.values.forEach(visitExpression);
+  }
+
+  visitLiteralMap(LiteralMap node) {
+    for (int i=0; i<node.keys.length; i++) {
+      visitExpression(node.keys[i]);
+      visitExpression(node.values[i]);
+    }
+  }
+
+  visitTypeOperator(TypeOperator node) {
+    visitExpression(node.receiver);
+  }
+
+  visitFunctionExpression(FunctionExpression node) {
+    visitFunctionDefinition(node.definition);
+  }
+
+  visitLabeledStatement(LabeledStatement node) {
+    visitStatement(node.body);
+    visitStatement(node.next);
+  }
+
+  visitAssign(Assign node) {
+    visitExpression(node.definition);
+    visitVariable(node.variable);
+    visitStatement(node.next);
+  }
+
+  visitReturn(Return node) {
+    visitExpression(node.value);
+  }
+
+  visitBreak(Break node) {}
+
+  visitContinue(Continue node) {}
+
+  visitIf(If node) {
+    visitExpression(node.condition);
+    visitStatement(node.thenStatement);
+    visitStatement(node.elseStatement);
+  }
+
+  visitWhileTrue(WhileTrue node) {
+    visitStatement(node.body);
+  }
+
+  visitWhileCondition(WhileCondition node) {
+    visitExpression(node.condition);
+    visitStatement(node.body);
+    visitStatement(node.next);
+  }
+
+  visitFunctionDeclaration(FunctionDeclaration node) {
+    visitFunctionDefinition(node.definition);
+    visitStatement(node.next);
+  }
+
+  visitExpressionStatement(ExpressionStatement node) {
+    visitExpression(node.expression);
+    visitStatement(node.next);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
similarity index 99%
rename from sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
rename to sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
index c78d458..2310733 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_ir_tracer.dart
@@ -2,11 +2,11 @@
 // 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 dart_backend.tracer;
+library tree_ir_tracer;
 
 import 'dart:async' show EventSink;
 import '../tracer.dart';
-import 'dart_tree.dart';
+import 'tree_ir_nodes.dart';
 
 class Block {
   Label label;
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index dffcbb9..688ff66 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -687,6 +687,7 @@
   }
 
   void ensureMetadataResolved(Compiler compiler) {
+    if (compiler.mainApp == null) return;
     _allDeferredImports[_fakeMainImport] = compiler.mainApp;
     var lastDeferred;
     // When detecting duplicate prefixes of deferred libraries there are 4
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 06195fe..7360feb 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -22,37 +22,14 @@
 import 'deferred_load.dart' show OutputUnit;
 import 'js_backend/js_backend.dart' show JavaScriptBackend;
 import 'js/js.dart' as jsAst;
-
-// TODO (sigurdm): A search function.
-// TODO (sigurdm): Output size of classes.
-// TODO (sigurdm): Print that we dumped the HTML-file.
-// TODO (sigurdm): Include why a given element was included in the output.
-// TODO (sigurdm): Include how much output grew because of mirror support.
-// TODO (sigurdm): Write each function with parameter names.
-// TODO (sigurdm): Write how much space the boilerplate takes.
-// TODO (sigurdm): Include javascript names of entities in the output.
-
-const List<String> COLORS = const [
-    "#fff",
-    "#8dd3c7",
-    "#ffffb3",
-    "#bebada",
-    "#fb8072",
-    "#80b1d3",
-    "#fdb462",
-    "#b3de69",
-    "#fccde5",
-    "#d9d9d9",
-    "#bc80bd",
-    "#ccebc5",
-    "#ffed6f"];
+import 'compilation_info.dart' show CompilationInformation;
 
 class CodeSizeCounter {
   final Map<Element, int> generatedSize = new Map<Element, int>();
 
   int getGeneratedSizeOf(Element element) {
     int result = generatedSize[element];
-    return result == null ? 0 : result;
+    return result == null ? 0: result;
   }
 
   void countCode(Element element, int added) {
@@ -61,709 +38,406 @@
   }
 }
 
-tag(String element) {
-  return (String content, {String cls}) {
-    String classString = cls == null ? '' : ' class="$cls"';
-    return '<$element$classString>$content</$element>';
-  };
-}
+/// Maps elements to an id.  Supports lookups in
+/// both directions.
+class ElementMapper {
+  Map<int, Element> _idToElement = {};
+  Map<Element, int> _elementToId = {};
+  int _idCounter = 0;
+  String name;
 
-var div = tag('div');
-var span = tag('span');
-var code = tag('code');
-var h2 = tag('h2');
+  ElementMapper(this.name);
 
-var esc = const HtmlEscape().convert;
-
-String sizeDescription(int size, ProgramInfo programInfo) {
-  if (size == null) {
-    return '';
-  }
-  return span(span(size.toString(), cls: 'value') +
-      ' bytes (${size * 100 ~/ programInfo.size}%)', cls: 'size');
-}
-
-String sizePercent(int size, ProgramInfo programInfo) {
-  if (size == null) {
-    return "0.000%";
-  } else {
-    return (100 * size / programInfo.size).toStringAsFixed(3) + "%";
-  }
-}
-
-/// An [InfoNode] holds information about a part the program.
-abstract class InfoNode {
-  String get name;
-
-  int get size;
-
-  void emitHtml(ProgramInfo programInfo, StringSink buffer,
-      [String indentation = '']);
-
-  Map<String, dynamic> toJson(ProgramInfo programInfo);
-}
-
-/// An [ElementNode] holds information about an [Element]
-class ElementInfoNode implements InfoNode {
-  /// The name of the represented [Element].
-  final String name;
-
-  /// The kind of the [Element] represented.  This is presented to the
-  /// user, so it might be more specific than [element.kind].
-  final String kind;
-
-  /// The static type of the represented [Element].
-  /// [:null:] if this kind of element has no type.
-  final String type;
-
-  /// Any extra information to display about the represented [Element].
-  final String extra;
-
-  /// A textual description of the modifiers (such as "static", "abstract") of
-  /// the represented [Element].
-  final String modifiers;
-
-  /// Describes how many bytes the code for the represented [Element] takes up
-  /// in the output.
-  final int size;
-
-  /// Subnodes containing more detailed information about the represented
-  /// [Element], and its members.
-  List<InfoNode> contents;
-
-  /// Subnodes containing more detailed information about the represented
-  /// [Element], and its members.
-  int outputUnitId;
-
-  ElementInfoNode({this.name: "",
-      this.kind: "",
-      this.type,
-      this.modifiers: "",
-      this.size,
-      this.contents,
-      this.extra: "",
-      this.outputUnitId});
-
-  Map<String, dynamic> toJson(ProgramInfo programInfo) {
-    Map<String, dynamic> json = <String, dynamic>{
-      'kind': this.kind,
-      'modifiers': this.modifiers,
-      'name': this.name,
-      'type': this.type,
-      'size': this.size,
-      'sizePercent': sizePercent(this.size, programInfo),
-      'extra': this.extra
-    };
-
-    if (this.contents != null) {
-      json['children'] =
-        this.contents.map((c) => c.toJson(programInfo)).toList();
+  String add(Element e) {
+    if (_elementToId.containsKey(e)) {
+      return name + "/${_elementToId[e]}";
     }
 
+    _idToElement[_idCounter] = e;
+    _elementToId[e] = _idCounter;
+    _idCounter += 1;
+    return name + "/${_idCounter - 1}";
+  }
+}
+
+class DividedElementMapper {
+  // Mappers for specific kinds of elements.
+  ElementMapper _library = new ElementMapper('library');
+  ElementMapper _typedef = new ElementMapper('typedef');
+  ElementMapper _field = new ElementMapper('field');
+  ElementMapper _class = new ElementMapper('class');
+  ElementMapper _function = new ElementMapper('function');
+
+  // Convert this database of elements into JSON for rendering
+  Map<String, dynamic> _toJson(ElementToJsonVisitor elementToJson) {
+    Map<String, dynamic> json = {};
+    var m = [_library, _typedef, _field, _class, _function];
+    for (ElementMapper mapper in m) {
+      Map<String, dynamic> innerMapper = {};
+      mapper._idToElement.forEach((k, v) {
+        // All these elements are already cached in the
+        // jsonCache, so this is just an access.
+        var elementJson = elementToJson.process(v);
+        if (elementJson != null) {
+          innerMapper["$k"] = elementJson;
+        }
+      });
+      json[mapper.name] = innerMapper;
+    }
     return json;
   }
+}
 
-  void emitHtml(ProgramInfo programInfo, StringSink buffer,
-      [String indentation = '']) {
-    String kindString = span(esc(kind), cls: 'kind');
-    String modifiersString = span(esc(modifiers), cls: "modifiers");
+class ElementToJsonVisitor extends ElementVisitor<Map<String, dynamic>> {
+  DividedElementMapper mapper = new DividedElementMapper();
+  Compiler compiler;
 
-    String nameString = span(esc(name), cls: 'name');
-    String typeString = type == null
-        ? ''
-        : span('/* ' + esc(type) + ' */', cls: 'type');
-    String extraString = span(esc(extra), cls: 'type');
-    String describe = [
-        kindString,
-        typeString,
-        modifiersString,
-        nameString,
-        sizeDescription(size, programInfo),
-        extraString].join(' ');
+  CompilationInformation compilationInfo;
 
-    if (contents != null) {
-      String outputUnitClass = outputUnitId == null
-          ? ""
-          : " outputUnit${outputUnitId % COLORS.length}";
-      buffer.write(indentation);
-      buffer.write('<div class="container$outputUnitClass">\n');
-      buffer.write('$indentation  ');
-      buffer.write(div('+$describe', cls: "details"));
-      buffer.write('\n');
-      buffer.write('$indentation  <div class="contents">');
-      if (contents.isEmpty) {
-        buffer.write('No members</div>');
-      } else {
-        buffer.write('\n');
-        for (InfoNode subElementDescription in contents) {
-          subElementDescription.emitHtml(programInfo, buffer,
-              indentation + '    ');
-        }
-        buffer.write("\n$indentation  </div>");
-      }
-      buffer.write("\n$indentation</div>\n");
-    } else {
-      buffer.writeln(div('$describe', cls: "element"));
+  Map<Element, Map<String, dynamic>> jsonCache = {};
+  Map<Element, jsAst.Expression> codeCache;
+
+  int programSize;
+  DateTime compilationMoment;
+  String dart2jsVersion;
+  Duration compilationDuration;
+  Duration dumpInfoDuration;
+
+  ElementToJsonVisitor(Compiler compiler) {
+    this.compiler = compiler;
+    this.compilationInfo = compiler.enqueuer.codegen.compilationInfo;
+
+    programSize = compiler.assembledCode.length;
+    compilationMoment = new DateTime.now();
+    dart2jsVersion = compiler.hasBuildId ? compiler.buildId : null;
+    compilationDuration = compiler.totalCompileTime.elapsed;
+
+    for (var library in compiler.libraryLoader.libraries.toList()) {
+      library.accept(this);
     }
-  }
-}
 
-/// A [CodeInfoNode] holds information about a piece of code.
-class CodeInfoNode implements InfoNode {
-  /// A short description of the code.
-  final String description;
-
-  final String generatedCode;
-
-  get size => generatedCode.length;
-
-  get name => "";
-
-  CodeInfoNode({this.description: "", this.generatedCode});
-
-  void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
-      [String indentation = '']) {
-    buffer.write(indentation);
-    buffer.write(div(description + ' ' +
-                     sizeDescription(generatedCode.length, programInfo),
-                     cls: 'kind') +
-        code(esc(generatedCode)));
-    buffer.write('\n');
+    dumpInfoDuration = new DateTime.now().difference(compilationMoment);
   }
 
-  Map<String, dynamic> toJson(ProgramInfo programInfo) {
-    return <String, dynamic>{
-      'kind': 'code',
-      'description': description,
-      'code': generatedCode,
-      'size': generatedCode.length,
-      'sizePercent': sizePercent(generatedCode.length, programInfo)
-    };
+  // If keeping the element is in question (like if a function has a size
+  // of zero), only keep it if it holds dependencies to elsewhere.
+  bool shouldKeep(Element element) {
+    return compilationInfo.addsToWorkListMap.containsKey(element) ||
+           compilationInfo.enqueuesMap.containsKey(element);
   }
-}
-
-/// Instances represent information inferred about the program such as
-/// inferred type information or inferred side effects.
-class InferredInfoNode implements InfoNode {
-  /// Text describing the represented information.
-  final String description;
-
-  /// The name of the entity this information is inferred about (for example the
-  /// name of a parameter).
-  final String name;
-
-  /// The inferred type/side effect.
-  final String type;
-
-  get size => 0;
-
-  InferredInfoNode({this.name: "", this.description, this.type});
-
-  Map<String, dynamic> toJson(ProgramInfo programInfo) {
-    return <String, dynamic>{
-      'kind': 'inferred',
-      'name': name,
-      'type': type,
-      'desc': description
-    };
-  }
-
-  void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
-      [String indentation = '']) {
-    buffer.write(indentation);
-    buffer.write(
-        div('${span("Inferred " + description, cls: "kind")} '
-            '${span(esc(name), cls: "name")} '
-            '${span(esc(type), cls: "type")} ',
-            cls: "attr"));
-    buffer.write('\n');
-  }
-}
-
-/// Instances represent information about a program.
-class ProgramInfo {
-  /// A list of all the libraries in the program to show information about.
-  final List<InfoNode> libraries;
-
-  /// The size of the whole program in bytes.
-  final int size;
-
-  /// The time the compilation took place.
-  final DateTime compilationMoment;
-
-  /// The time the compilation took to complete.
-  final Duration compilationDuration;
-
-  /// The version of dart2js used to compile the program.
-  final String dart2jsVersion;
-
-  final Map<OutputUnit, int> outputUnitNumbering;
-
-  ProgramInfo({this.libraries,
-               this.size,
-               this.compilationMoment,
-               this.compilationDuration,
-               this.dart2jsVersion,
-               this.outputUnitNumbering: null});
 
   Map<String, dynamic> toJson() {
-    return <String, dynamic>{
-      'program_size': size,
-      'compile_time': compilationMoment.toString(),
-      'compile_duration': compilationDuration.toString(),
-      'dart2js_version': dart2jsVersion
-    };
-  }
-}
-
-class InfoDumpVisitor extends ElementVisitor<InfoNode> {
-  final Compiler compiler;
-
-  /// Contains the elements visited on the path from the library to here.
-  final List<Element> stack = new List<Element>();
-
-  final Map<OutputUnit, int> outputUnitNumbering = new Map<OutputUnit, int>();
-
-  Element get currentElement => stack.last;
-
-  InfoDumpVisitor(Compiler this.compiler);
-
-  ProgramInfo collectDumpInfo() {
-    JavaScriptBackend backend = compiler.backend;
-
-    int counter = 0;
-    for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
-      outputUnitNumbering[outputUnit] = counter;
-      counter += 1;
-    }
-
-    List<LibraryElement> sortedLibraries =
-        compiler.libraryLoader.libraries.toList();
-    sortedLibraries.sort((LibraryElement l1, LibraryElement l2) {
-      if (l1.isPlatformLibrary && !l2.isPlatformLibrary) {
-        return 1;
-      } else if (!l1.isPlatformLibrary && l2.isPlatformLibrary) {
-        return -1;
-      }
-      return l1.getLibraryName().compareTo(l2.getLibraryName());
-    });
-
-    List<InfoNode> libraryInfos = new List<InfoNode>();
-    libraryInfos.addAll(sortedLibraries
-        .map((library) => visit(library))
-        .where((info) => info != null));
-
-    return new ProgramInfo(
-        compilationDuration: compiler.totalCompileTime.elapsed,
-        // TODO (sigurdm): Also count the size of deferred code
-        size: compiler.assembledCode.length,
-        libraries: libraryInfos,
-        compilationMoment: new DateTime.now(),
-        dart2jsVersion: compiler.hasBuildId ? compiler.buildId : null,
-        outputUnitNumbering: outputUnitNumbering);
+    return mapper._toJson(this);
   }
 
-  InfoNode visitElement(Element element) {
-    compiler.internalError(element,
-        "This element of kind ${element.kind} "
-        "does not support --dump-info");
+  // Memoization of the JSON creating process.
+  Map<String, dynamic> process(Element element) {
+    return jsonCache.putIfAbsent(element, () => element.accept(this));
+  }
+
+  Map<String, dynamic> visitElement(Element element) {
     return null;
   }
 
-  InfoNode visitLibraryElement(LibraryElement element) {
-    List<InfoNode> contents = new List<InfoNode>();
-    int size = compiler.dumpInfoTask.codeSizeCounter
-        .getGeneratedSizeOf(element);
-    if (size == 0) return null;
-    stack.add(element);
-    // For some reason the patch library contains the origin libraries members,
-    // but the origin library does not contain the patch members.
-    LibraryElement contentsLibrary = element.isPatched
-        ? element.patch
-        : element;
-    contentsLibrary.forEachLocalMember((Element member) {
-      InfoNode info = member.accept(this);
-      if (info != null) {
-        contents.add(info);
-      }
-    });
-    stack.removeLast();
-    String nameString = element.getLibraryName() == ""
-        ? "<unnamed>"
-        : element.getLibraryName();
-    contents.sort((InfoNode e1, InfoNode e2) {
-      return e1.name.compareTo(e2.name);
-    });
-    return new ElementInfoNode(
-        extra: "${element.canonicalUri}",
-        kind: "library",
-        name: nameString,
-        size: size,
-        modifiers: "",
-        contents: contents);
+  Map<String, dynamic> visitConstructorBodyElement(ConstructorBodyElement e) {
+    return visitFunctionElement(e.constructor);
   }
 
-  InfoNode visitTypedefElement(TypedefElement element) {
+  Map<String, dynamic> visitLibraryElement(LibraryElement element) {
+    var id = mapper._library.add(element);
+    List<String> children = <String>[];
+
+    String libname = element.getLibraryName();
+    libname = libname == "" ? "<unnamed>" : libname;
+
+    int size =
+      compiler.dumpInfoTask.codeSizeCounter.getGeneratedSizeOf(element);
+
+    LibraryElement contentsOfLibrary = element.isPatched
+      ? element.patch : element;
+    contentsOfLibrary.forEachLocalMember((Element member) {
+      Map<String, dynamic> childJson = this.process(member);
+      if (childJson == null) return;
+      children.add(childJson['id']);
+    });
+
+    if (children.length == 0 && !shouldKeep(element)) {
+      return null;
+    }
+
+    return {
+      'kind': 'library',
+      'name': libname,
+      'size': size,
+      'id': id,
+      'children': children
+    };
+  }
+
+  Map<String, dynamic> visitTypedefElement(TypedefElement element) {
+    String id = mapper._typedef.add(element);
     return element.alias == null
-        ? null
-        : new ElementInfoNode(
-            type: element.alias.toString(),
-            kind: "typedef",
-            name: element.name);
+      ? null
+      : {
+        'id': id,
+        'type': element.alias.toString(),
+        'kind': 'typedef',
+        'name': element.name
+      };
   }
 
-  InfoNode visitFieldElement(FieldElement element) {
+  Map<String, dynamic> visitFieldElement(FieldElement element) {
+    String id = mapper._field.add(element);
+    List<String> children = [];
     CodeBuffer emittedCode = compiler.dumpInfoTask.codeOf(element);
-    TypeMask inferredType = compiler.typesTask
-        .getGuaranteedTypeOfElement(element);
+
     // If a field has an empty inferred type it is never used.
-    // Also constant fields do not get output as fields.
+    TypeMask inferredType =
+      compiler.typesTask.getGuaranteedTypeOfElement(element);
     if (inferredType == null || inferredType.isEmpty || element.isConst) {
       return null;
     }
+
     int size = 0;
-    DartType type = element.type;
-    List<InfoNode> contents = new List<InfoNode>();
+    String code;
+
     if (emittedCode != null) {
-      contents.add(new CodeInfoNode(
-          description: "Generated initializer",
-          generatedCode: emittedCode.getText()));
-      size = emittedCode.length;
+      size += emittedCode.length;
+      code = emittedCode.getText();
     }
-    if (inferredType != null) {
-      contents.add(new InferredInfoNode(
-          description: "type",
-          type: inferredType.toString()));
-      stack.add(element);
-    }
+
     for (Element closure in element.nestedClosures) {
-      InfoNode info = closure.accept(this);
-      if (info != null) {
-        contents.add(info);
-        size += info.size;
+      var childJson = this.process(closure);
+      if (childJson != null) {
+        children.add(childJson['id']);
+        if (childJson.containsKey('size')) {
+          size += childJson['size'];
+        }
       }
     }
-    stack.removeLast();
 
-    return new ElementInfoNode(
-        kind: "field",
-        type: "$type",
-        name: element.name,
-        size: size,
-        modifiers: modifiersToString(isStatic: element.isStatic,
-                                     isFinal: element.isFinal,
-                                     isConst: element.isConst),
-        contents: contents,
-        outputUnitId: outputUnitId(element));
+    return {
+      'id': id,
+      'kind': 'field',
+      'type': element.type.toString(),
+      'inferredType': inferredType.toString(),
+      'name': element.name,
+      'children': children,
+      'size': size,
+      'code': code
+    };
   }
 
-  int outputUnitId(Element element) {
-    OutputUnit outputUnit =
-            compiler.deferredLoadTask.outputUnitForElement(element);
-    return outputUnitNumbering[outputUnit];
-  }
+  Map<String, dynamic> visitClassElement(ClassElement element) {
+    String id = mapper._class.add(element);
+    List<String> children = [];
 
-  InfoNode visitClassElement(ClassElement element) {
-    // If the element is not emitted in the program, we omit it from the output.
+    int size = compiler.dumpInfoTask.codeSizeCounter.getGeneratedSizeOf(element);
+
+    // Omit element if it is not needed.
     JavaScriptBackend backend = compiler.backend;
     if (!backend.emitter.neededClasses.contains(element)) return null;
-    String modifiersString = modifiersToString(isAbstract: element.isAbstract);
-    String supersString = element.allSupertypes == null ? "" :
-        "implements ${element.allSupertypes}";
-    List contents = [];
-    stack.add(element);
+    Map<String, dynamic> modifiers = { 'abstract': element.isAbstract };
+
     element.forEachLocalMember((Element member) {
-      InfoNode info = member.accept(this);
-      if (info != null) {
-        contents.add(info);
+      Map<String, dynamic> childJson = this.process(member);
+      if (childJson != null) {
+        children.add(childJson['id']);
       }
     });
-    stack.removeLast();
-    contents.sort((InfoNode n1, InfoNode n2) {
-      return n1.name.compareTo(n2.name);
-    });
-    return new ElementInfoNode(
-        kind: "class",
-        name: element.name,
-        extra: supersString,
-        modifiers: modifiersString,
-        contents: contents,
-        outputUnitId: outputUnitId(element));
+
+    return {
+      'name': element.name,
+      'size': size,
+      'kind': 'class',
+      'modifiers': modifiers,
+      'children': children,
+      'id': id
+    };
   }
 
-  InfoNode visitFunctionElement(FunctionElement element) {
+  Map<String, dynamic> visitFunctionElement(FunctionElement element) {
+    String id = mapper._function.add(element);
+    String name = element.name;
+    String kind = "function";
+    List<String> children = [];
+    List<Map<String, dynamic>> parameters = [];
+    String inferredReturnType = null;
+    String returnType = null;
+    String sideEffects = null;
+    String code = "";
+
     CodeBuffer emittedCode = compiler.dumpInfoTask.codeOf(element);
     int size = 0;
-    String nameString = element.name;
-    String modifiersString = modifiersToString(
-        isStatic: element.isStatic,
-        isConst: element.isConst,
-        isFactory: element.isFactoryConstructor,
-        isExternal: element.isPatched);
-    String kindString = "function";
-    if (currentElement.isClass) {
-      kindString = "method";
-    } else if (currentElement.isField ||
-               currentElement.isFunction ||
-               currentElement.isConstructor) {
-      kindString = "closure";
-      nameString = "<unnamed>";
+
+    Map<String, dynamic> modifiers = {
+      'static': element.isStatic,
+      'const': element.isConst,
+      'factory': element.isFactoryConstructor,
+      'external': element.isPatched
+    };
+
+    var enclosingElement = element.enclosingElement;
+    if (enclosingElement.isField ||
+               enclosingElement.isFunction ||
+               element.isClosure ||
+               enclosingElement.isConstructor) {
+      kind = "closure";
+      name = "<unnamed>";
+    } else if (enclosingElement.isClass) {
+      kind = 'method';
     }
+
     if (element.isConstructor) {
-      nameString = element.name == ""
-          ? "${element.enclosingClass.name}"
-          : "${element.enclosingClass.name}.${element.name}";
-      kindString = "constructor";
+      name == ""
+        ? "${element.enclosingElement.name}"
+        : "${element.enclosingElement.name}.${element.name}";
+      kind = "constructor";
     }
-    List contents = [];
+
     if (emittedCode != null) {
       FunctionSignature signature = element.functionSignature;
+      returnType = signature.type.returnType.toString();
       signature.forEachParameter((parameter) {
-        contents.add(new InferredInfoNode(
-            description: "parameter",
-            name: parameter.name,
-            type: compiler.typesTask
-              .getGuaranteedTypeOfElement(parameter).toString()));
+        parameters.add({
+          'name': parameter.name,
+          'type': compiler.typesTask
+            .getGuaranteedTypeOfElement(parameter).toString()
+        });
       });
-      contents.add(new InferredInfoNode(
-          description: "return type",
-          type: compiler.typesTask
-            .getGuaranteedReturnTypeOfElement(element).toString()));
-      contents.add(new InferredInfoNode(
-        description: "side effects",
-        type: compiler.world
-            .getSideEffectsOfElement(element).toString()));
-      contents.add(new CodeInfoNode(
-          description: "Generated code",
-          generatedCode: emittedCode.getText()));
-      size += emittedCode.length;
+      inferredReturnType = compiler.typesTask
+        .getGuaranteedReturnTypeOfElement(element).toString();
+      sideEffects = compiler.world.getSideEffectsOfElement(element).toString();
+      code = emittedCode.getText();
+      size += code.length;
     }
-    stack.add(element);
+
     for (Element closure in element.nestedClosures) {
-      InfoNode info = closure.accept(this);
-      if (info != null) {
-        contents.add(info);
-        size += info.size;
+      Map<String, dynamic> child = this.process(closure);
+      if (child != null) {
+        children.add(child['id']);
+        size += child['size'];
       }
     }
-    stack.removeLast();
-    if (size == 0) {
+
+    if (size == 0 && !shouldKeep(element)) {
       return null;
     }
 
-    return new ElementInfoNode(
-        type: element.computeType(compiler).toString(),
-        kind: kindString,
-        name: nameString,
-        size: size,
-        modifiers: modifiersString,
-        contents: contents,
-        outputUnitId: outputUnitId(element));
+    return {
+      'kind': kind,
+      'name': name,
+      'id': id,
+      'modifiers': modifiers,
+      'children': children,
+      'size': size,
+      'returnType': returnType,
+      'inferredReturnType': inferredReturnType,
+      'parameters': parameters,
+      'sideEffects': sideEffects,
+      'code': code,
+      'type': element.computeType(compiler).toString()
+    };
   }
 }
 
+
 class DumpInfoTask extends CompilerTask {
   DumpInfoTask(Compiler compiler)
-      : infoDumpVisitor = new InfoDumpVisitor(compiler),
-        super(compiler);
+      : super(compiler);
 
   String name = "Dump Info";
 
   final CodeSizeCounter codeSizeCounter = new CodeSizeCounter();
 
-  final InfoDumpVisitor infoDumpVisitor;
+  ElementToJsonVisitor infoCollector;
 
-  final Map<Element, jsAst.Expression>_generatedCode =
-      new Map<Element, jsAst.Expression>();
+  final Map<Element, jsAst.Expression> _generatedCode = {};
 
-  /// Registers that [code] has been generated for [element] so that it can be
-  /// emitted in the info.html.
   void registerGeneratedCode(Element element, jsAst.Expression code) {
     if (compiler.dumpInfo) {
       _generatedCode[element] = code;
     }
   }
 
-  CodeBuffer codeOf(Element element) {
-    jsAst.Expression code = _generatedCode[element];
-    return code != null
-        ? jsAst.prettyPrint(code, compiler)
-        : compiler.backend.codeOf(element);
+
+  void collectInfo() {
+    infoCollector = new ElementToJsonVisitor(compiler);
   }
 
   void dumpInfo() {
     measure(() {
-      ProgramInfo info = infoDumpVisitor.collectDumpInfo();
-
-      StringBuffer htmlBuffer = new StringBuffer();
-      dumpInfoHtml(info, htmlBuffer);
-      compiler.outputProvider('', 'info.html')
-        ..add(htmlBuffer.toString())
-        ..close();
+      if (infoCollector == null) {
+        collectInfo();
+      }
 
       StringBuffer jsonBuffer = new StringBuffer();
-      dumpInfoJson(info, jsonBuffer);
+      dumpInfoJson(jsonBuffer);
       compiler.outputProvider('', 'info.json')
         ..add(jsonBuffer.toString())
         ..close();
     });
   }
 
-  void dumpInfoJson(ProgramInfo info, StringSink buffer) {
-    Map<String, dynamic> entire = <String, dynamic>{
-      'program': info.toJson(),
-      'libs': info.libraries.map((lib) => lib.toJson(info)).toList()
-    };
+  CodeBuffer codeOf(Element element) {
+    jsAst.Expression code = _generatedCode[element];
+    return code != null
+      ? jsAst.prettyPrint(code, compiler)
+      : compiler.backend.codeOf(element);
+  }
 
+  void dumpInfoJson(StringSink buffer) {
     JsonEncoder encoder = const JsonEncoder();
+
+    // `A` uses and depends on the functions `Bs`.
+    //     A         Bs
+    Map<String, List<String>> holding = <String, List<String>>{};
+
+    DateTime startToJsonTime = new DateTime.now();
+
+    CompilationInformation compilationInfo =
+      infoCollector.compiler.enqueuer.codegen.compilationInfo;
+    compilationInfo.addsToWorkListMap.forEach((func, deps) {
+      if (func != null) {
+        var funcJson = infoCollector.process(func);
+        if (funcJson != null) {
+          var funcId = funcJson['id'];
+
+          List<String> heldList = <String>[];
+
+          for (var held in deps) {
+            // "process" to get the ids of the elements.
+            var heldJson = infoCollector.process(held);
+            if (heldJson != null) {
+              var heldId = heldJson['id'];
+              heldList.add(heldId);
+            }
+          }
+          holding[funcId] = heldList;
+        }
+      }
+    });
+
+    Map<String, dynamic> outJson = {};
+    outJson['elements'] = infoCollector.toJson();
+    outJson['holding'] = holding;
+    outJson['dump_version'] = 1;
+
+    Duration toJsonDuration = new DateTime.now().difference(startToJsonTime);
+
+    Map<String, dynamic> generalProgramInfo = <String, dynamic>{};
+    generalProgramInfo['size'] = infoCollector.programSize;
+    generalProgramInfo['dart2jsVersion'] = infoCollector.dart2jsVersion;
+    generalProgramInfo['compilationMoment'] = infoCollector.compilationMoment.toString();
+    generalProgramInfo['compilationDuration'] = infoCollector.compilationDuration.toString();
+    generalProgramInfo['toJsonDuration'] = toJsonDuration.toString();
+    generalProgramInfo['dumpInfoDuration'] = infoCollector.dumpInfoDuration.toString();
+
+    outJson['program'] = generalProgramInfo;
+
     ChunkedConversionSink<Object> sink =
       encoder.startChunkedConversion(
           new StringConversionSink.fromStringSink(buffer));
-    sink.add(entire);
-  }
-
-  void dumpInfoHtml(ProgramInfo info, StringSink buffer) {
-    int totalSize = info.size;
-
-    buffer.writeln("""
-<html>
-  <head>
-    <title>Dart2JS compilation information</title>
-       <style>
-        code {margin-left: 20px; display: block; white-space: pre; }
-        div.container, div.contained, div.element, div.attr {
-          margin-top:0px;
-          margin-bottom: 0px;
-        }
-        div.container, div.element, div.attr {
-          white-space: nowrap;
-        }
-        .contents {
-          margin-left: 20px;
-        }
-        div.contained {margin-left: 20px;}
-        div {/*border: 1px solid;*/}
-        span.kind {}
-        span.modifiers {font-weight:bold;}
-        span.name {font-weight:bold; font-family: monospace;}
-        span.type {font-family: monospace; color:blue;}
-""");
-    for (int i = 0; i < COLORS.length; i++) {
-      buffer.writeln("        .outputUnit$i "
-          "{border-left: 4px solid ${COLORS[i]}}");
-    }
-    buffer.writeln("""
-       </style>
-     </head>
-     <body>
-       <h1>Dart2js compilation information</h1>""");
-    if (info.outputUnitNumbering.length > 1) {
-      for (OutputUnit outputUnit in info.outputUnitNumbering.keys) {
-        String color = COLORS[info.outputUnitNumbering[outputUnit]
-             % COLORS.length];
-        JavaScriptBackend backend = compiler.backend;
-        int size = backend.emitter.outputBuffers[outputUnit].length;
-        buffer.writeln('<div style='
-            '"background:$color;">'
-            '${outputUnit.partFileName(compiler)} $size bytes</div>');
-      }
-    }
-    buffer.writeln(h2('Compilation took place: '
-                      '${info.compilationMoment}'));
-    buffer.writeln(h2('Compilation took: '
-                      '${info.compilationDuration.inSeconds} seconds'));
-    buffer.writeln(h2('Output size: ${info.size} bytes'));
-    if (info.dart2jsVersion != null) {
-      buffer.writeln(h2('Dart2js version: ${info.dart2jsVersion}'));
-    }
-
-    buffer.writeln('<a href="#" class="sort_by_size">Sort by size</a>\n');
-
-    buffer.writeln('<div class="contents">');
-    info.libraries.forEach((InfoNode node) {
-      node.emitHtml(info, buffer);
-    });
-    buffer.writeln('</div>');
-
-    // TODO (sigurdm): This script should be written in dart
-    buffer.writeln(r"""
-    <script type="text/javascript">
-      function toggler(element) {
-        return function(e) {
-          element.hidden = !element.hidden;
-        };
-      }
-      var containers = document.getElementsByClassName('container');
-      for (var i = 0; i < containers.length; i++) {
-        var container = containers[i];
-        container.querySelector('.details').addEventListener('click',
-          toggler(container.querySelector('.contents')), false);
-        container.querySelector('.contents').hidden = true;
-      }
-
-      function sortBySize() {
-        var toSort = document.querySelectorAll('.contents');
-        for (var i = 0; i < toSort.length; ++i) {
-          sortNodes(toSort[i], function(a, b) {
-            if (a[1] !== b[1]) {
-              return a[1] > b[1] ? -1 : 1;
-            }
-            return a[2] === b[2] ? 0 : a[2] > b[2] ? 1 : -1;
-          });
-        }
-      }
-
-      function findSize(node) {
-        var size = 0;
-        var details = node.querySelector('.details');
-        if (details) {
-          var sizeElement = details.querySelector('.size');
-          if (sizeElement) {
-            size = parseInt(sizeElement.textContent);
-          } else {
-            // For classes, sum up the contents for sorting purposes.
-            var kind = details.querySelector('.kind');
-            if (kind && kind.textContent === 'class') {
-              var contents = node.querySelector('.contents');
-              if (contents) {
-                var child = contents.firstElementChild;
-                while (child) {
-                  size += findSize(child);
-                  child = child.nextElementSibling;
-                }
-              }
-            }
-          }
-        }
-        return size;
-      }
-
-      function findName(node) {
-        var name = '';
-        var nameNode = node.querySelector('.name');
-        if (nameNode) {
-          return nameNode.textContent;
-        }
-        return node.textContent;
-      }
-      function sortNodes(node, fn) {
-        var items = [];
-        var child = node.firstElementChild;
-        while (child) {
-          items.push([child, findSize(child), findName(child)]);
-          child = child.nextElementSibling;
-        }
-        items.sort(fn);
-        for (var i = 0; i < items.length; ++i) {
-          node.appendChild(items[i][0]);
-        }
-      }
-      document.querySelector('.sort_by_size').addEventListener('click',
-          function() {
-            sortBySize();
-          }, false);
-    </script>
-  </body>
-</html>""");
+    sink.add(outJson);
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 572d8b1..9d416c9 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -129,6 +129,30 @@
   toString() => id;
 }
 
+/// Abstract interface for entities.
+///
+/// Implement this directly if the entity is not a Dart language entity.
+/// Entities defined within the Dart language should implement [Element].
+///
+/// For instance, the JavaScript backend need to create synthetic variables for
+/// calling intercepted classes and such variables do not correspond to an
+/// entity in the Dart source code nor in the terminology of the Dart language
+/// and should therefore implement [Entity] directly.
+abstract class Entity implements Spannable {
+  String get name;
+}
+
+// TODO(johnniwinther): Should [Local] have `enclosingFunction`, `isAssignable`
+// or `type`?
+/// An entity that defines a local variable (memory slot) in generated code.
+///
+/// Several [Element] can define local variable, for instance parameter, local
+/// variables and local functions and thus implement [Local]. For non-element
+/// locals, like `this` and boxes, specialized [Local] class are created.
+abstract class Local extends Entity {
+
+}
+
 /**
  * A declared element of a program.
  *
@@ -173,7 +197,7 @@
  * is best if the backends avoid setting state directly in elements.
  * It is better to keep such state in a table on the side.
  */
-abstract class Element implements Spannable {
+abstract class Element implements Entity {
   String get name;
   ElementKind get kind;
   Element get enclosingElement;
@@ -1199,6 +1223,7 @@
   void addConstructor(FunctionElement constructor);
 }
 
+// TODO(johnniwinther): Make this a pure [Entity].
 abstract class LabelElement extends Element {
   Label get label;
   String get labelName;
@@ -1212,7 +1237,8 @@
   void setContinueTarget();
 }
 
-abstract class TargetElement extends Element {
+// TODO(johnniwinther): Make this a pure [Entity].
+abstract class TargetElement extends Element implements Local {
   Node get statement;
   int get nestingLevel;
   Link<LabelElement> get labels;
@@ -1260,7 +1286,7 @@
 }
 
 /// An [Element] that has a type.
-abstract class TypedElement extends Element {
+abstract class TypedElement extends Element implements Local {
   DartType get type;
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index df5a2b3..e388d9d 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -1159,13 +1159,6 @@
     : this.variables = variables,
       super(name, kind, enclosingElement);
 
-  VariableElementX.synthetic(String name,
-                             ElementKind kind,
-                             Element enclosing)
-      : token = null,
-        variables = null,
-        super(name, kind, enclosing);
-
   // TODO(johnniwinther): Ensure that the [TreeElements] for this variable hold
   // the mappings for all its metadata.
   Link<MetadataAnnotation> get metadata => variables.metadata;
diff --git a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
index a5bd8bf..8c632f7 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/visitor.dart
@@ -5,12 +5,8 @@
 library visitor;
 
 import 'elements.dart';
-import '../ssa/ssa.dart'
-    show InterceptedElement;
 import '../closure.dart'
-    show ThisElement,
-         BoxElement,
-         BoxFieldElement,
+    show BoxFieldElement,
          ClosureClassElement,
          ClosureFieldElement;
 
@@ -40,9 +36,6 @@
   R visitLabelElement(LabelElement e) => visitElement(e);
   R visitTargetElement(TargetElement e) => visitElement(e);
   R visitTypeVariableElement(TypeVariableElement e) => visitElement(e);
-  R visitInterceptedElement(InterceptedElement e) => visitElement(e);
-  R visitThisElement(ThisElement e) => visitElement(e);
-  R visitBoxElement(BoxElement e) => visitElement(e);
   R visitBoxFieldElement(BoxFieldElement e) => visitElement(e);
   R visitClosureClassElement(ClosureClassElement e) => visitClassElement(e);
   R visitClosureFieldElement(ClosureFieldElement e) => visitVariableElement(e);
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index eff52a9..bef705d 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -49,6 +49,8 @@
   bool hasEnqueuedReflectiveElements = false;
   bool hasEnqueuedReflectiveStaticFields = false;
 
+  CompilationInformation get compilationInfo;
+
   Enqueuer(this.name, this.compiler, this.itemCompilationContextCreator);
 
   Queue<WorkItem> get queue;
@@ -57,6 +59,8 @@
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue => false;
 
+  QueueFilter get filter => compiler.enqueuerFilter;
+
   /// Returns [:true:] if [member] has been processed by this enqueuer.
   bool isProcessed(Element member);
 
@@ -67,13 +71,17 @@
    */
   void addToWorkList(Element element) {
     assert(invariant(element, element.isDeclaration));
-    internalAddToWorkList(element);
+    if (internalAddToWorkList(element)) {
+      compilationInfo.addsToWorkList(compiler.currentElement, element);
+    }
   }
 
   /**
    * Adds [element] to the work list if it has not already been processed.
+   *
+   * Returns [true] if the element was actually added to the queue.
    */
-  void internalAddToWorkList(Element element);
+  bool internalAddToWorkList(Element element);
 
   void registerInstantiatedType(InterfaceType type, Registry registry,
                                 {mirrorUsage: false}) {
@@ -105,17 +113,7 @@
   }
 
   bool checkNoEnqueuedInvokedInstanceMethods() {
-    task.measure(() {
-      // Run through the classes and see if we need to compile methods.
-      for (ClassElement classElement in universe.instantiatedClasses) {
-        for (ClassElement currentClass = classElement;
-             currentClass != null;
-             currentClass = currentClass.superclass) {
-          processInstantiatedClass(currentClass);
-        }
-      }
-    });
-    return true;
+    return filter.checkNoEnqueuedInvokedInstanceMethods(this);
   }
 
   void processInstantiatedClass(ClassElement cls) {
@@ -191,6 +189,7 @@
           memberName, () => const Link<Element>());
       instanceFunctionsByName[memberName] = members.prepend(member);
       if (universe.hasInvocation(member, compiler)) {
+        compilationInfo.enqueues(getContext(), member);
         addToWorkList(member);
         return;
       }
@@ -222,6 +221,8 @@
   void enableNoSuchMethod(Element element) {}
   void enableIsolateSupport() {}
 
+  Element getContext() => compiler.currentElement;
+
   void onRegisterInstantiatedClass(ClassElement cls) {
     task.measure(() {
       if (seenClasses.contains(cls)) return;
@@ -253,32 +254,33 @@
     });
   }
 
-  void registerNewSelector(Selector selector,
+  void registerNewSelector(Element context,
+                           Selector selector,
                            Map<String, Set<Selector>> selectorsMap) {
     String name = selector.name;
     Set<Selector> selectors =
         selectorsMap.putIfAbsent(name, () => new Setlet<Selector>());
     if (!selectors.contains(selector)) {
       selectors.add(selector);
-      handleUnseenSelector(name, selector);
+      handleUnseenSelector(context, name, selector);
     }
   }
 
-  void registerInvocation(Selector selector) {
+  void registerInvocation(Element context, Selector selector) {
     task.measure(() {
-      registerNewSelector(selector, universe.invokedNames);
+      registerNewSelector(context, selector, universe.invokedNames);
     });
   }
 
-  void registerInvokedGetter(Selector selector) {
+  void registerInvokedGetter(Element context, Selector selector) {
     task.measure(() {
-      registerNewSelector(selector, universe.invokedGetters);
+      registerNewSelector(context, selector, universe.invokedGetters);
     });
   }
 
-  void registerInvokedSetter(Selector selector) {
+  void registerInvokedSetter(Element context, Selector selector) {
     task.measure(() {
-      registerNewSelector(selector, universe.invokedSetters);
+      registerNewSelector(context, selector, universe.invokedSetters);
     });
   }
 
@@ -331,11 +333,11 @@
         // well.
         // TODO(herhut): Use TypedSelector.subtype for enqueueing
         Selector selector = new Selector.fromElement(element, compiler);
-        registerSelectorUse(selector);
+        registerSelectorUse(element, selector);
         if (element.isField) {
           Selector selector =
               new Selector.setter(element.name, element.library);
-          registerInvokedSetter(selector);
+          registerInvokedSetter(element, selector);
         }
       }
     }
@@ -472,8 +474,11 @@
     processLink(instanceFunctionsByName, n, f);
   }
 
-  void handleUnseenSelector(String methodName, Selector selector) {
+  void handleUnseenSelector(Element context,
+                            String methodName,
+                            Selector selector) {
     processInstanceMembers(methodName, (Element member) {
+      compilationInfo.enqueues(context, member);
       if (selector.appliesUnnamed(member, compiler)) {
         if (member.isFunction && selector.isGetter) {
           registerClosurizedMember(member, compiler.globalDependencies);
@@ -530,27 +535,27 @@
     universe.staticFunctionsNeedingGetter.add(element);
   }
 
-  void registerDynamicInvocation(Selector selector) {
+  void registerDynamicInvocation(Element context, Selector selector) {
     assert(selector != null);
-    registerInvocation(selector);
+    registerInvocation(context, selector);
   }
 
-  void registerSelectorUse(Selector selector) {
+  void registerSelectorUse(Element context, Selector selector) {
     if (selector.isGetter) {
-      registerInvokedGetter(selector);
+      registerInvokedGetter(context, selector);
     } else if (selector.isSetter) {
-      registerInvokedSetter(selector);
+      registerInvokedSetter(context, selector);
     } else {
-      registerInvocation(selector);
+      registerInvocation(context, selector);
     }
   }
 
-  void registerDynamicGetter(Selector selector) {
-    registerInvokedGetter(selector);
+  void registerDynamicGetter(Element context, Selector selector) {
+    registerInvokedGetter(context, selector);
   }
 
-  void registerDynamicSetter(Selector selector) {
-    registerInvokedSetter(selector);
+  void registerDynamicSetter(Element context, Selector selector) {
+    registerInvokedSetter(context, selector);
   }
 
   void registerGetterForSuperMethod(Element element) {
@@ -607,11 +612,11 @@
     registerIfGeneric(element, registry);
   }
 
-  void forEach(f(WorkItem work)) {
+  void forEach(void f(WorkItem work)) {
     do {
       while (queue.isNotEmpty) {
         // TODO(johnniwinther): Find an optimal process order.
-        f(queue.removeLast());
+        filter.processWorkItem(f, queue.removeLast());
       }
       List recents = recentClasses.toList(growable: false);
       recentClasses.clear();
@@ -658,12 +663,16 @@
    */
   final Queue<DeferredTask> deferredTaskQueue;
 
+  CompilationInformation compilationInfo;
+
   ResolutionEnqueuer(Compiler compiler,
                      ItemCompilationContext itemCompilationContextCreator())
       : super('resolution enqueuer', compiler, itemCompilationContextCreator),
         resolvedElements = new Set<AstElement>(),
         queue = new Queue<ResolutionWorkItem>(),
-        deferredTaskQueue = new Queue<DeferredTask>();
+        deferredTaskQueue = new Queue<DeferredTask>() {
+    compilationInfo = new CompilationInformation(this, compiler.dumpInfo);
+  }
 
   bool get isResolutionQueue => true;
 
@@ -699,10 +708,10 @@
     return includedEnclosing || compiler.backend.requiredByMirrorSystem(element);
   }
 
-  void internalAddToWorkList(Element element) {
+  bool internalAddToWorkList(Element element) {
     assert(invariant(element, element is AnalyzableElement,
         message: 'Element $element is not analyzable.'));
-    if (hasBeenResolved(element)) return;
+    if (hasBeenResolved(element)) return false;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
           "Resolution work list is closed. Trying to add $element.");
@@ -744,6 +753,7 @@
     }
 
     nativeEnqueuer.registerElement(element);
+    return true;
   }
 
   void enableIsolateSupport() {
@@ -757,7 +767,7 @@
 
     Selector selector = compiler.noSuchMethodSelector;
     compiler.enabledNoSuchMethod = true;
-    compiler.backend.enableNoSuchMethod(this);
+    compiler.backend.enableNoSuchMethod(element, this);
   }
 
   /**
@@ -806,11 +816,15 @@
 
   final Set<Element> newlyEnqueuedElements;
 
+  CompilationInformation compilationInfo;
+
   CodegenEnqueuer(Compiler compiler,
                   ItemCompilationContext itemCompilationContextCreator())
       : queue = new Queue<CodegenWorkItem>(),
         newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
-        super('codegen enqueuer', compiler, itemCompilationContextCreator);
+        super('codegen enqueuer', compiler, itemCompilationContextCreator) {
+    compilationInfo = new CompilationInformation(this, compiler.dumpInfo);
+  }
 
   bool isProcessed(Element member) =>
       member.isAbstract || generatedCode.containsKey(member);
@@ -827,19 +841,19 @@
     return compiler.backend.isAccessibleByReflection(element);
   }
 
-  void internalAddToWorkList(Element element) {
+  bool internalAddToWorkList(Element element) {
     if (compiler.hasIncrementalSupport) {
       newlyEnqueuedElements.add(element);
     }
     // Don't generate code for foreign elements.
-    if (element.isForeign(compiler)) return;
+    if (element.isForeign(compiler)) return false;
 
     // Codegen inlines field initializers. It only needs to generate
     // code for checked setters.
     if (element.isField && element.isInstanceMember) {
       if (!compiler.enableTypeAssertions
           || element.enclosingElement.isClosure) {
-        return;
+        return false;
       }
     }
 
@@ -850,9 +864,31 @@
     CodegenWorkItem workItem = new CodegenWorkItem(
         element, itemCompilationContextCreator());
     queue.add(workItem);
+    return true;
   }
 
   void _logSpecificSummary(log(message)) {
     log('Compiled ${generatedCode.length} methods.');
   }
 }
+
+/// Parameterizes filtering of which work items are enqueued.
+class QueueFilter {
+  bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) {
+    enqueuer.task.measure(() {
+      // Run through the classes and see if we need to compile methods.
+      for (ClassElement classElement in enqueuer.universe.instantiatedClasses) {
+        for (ClassElement currentClass = classElement;
+             currentClass != null;
+             currentClass = currentClass.superclass) {
+          enqueuer.processInstantiatedClass(currentClass);
+        }
+      }
+    });
+    return true;
+  }
+
+  void processWorkItem(void f(WorkItem work), WorkItem work) {
+    f(work);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index af4c8c6..e467e29 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -455,7 +455,7 @@
   }
 
   @override
-  ConcreteType addPhiInput(Element element,
+  ConcreteType addPhiInput(Local variable,
                            ConcreteType phiType,
                            ConcreteType newType) {
     return computeLUB(phiType, newType);
@@ -468,7 +468,7 @@
   }
 
   @override
-  ConcreteType allocatePhi(Node node, Element element, ConcreteType inputType) {
+  ConcreteType allocatePhi(Node node, Local variable, ConcreteType inputType) {
     return inputType;
   }
 
@@ -560,7 +560,9 @@
   }
 
   @override
-  ConcreteType simplifyPhi(Node node, Element element, ConcreteType phiType) {
+  ConcreteType simplifyPhi(Node node,
+                           Local variable,
+                           ConcreteType phiType) {
     return phiType;
   }
 
@@ -1123,7 +1125,7 @@
   /**
    * [:readers[local]:] is the list of [:local:]'s possible readers.
    */
-  final Map<Element, Set<Element>> capuredLocalsReaders;
+  final Map<Local, Set<FunctionElement>> capturedLocalsReaders;
 
   /// The set of classes encountered so far.
   final Set<ClassElement> seenClasses;
@@ -1165,8 +1167,7 @@
         workQueue = new WorkQueue(),
         callers = new Map<FunctionElement, Set<Element>>(),
         fieldReaders = new Map<Element, Set<Element>>(),
-        capuredLocalsReaders = new Map<VariableElement,
-            Set<FunctionElement>>(),
+        capturedLocalsReaders = new Map<Local, Set<FunctionElement>>(),
         seenClasses = new Set<ClassElement>(),
         dynamicCallers = new Map<String, Set<FunctionElement>>(),
         inferredSelectorTypes = new Map<Selector, Map<TypeMask, TypeMask>>(),
@@ -1371,8 +1372,8 @@
    * Add [reader] to the set of [local]'s readers.
    */
   void addCapturedLocalReader(VariableElement local, FunctionElement reader) {
-    capuredLocalsReaders.putIfAbsent(local, () => new Set<FunctionElement>())
-                        .add(reader);
+    capturedLocalsReaders.putIfAbsent(local, () => new Set<FunctionElement>())
+                         .add(reader);
   }
 
   /**
@@ -1865,7 +1866,7 @@
       print("  $k: $v");
     });
     print("readers of captured locals:");
-    capuredLocalsReaders.forEach((k,v) {
+    capturedLocalsReaders.forEach((k,v) {
       print("  $k: $v");
     });
     print("inferredFieldTypes:");
@@ -1949,13 +1950,13 @@
   }
 
   @override
-  void recordCapturedLocalRead(Element local) {
+  void recordCapturedLocalRead(Local local) {
     addCapturedLocalReader(local, currentWorkItem.method);
   }
 
   @override
-  void recordLocalUpdate(Element local, ConcreteType type) {
-    Set<Element> localReaders = capuredLocalsReaders[local];
+  void recordLocalUpdate(Local local, ConcreteType type) {
+    Set<FunctionElement> localReaders = capturedLocalsReaders[local];
     if (localReaders != null) {
       localReaders.forEach(invalidate);
     }
@@ -2348,10 +2349,12 @@
   @override
   ConcreteType visitGetterSend(Send node) {
     if (inferrer.testMode) {
-      Element element = elements[node];
-      ConcreteType type = locals.use(element);
-      if (type != null) {
-        inferrer.augmentInferredType(node, type);
+      var element = elements[node];
+      if (element is Local) {
+        ConcreteType type = locals.use(element);
+        if (type != null) {
+          inferrer.augmentInferredType(node, type);
+        }
       }
     }
     return super.visitGetterSend(node);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index 15cbf1e..938ba14 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -76,7 +76,7 @@
    * Returns a new type for holding the potential types of [element].
    * [inputType] is the first incoming type of the phi.
    */
-  T allocatePhi(Node node, Element element, T inputType);
+  T allocatePhi(Node node, Local variable, T inputType);
 
   /**
    * Simplies the phi representing [element] and of the type
@@ -84,12 +84,12 @@
    * implementation of this method could just return that incoming
    * input type.
    */
-  T simplifyPhi(Node node, Element element, T phiType);
+  T simplifyPhi(Node node, Local variable, T phiType);
 
   /**
    * Adds [newType] as an input of [phiType].
    */
-  T addPhiInput(Element element, T phiType, T newType);
+  T addPhiInput(Local variable, T phiType, T newType);
 
   /**
    * Returns a new receiver type for this [selector] applied to
@@ -111,7 +111,7 @@
  * once the control flow block has been visited.
  */
 class VariableScope<T> {
-  Map<Element, T> variables;
+  Map<Local, T> variables;
 
   /// The parent of this scope. Null for the root scope.
   final VariableScope<T> parent;
@@ -126,13 +126,13 @@
   VariableScope.deepCopyOf(VariableScope<T> other)
       : variables = other.variables == null
             ? null
-            : new Map<Element, T>.from(other.variables),
+            : new Map<Local, T>.from(other.variables),
         block = other.block,
         parent = other.parent == null
             ? null
             : new VariableScope<T>.deepCopyOf(other.parent);
 
-  T operator [](Element variable) {
+  T operator [](Local variable) {
     T result;
     if (variables == null || (result = variables[variable]) == null) {
       return parent == null ? null : parent[variable];
@@ -140,41 +140,41 @@
     return result;
   }
 
-  void operator []=(Element variable, T mask) {
+  void operator []=(Local variable, T mask) {
     assert(mask != null);
     if (variables == null) {
-      variables = new Map<Element, T>();
+      variables = new Map<Local, T>();
     }
     variables[variable] = mask;
   }
 
-  void forEachOwnLocal(void f(Element element, T type)) {
+  void forEachOwnLocal(void f(Local variable, T type)) {
     if (variables == null) return;
     variables.forEach(f);
   }
 
   void forEachLocalUntilNode(Node node,
-                             void f(Element element, T type),
-                             [Setlet<Element> seenLocals]) {
-    if (seenLocals == null) seenLocals = new Setlet<Element>();
+                             void f(Local variable, T type),
+                             [Setlet<Local> seenLocals]) {
+    if (seenLocals == null) seenLocals = new Setlet<Local>();
     if (variables != null) {
-      variables.forEach((element, type) {
-        if (seenLocals.contains(element)) return;
-        seenLocals.add(element);
-        f(element, type);
+      variables.forEach((variable, type) {
+        if (seenLocals.contains(variable)) return;
+        seenLocals.add(variable);
+        f(variable, type);
       });
     }
     if (block == node) return;
     if (parent != null) parent.forEachLocalUntilNode(node, f, seenLocals);
   }
 
-  void forEachLocal(void f(Element, T type)) {
+  void forEachLocal(void f(Local variable, T type)) {
     forEachLocalUntilNode(null, f);
   }
 
-  bool updates(Element element) {
+  bool updates(Local variable) {
     if (variables == null) return false;
-    return variables.containsKey(element);
+    return variables.containsKey(variable);
   }
 
   String toString() {
@@ -297,12 +297,12 @@
   /**
    * Records that the captured variable [local] is read.
    */
-  void recordCapturedLocalRead(Element local);
+  void recordCapturedLocalRead(Local local);
 
   /**
    * Records that the variable [local] is being updated.
    */
-  void recordLocalUpdate(Element local, T type);
+  void recordLocalUpdate(Local local, T type);
 }
 
 /**
@@ -313,8 +313,8 @@
   final TypeSystem<T> types;
   final MinimalInferrerEngine<T> inferrer;
   final VariableScope<T> locals;
-  final Map<Element, Element> captured;
-  final Map<Element, Element> capturedAndBoxed;
+  final Map<Local, Element> captured;
+  final Map<Local, Element> capturedAndBoxed;
   final FieldInitializationScope<T> fieldScope;
   LocalsHandler<T> tryBlock;
   bool seenReturnOrThrow = false;
@@ -331,8 +331,8 @@
                 Node block,
                 [this.fieldScope])
       : locals = new VariableScope<T>(block),
-        captured = new Map<Element, Element>(),
-        capturedAndBoxed = new Map<Element, Element>(),
+        captured = new Map<Local, Element>(),
+        capturedAndBoxed = new Map<Local, Element>(),
         tryBlock = null;
 
   LocalsHandler.from(LocalsHandler<T> other,
@@ -358,7 +358,7 @@
         inferrer = other.inferrer,
         compiler = other.compiler;
 
-  T use(Element local) {
+  T use(Local local) {
     if (capturedAndBoxed.containsKey(local)) {
       return inferrer.typeOfElement(capturedAndBoxed[local]);
     } else {
@@ -404,11 +404,11 @@
     }
   }
 
-  void setCaptured(Element local, Element field) {
+  void setCaptured(Local local, Element field) {
     captured[local] = field;
   }
 
-  void setCapturedAndBoxed(Element local, Element field) {
+  void setCapturedAndBoxed(Local local, Element field) {
     capturedAndBoxed[local] = field;
   }
 
@@ -426,7 +426,7 @@
     if (aborts) return;
 
     void mergeOneBranch(LocalsHandler<T> other) {
-      other.locals.forEachOwnLocal((Element local, T type) {
+      other.locals.forEachOwnLocal((Local local, T type) {
         T myType = locals[local];
         if (myType == null) return; // Variable is only defined in [other].
         if (type == myType) return;
@@ -435,7 +435,7 @@
     }
 
     void inPlaceUpdateOneBranch(LocalsHandler<T> other) {
-      other.locals.forEachOwnLocal((Element local, T type) {
+      other.locals.forEachOwnLocal((Local local, T type) {
         T myType = locals[local];
         if (myType == null) return; // Variable is only defined in [other].
         if (type == myType) return;
@@ -451,7 +451,7 @@
     } else if (elseBranch.aborts) {
       inPlaceUpdateOneBranch(thenBranch);
     } else {
-      void mergeLocal(Element local) {
+      void mergeLocal(Local local) {
         T myType = locals[local];
         if (myType == null) return;
         T elseType = elseBranch.locals[local];
@@ -463,10 +463,10 @@
         }
       }
 
-      thenBranch.locals.forEachOwnLocal((Element local, _) {
+      thenBranch.locals.forEachOwnLocal((Local local, _) {
         mergeLocal(local);
       });
-      elseBranch.locals.forEachOwnLocal((Element local, _) {
+      elseBranch.locals.forEachOwnLocal((Local local, _) {
         // Discard locals we already processed when iterating over
         // [thenBranch]'s locals.
         if (!thenBranch.locals.updates(local)) mergeLocal(local);
@@ -507,7 +507,7 @@
   void mergeAfterBreaks(List<LocalsHandler<T>> handlers,
                         {bool keepOwnLocals: true}) {
     Node level = locals.block;
-    Set<Element> seenLocals = new Setlet<Element>();
+    Set<Local> seenLocals = new Setlet<Local>();
     // If we want to keep the locals, we first merge [this] into itself to
     // create the required Phi nodes.
     if (keepOwnLocals && !seenReturnOrThrow) {
@@ -520,11 +520,11 @@
       mergeHandler(handler, seenLocals);
     }
     // Clean up Phi nodes with single input.
-    locals.forEachLocal((Element element, T type) {
-      if (!seenLocals.contains(element)) return;
-      T newType = types.simplifyPhi(level, element, type);
+    locals.forEachLocal((Local variable, T type) {
+      if (!seenLocals.contains(variable)) return;
+      T newType = types.simplifyPhi(level, variable, type);
       if (newType != type) {
-        locals[element] = newType;
+        locals[variable] = newType;
       }
     });
     seenReturnOrThrow = allBranchesAbort &&
@@ -537,7 +537,7 @@
    * unless the local is already present in the set [seen]. This effectively
    * overwrites the current type knowledge in this handler.
    */
-  bool mergeHandler(LocalsHandler<T> other, [Set<Element> seen]) {
+  bool mergeHandler(LocalsHandler<T> other, [Set<Local> seen]) {
     if (other.seenReturnOrThrow) return false;
     bool changed = false;
     other.locals.forEachLocalUntilNode(locals.block, (local, otherType) {
@@ -572,19 +572,19 @@
   }
 
   void startLoop(Node loop) {
-    locals.forEachLocal((Element element, T type) {
-      T newType = types.allocatePhi(loop, element, type);
+    locals.forEachLocal((Local variable, T type) {
+      T newType = types.allocatePhi(loop, variable, type);
       if (newType != type) {
-        locals[element] = newType;
+        locals[variable] = newType;
       }
     });
   }
 
   void endLoop(Node loop) {
-    locals.forEachLocal((Element element, T type) {
-      T newType = types.simplifyPhi(loop, element, type);
+    locals.forEachLocal((Local variable, T type) {
+      T newType = types.simplifyPhi(loop, variable, type);
       if (newType != type) {
-        locals[element] = newType;
+        locals[variable] = newType;
       }
     });
   }
@@ -783,7 +783,8 @@
     } else {
       Element element = elements[node];
       if (Elements.isLocal(element)) {
-        return locals.use(element);
+        TypedElement local = element;
+        return locals.use(local);
       }
       return null;
     }
@@ -802,10 +803,12 @@
   }
 
   void updateIsChecks(List<Node> tests, {bool usePositive}) {
-    void narrow(Element element, DartType type, Node node) {
-      T existing = locals.use(element);
-      T newType = types.narrowType(existing, type, isNullable: false);
-      locals.update(element, newType, node);
+    void narrow(var element, DartType type, Node node) {
+      if (element is Local) {
+        T existing = locals.use(element);
+        T newType = types.narrowType(existing, type, isNullable: false);
+        locals.update(element, newType, node);
+      }
     }
 
     if (tests == null) return;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 25fd0b4..35be403 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -11,7 +11,7 @@
 import '../js_backend/js_backend.dart' as js;
 import '../native_handler.dart' as native;
 import '../tree/tree.dart' as ast;
-import '../ir/ir_nodes.dart' as ir show Node;
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir show Node;
 import '../util/util.dart' show Link, Spannable, Setlet;
 import '../types/types.dart'
     show TypesInferrer, FlatTypeMask, TypeMask, ContainerTypeMask,
@@ -122,15 +122,21 @@
     return new TypedSelector(receiver, selector, compiler);
   }
 
-  TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
+  TypeMask addPhiInput(Local variable,
+                       TypeMask phiType,
+                       TypeMask newType) {
     return computeLUB(phiType, newType);
   }
 
-  TypeMask allocatePhi(ast.Node node, Element element, TypeMask inputType) {
+  TypeMask allocatePhi(ast.Node node,
+                       Local variable,
+                       TypeMask inputType) {
     return inputType;
   }
 
-  TypeMask simplifyPhi(ast.Node node, Element element, TypeMask phiType) {
+  TypeMask simplifyPhi(ast.Node node,
+                       Local variable,
+                       TypeMask phiType) {
     return phiType;
   }
 
@@ -354,7 +360,7 @@
 
   void updateSelectorInTree(
       AstElement owner, Spannable node, Selector selector) {
-    if (node is ir.Node) {
+    if (node is cps_ir.Node) {
       // TODO(lry): update selector for IrInvokeDynamic.
       throw "updateSelector for IR node $node";
     }
@@ -584,7 +590,7 @@
         compiler.closureToClassMapper.getMappingForNestedFunction(node);
     nestedClosureData.forEachCapturedVariable((variable, field) {
       if (!nestedClosureData.isVariableBoxed(variable)) {
-        if (variable == nestedClosureData.thisElement) {
+        if (variable == nestedClosureData.thisLocal) {
           inferrer.recordType(field, thisType);
         }
         // The type is null for type parameters.
@@ -836,7 +842,8 @@
         handleDynamicSend(node, setterSelector, receiverType,
                           new ArgumentsTypes<T>([newType], null));
       } else if (Elements.isLocal(element)) {
-        getterType = locals.use(element);
+        TypedElement local = element;
+        getterType = locals.use(local);
         newType = handleDynamicSend(
             node, operatorSelector, getterType, operatorArguments);
         locals.update(element, newType, node);
@@ -1072,8 +1079,9 @@
     } else if (Elements.isErroneousElement(element)) {
       return types.dynamicType;
     } else if (Elements.isLocal(element)) {
-      assert(locals.use(element) != null);
-      return locals.use(element);
+      TypedElement local = element;
+      assert(locals.use(local) != null);
+      return locals.use(local);
     } else {
       assert(element is PrefixElement);
       return null;
@@ -1193,7 +1201,7 @@
     }
 
     List<T> unnamed = <T>[];
-    signature.forEachRequiredParameter((Element element) {
+    signature.forEachRequiredParameter((ParameterElement element) {
       assert(locals.use(element) != null);
       unnamed.add(locals.use(element));
     });
@@ -1201,11 +1209,11 @@
     Map<String, T> named;
     if (signature.optionalParametersAreNamed) {
       named = new Map<String, T>();
-      signature.forEachOptionalParameter((Element element) {
+      signature.forEachOptionalParameter((ParameterElement element) {
         named[element.name] = locals.use(element);
       });
     } else {
-      signature.forEachOptionalParameter((Element element) {
+      signature.forEachOptionalParameter((ParameterElement element) {
         unnamed.add(locals.use(element));
       });
     }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index 3443e4a..ea96355 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -8,7 +8,7 @@
 import '../dart_types.dart' show DartType, InterfaceType, TypeKind;
 import '../elements/elements.dart';
 import '../tree/tree.dart' as ast show DartString, Node;
-import '../ir/ir_nodes.dart' as ir show Node;
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir show Node;
 import '../types/types.dart'
   show TypeMask, ContainerTypeMask, MapTypeMask, DictionaryTypeMask,
        ValueTypeMask, TypesInferrer;
@@ -379,7 +379,7 @@
   }
 
   PhiElementTypeInformation allocatePhi(ast.Node node,
-                                        Element element,
+                                        Local variable,
                                         inputType) {
     // Check if [inputType] is a phi for a local updated in
     // the try/catch block [node]. If it is, no need to allocate a new
@@ -389,20 +389,20 @@
       return inputType;
     }
     PhiElementTypeInformation result =
-        new PhiElementTypeInformation(node, true, element);
+        new PhiElementTypeInformation(node, true, variable);
     allocatedTypes.add(result);
     result.addAssignment(inputType);
     return result;
   }
 
   TypeInformation simplifyPhi(ast.Node node,
-                              Element element,
+                              Local variable,
                               PhiElementTypeInformation phiType) {
     if (phiType.assignments.length == 1) return phiType.assignments.first;
     return phiType;
   }
 
-  PhiElementTypeInformation addPhiInput(Element element,
+  PhiElementTypeInformation addPhiInput(Local variable,
                                         PhiElementTypeInformation phiType,
                                         TypeInformation newType) {
     phiType.addAssignment(newType);
@@ -1098,9 +1098,9 @@
     }
   }
 
-  void recordCapturedLocalRead(Element local) {}
+  void recordCapturedLocalRead(Local local) {}
 
-  void recordLocalUpdate(Element local, TypeInformation type) {}
+  void recordLocalUpdate(Local local, TypeInformation type) {}
 }
 
 class TypeGraphInferrer implements TypesInferrer {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index e6727ae..40a747f 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -239,7 +239,7 @@
    * This map contains the callers of [element]. It stores all unique call sites
    * to enable counting the global number of call sites of [element].
    *
-   * A call site is either an AST [ast.Node], an [ir.Node] or in the case of
+   * A call site is either an AST [ast.Node], a [cps_ir.Node] or in the case of
    * synthesized calls, an [Element] (see uses of [synthesizeForwardingCall]
    * in [SimpleTypeInferrerVisitor]).
    */
@@ -258,7 +258,7 @@
   }
 
   void addCall(Element caller, Spannable node) {
-    assert(node is ast.Node || node is ir.Node || node is Element);
+    assert(node is ast.Node || node is cps_ir.Node || node is Element);
     _callers.putIfAbsent(caller, () => new Setlet()).add(node);
   }
 
@@ -1240,15 +1240,15 @@
 class PhiElementTypeInformation extends TypeInformation {
   final ast.Node branchNode;
   final bool isLoopPhi;
-  final Element element;
+  final Local variable;
 
-  PhiElementTypeInformation(this.branchNode, this.isLoopPhi, this.element);
+  PhiElementTypeInformation(this.branchNode, this.isLoopPhi, this.variable);
 
   TypeMask refine(TypeGraphInferrerEngine inferrer) {
     return inferrer.types.computeTypeMask(assignments);
   }
 
-  String toString() => 'Phi $element $type';
+  String toString() => 'Phi $variable $type';
 
   accept(TypeInformationVisitor visitor) {
     return visitor.visitPhiElementTypeInformation(this);
diff --git a/sdk/lib/_internal/compiler/implementation/js/printer.dart b/sdk/lib/_internal/compiler/implementation/js/printer.dart
index c79e80e..5b9fe43 100644
--- a/sdk/lib/_internal/compiler/implementation/js/printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/printer.dart
@@ -216,9 +216,11 @@
     Node elsePart = node.otherwise;
     bool hasElse = node.hasElse;
 
-    // Handle dangling elses.
+    // Handle dangling elses and a work-around for Android 4.0 stock browser.
+    // Android 4.0 requires braces for a single do-while in the `then` branch.
+    // See issue 10923.
     if (hasElse) {
-      bool needsBraces = node.then.accept(danglingElseVisitor);
+      bool needsBraces = node.then.accept(danglingElseVisitor) || then is Do;
       if (needsBraces) {
         then = new Block(<Statement>[then]);
       }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 4e2e8f8..c765845 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -842,6 +842,7 @@
   }
 
   onResolutionComplete() {
+    super.onResolutionComplete();
     computeMembersNeededForReflection();
     rti.computeClassesNeedingRti();
   }
@@ -943,9 +944,9 @@
     enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
   }
 
-  void enableNoSuchMethod(Enqueuer world) {
+  void enableNoSuchMethod(context, Enqueuer world) {
     enqueue(world, getCreateInvocationMirror(), compiler.globalDependencies);
-    world.registerInvocation(compiler.noSuchMethodSelector);
+    world.registerInvocation(context, compiler.noSuchMethodSelector);
   }
 
   void enableIsolateSupport(Enqueuer enqueuer) {
@@ -2104,6 +2105,14 @@
         ? jsAst.prettyPrint(generatedCode[element], compiler)
         : null;
   }
+
+  FunctionElement helperForBadMain() => findHelper('badMain');
+
+  FunctionElement helperForMissingMain() => findHelper('missingMain');
+
+  FunctionElement helperForMainArity() {
+    return findHelper('mainHasTooManyParameters');
+  }
 }
 
 class JavaScriptionResolutionCallbacks extends ResolutionCallbacks {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index 4447839..b3228f6 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -4,7 +4,7 @@
 
 library js_backend;
 
-import 'dart:async' show Future;
+import 'dart:async' show EventSink, Future;
 import 'dart:collection' show Queue, LinkedHashMap, LinkedHashSet;
 
 import '../closure.dart';
@@ -25,6 +25,8 @@
 import '../util/characters.dart';
 import '../util/util.dart';
 
+import '../compilation_info.dart';
+
 part 'backend.dart';
 part 'checked_mode_helpers.dart';
 part 'constant_emitter.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
index 1294574..268e852 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
@@ -11,7 +11,8 @@
 import '../closure.dart' show
     ClosureClassElement,
     ClosureClassMap,
-    ClosureFieldElement;
+    ClosureFieldElement,
+    CapturedVariable;
 
 import '../dart2jslib.dart' show
     CodeBuffer;
@@ -37,6 +38,8 @@
     TypeChecks,
     TypeVariableHandler;
 
+import '../helpers/helpers.dart';
+
 import '../source_file.dart' show
     SourceFile,
     StringSourceFile;
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index c270d90..cd51594 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -60,8 +60,8 @@
       ClosureClassMap closureData =
           compiler.closureToClassMapper.closureMappingCache[node];
       if (closureData != null) {
-        Element thisElement =
-            closureData.freeVariableMapping[closureData.thisElement];
+        ClosureFieldElement thisElement =
+            closureData.getFreeVariableElement(closureData.thisLocal);
         if (thisElement != null) {
           String thisName = namer.instanceFieldPropertyName(thisElement);
           thisAccess = js('this.#', thisName);
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index 27d505c..e30b958 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -101,7 +101,7 @@
   /// Collect @MirrorsUsed annotations in all libraries.  Called by the
   /// compiler after all libraries are loaded, but before resolution.
   void analyzeUsage(LibraryElement mainApp) {
-    if (compiler.mirrorsLibrary == null) return;
+    if (mainApp == null || compiler.mirrorsLibrary == null) return;
     measure(analyzer.run);
     List<String> symbols = analyzer.mergedMirrorUsage.symbols;
     List<Element> targets = analyzer.mergedMirrorUsage.targets;
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index cd55006..8e84eb7 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -1098,7 +1098,8 @@
   NativeEmitter nativeEmitter = builder.nativeEmitter;
   JavaScriptBackend backend = builder.backend;
 
-  HInstruction convertDartClosure(Element parameter, FunctionType type) {
+  HInstruction convertDartClosure(ParameterElement  parameter,
+                                  FunctionType type) {
     HInstruction local = builder.localsHandler.readLocal(parameter);
     Constant arityConstant =
         builder.constantSystem.createInt(type.computeArity());
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index b07f71f..5a4654b 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -485,8 +485,8 @@
       if (element.isPatched) {
         FunctionElementX patch = element.patch;
         compiler.withCurrentElement(patch, () {
-            patch.parseNode(compiler);
-            patch.computeSignature(compiler);
+          patch.parseNode(compiler);
+          patch.computeType(compiler);
         });
         checkMatchingPatchSignatures(element, patch);
         element = patch;
@@ -1215,6 +1215,11 @@
       Node node = annotation.parseNode(compiler);
       Element annotatedElement = annotation.annotatedElement;
       AnalyzableElement context = annotatedElement.analyzableElement;
+      ClassElement classElement = annotatedElement.enclosingClass;
+      if (classElement != null) {
+        // The annotation is resolved in the scope of [classElement].
+        classElement.ensureResolved(compiler);
+      }
       assert(invariant(node, context != null,
           message: "No context found for metadata annotation "
                    "on $annotatedElement."));
@@ -2347,6 +2352,11 @@
 
   ResolutionResult resolveSend(Send node) {
     Selector selector = resolveSelector(node, null);
+    if (selector != null) {
+      compiler.enqueuer.resolution.compilationInfo.registerCallSite(
+          registry.mapping, node);
+    }
+
     if (node.isSuperCall) registry.registerSuperUse(node);
 
     if (node.receiver == null) {
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
index 818e7ca..12073bf 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -236,7 +236,7 @@
   }
 
   void registerDynamicInvocation(Selector selector) {
-    world.registerDynamicInvocation(selector);
+    world.registerDynamicInvocation(currentElement, selector);
   }
 
   void registerSuperNoSuchMethod() {
@@ -268,11 +268,11 @@
   }
 
   void registerDynamicGetter(Selector selector) {
-    world.registerDynamicGetter(selector);
+    world.registerDynamicGetter(currentElement, selector);
   }
 
   void registerDynamicSetter(Selector selector) {
-    world.registerDynamicSetter(selector);
+    world.registerDynamicSetter(currentElement, selector);
   }
 
   void registerConstSymbol(String name) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 4d4ad08..e76413f 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -2177,6 +2177,9 @@
 }
 
 abstract class PartialElement implements Element {
+  Token get beginToken;
+  Token get endToken;
+
   bool hasParseError = false;
 
   bool get isErroneous => hasParseError;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index fc62167..2b13266 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -4,19 +4,14 @@
 
 part of ssa;
 
-/**
- * A special element for the extra parameter taken by intercepted
- * methods. We need to implement [TypedElement.type] because our
- * optimizers may look at its declared type.
- */
-class InterceptedElement extends ElementX implements TypedElement {
-  final DartType type;
-  InterceptedElement(this.type, String name, Element enclosing)
-      : super(name, ElementKind.PARAMETER, enclosing);
+/// A synthetic local variable only used with the SSA graph.
+///
+/// For instance used for holding return value of function or the exception of a
+/// try-catch statement.
+class SyntheticLocal extends Local {
+  final String name;
 
-  DartType computeType(Compiler compiler) => type;
-
-  accept(ElementVisitor visitor) => visitor.visitInterceptedElement(this);
+  SyntheticLocal(this.name);
 }
 
 class SsaBuilderTask extends CompilerTask {
@@ -94,7 +89,6 @@
   }
 }
 
-
 /**
  * Keeps track of locals (including parameters and phis) when building. The
  * 'this' reference is treated as parameter and hence handled by this class,
@@ -110,8 +104,10 @@
    * e.g. Element hash codes.  I'd prefer to use a SortedMap but some elements
    * don't have source locations for [Elements.compareByPosition].
    */
-  Map<Element, HInstruction> directLocals;
-  Map<Element, Element> redirectionMapping;
+  Map<Local, HInstruction> directLocals =
+      new Map<Local, HInstruction>();
+  Map<Local, CapturedVariable> redirectionMapping =
+      new Map<Local, CapturedVariable>();
   SsaBuilder builder;
   ClosureClassMap closureData;
 
@@ -119,9 +115,7 @@
   /// variables are in scope.
   final ClassElement contextClass;
 
-  LocalsHandler(this.builder, this.contextClass)
-      : redirectionMapping = new Map<Element, Element>(),
-        directLocals = new Map<Element, HInstruction>();
+  LocalsHandler(this.builder, this.contextClass);
 
   /// Substituted type variables occurring in [type] into the context of
   /// [contextClass].
@@ -144,7 +138,7 @@
    * throughout the AST visit.
    */
   LocalsHandler.from(LocalsHandler other)
-      : directLocals = new Map<Element, HInstruction>.from(other.directLocals),
+      : directLocals = new Map<Local, HInstruction>.from(other.directLocals),
         redirectionMapping = other.redirectionMapping,
         contextClass = other.contextClass,
         builder = other.builder,
@@ -154,7 +148,7 @@
    * Redirects accesses from element [from] to element [to]. The [to] element
    * must be a boxed variable or a variable that is stored in a closure-field.
    */
-  void redirectElement(Element from, Element to) {
+  void redirectElement(Local from, CapturedVariable to) {
     assert(redirectionMapping[from] == null);
     redirectionMapping[from] = to;
     assert(isStoredInClosureField(from) || isBoxed(from));
@@ -194,7 +188,8 @@
     directLocals[scopeData.boxElement] = box;
     // Make sure that accesses to the boxed locals go into the box. We also
     // need to make sure that parameters are copied into the box if necessary.
-    scopeData.capturedVariableMapping.forEach((Element from, Element to) {
+    scopeData.forEachCapturedVariable(
+        (VariableElement from, BoxFieldElement to) {
       // The [from] can only be a parameter for function-scopes and not
       // loop scopes.
       if (from.isParameter && !element.isGenerativeConstructorBody) {
@@ -218,12 +213,13 @@
    * Replaces the current box with a new box and copies over the given list
    * of elements from the old box into the new box.
    */
-  void updateCaptureBox(Element boxElement, List<Element> toBeCopiedElements) {
+  void updateCaptureBox(BoxLocal boxElement,
+                        List<VariableElement> toBeCopiedElements) {
     // Create a new box and copy over the values from the old box into the
     // new one.
     HInstruction oldBox = readLocal(boxElement);
     HInstruction newBox = createBox();
-    for (Element boxedVariable in toBeCopiedElements) {
+    for (VariableElement boxedVariable in toBeCopiedElements) {
       // [readLocal] uses the [boxElement] to find its box. By replacing it
       // behind its back we can still get to the old values.
       updateLocal(boxElement, oldBox);
@@ -248,12 +244,11 @@
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
       FunctionSignature params = functionElement.functionSignature;
-      params.orderedForEachParameter((Element parameterElement) {
+      ClosureScope scopeData = closureData.capturingScopes[node];
+      params.orderedForEachParameter((ParameterElement parameterElement) {
         if (element.isGenerativeConstructorBody) {
-          ClosureScope scopeData = closureData.capturingScopes[node];
-          if (scopeData != null
-              && scopeData.capturedVariableMapping.containsKey(
-                  parameterElement)) {
+          if (scopeData != null &&
+              scopeData.isCapturedVariable(parameterElement)) {
             // The parameter will be a field in the box passed as the
             // last parameter. So no need to have it.
             return;
@@ -272,13 +267,13 @@
     // If the freeVariableMapping is not empty, then this function was a
     // nested closure that captures variables. Redirect the captured
     // variables to fields in the closure.
-    closureData.freeVariableMapping.forEach((Element from, Element to) {
+    closureData.forEachFreeVariable((Local from, CapturedVariable to) {
       redirectElement(from, to);
     });
     JavaScriptBackend backend = compiler.backend;
     if (closureData.isClosure) {
       // Inside closure redirect references to itself to [:this:].
-      HThis thisInstruction = new HThis(closureData.thisElement,
+      HThis thisInstruction = new HThis(closureData.thisLocal,
                                         backend.nonNullType);
       builder.graph.thisInstruction = thisInstruction;
       builder.graph.entry.addAtEntry(thisInstruction);
@@ -288,10 +283,10 @@
       // not have any thisElement if the closure was created inside a static
       // context.
       HThis thisInstruction = new HThis(
-          closureData.thisElement, builder.getTypeOfThis());
+          closureData.thisLocal, builder.getTypeOfThis());
       builder.graph.thisInstruction = thisInstruction;
       builder.graph.entry.addAtEntry(thisInstruction);
-      directLocals[closureData.thisElement] = thisInstruction;
+      directLocals[closureData.thisLocal] = thisInstruction;
     }
 
     // If this method is an intercepted method, add the extra
@@ -308,20 +303,18 @@
     if (backend.isInterceptedMethod(element)) {
       bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
       String name = isInterceptorClass ? 'receiver' : '_';
-      Element parameter = new InterceptedElement(
-          cls.thisType, name, element);
+      SyntheticLocal parameter = new SyntheticLocal(name);
       HParameterValue value =
           new HParameterValue(parameter, builder.getTypeOfThis());
       builder.graph.explicitReceiverParameter = value;
       builder.graph.entry.addAfter(
-          directLocals[closureData.thisElement], value);
+          directLocals[closureData.thisLocal], value);
       if (isInterceptorClass) {
         // Only use the extra parameter in intercepted classes.
-        directLocals[closureData.thisElement] = value;
+        directLocals[closureData.thisLocal] = value;
       }
     } else if (isNativeUpgradeFactory) {
-      Element parameter = new InterceptedElement(
-          cls.thisType, 'receiver', element);
+      SyntheticLocal parameter = new SyntheticLocal('receiver');
       // Unlike `this`, receiver is nullable since direct calls to generative
       // constructor call the constructor with `null`.
       HParameterValue value =
@@ -335,32 +328,28 @@
    * Returns true if the local can be accessed directly. Boxed variables or
    * captured variables that are stored in the closure-field return [:false:].
    */
-  bool isAccessedDirectly(Element element) {
-    assert(element != null);
-    return redirectionMapping[element] == null
-        && !closureData.usedVariablesInTry.contains(element);
+  bool isAccessedDirectly(Local local) {
+    assert(local != null);
+    return !redirectionMapping.containsKey(local)
+        && !closureData.usedVariablesInTry.contains(local);
   }
 
-  bool isStoredInClosureField(Element element) {
-    assert(element != null);
-    if (isAccessedDirectly(element)) return false;
-    Element redirectTarget = redirectionMapping[element];
+  bool isStoredInClosureField(Local local) {
+    assert(local != null);
+    if (isAccessedDirectly(local)) return false;
+    CapturedVariable redirectTarget = redirectionMapping[local];
     if (redirectTarget == null) return false;
-    if (redirectTarget.isMember) {
-      assert(redirectTarget is ClosureFieldElement);
-      return true;
-    }
-    return false;
+    return redirectTarget is ClosureFieldElement;
   }
 
-  bool isBoxed(Element element) {
-    if (isAccessedDirectly(element)) return false;
-    if (isStoredInClosureField(element)) return false;
-    return redirectionMapping[element] != null;
+  bool isBoxed(Local local) {
+    if (isAccessedDirectly(local)) return false;
+    if (isStoredInClosureField(local)) return false;
+    return redirectionMapping.containsKey(local);
   }
 
-  bool isUsedInTry(Element element) {
-    return closureData.usedVariablesInTry.contains(element);
+  bool isUsedInTry(Local local) {
+    return closureData.usedVariablesInTry.contains(local);
   }
 
   /**
@@ -368,31 +357,29 @@
    * boxed or stored in a closure then the method generates code to retrieve
    * the value.
    */
-  HInstruction readLocal(Element element) {
-    if (isAccessedDirectly(element)) {
-      if (directLocals[element] == null) {
-        if (element.isTypeVariable) {
+  HInstruction readLocal(Local local) {
+    if (isAccessedDirectly(local)) {
+      if (directLocals[local] == null) {
+        if (local is TypeVariableElement) {
           builder.compiler.internalError(builder.compiler.currentElement,
-              "Runtime type information not available for $element.");
+              "Runtime type information not available for $local.");
         } else {
-          builder.compiler.internalError(element,
-              "Cannot find value $element.");
+          builder.compiler.internalError(local,
+              "Cannot find value $local.");
         }
       }
-      return directLocals[element];
-    } else if (isStoredInClosureField(element)) {
-      Element redirect = redirectionMapping[element];
+      return directLocals[local];
+    } else if (isStoredInClosureField(local)) {
+      ClosureFieldElement redirect = redirectionMapping[local];
       HInstruction receiver = readLocal(closureData.closureElement);
-      TypeMask type = (element.kind == ElementKind.VARIABLE_LIST)
+      TypeMask type = local is BoxLocal
           ? builder.backend.nonNullType
           : builder.getTypeOfCapturedVariable(redirect);
-      assert(element.kind != ElementKind.VARIABLE_LIST
-             || element is BoxElement);
       HInstruction fieldGet = new HFieldGet(redirect, receiver, type);
       builder.add(fieldGet);
       return fieldGet;
-    } else if (isBoxed(element)) {
-      BoxFieldElement redirect = redirectionMapping[element];
+    } else if (isBoxed(local)) {
+      BoxFieldElement redirect = redirectionMapping[local];
       // In the function that declares the captured variable the box is
       // accessed as direct local. Inside the nested closure the box is
       // accessed through a closure-field.
@@ -404,36 +391,36 @@
       builder.add(lookup);
       return lookup;
     } else {
-      assert(isUsedInTry(element));
-      HLocalValue local = getLocal(element);
-      HInstruction variable = new HLocalGet(
-          element, local, builder.backend.dynamicType);
-      builder.add(variable);
-      return variable;
+      assert(isUsedInTry(local));
+      HLocalValue localValue = getLocal(local);
+      HInstruction instruction = new HLocalGet(
+          local, localValue, builder.backend.dynamicType);
+      builder.add(instruction);
+      return instruction;
     }
   }
 
   HInstruction readThis() {
-    HInstruction res = readLocal(closureData.thisElement);
+    HInstruction res = readLocal(closureData.thisLocal);
     if (res.instructionType == null) {
       res.instructionType = builder.getTypeOfThis();
     }
     return res;
   }
 
-  HLocalValue getLocal(Element element) {
+  HLocalValue getLocal(Local local) {
     // If the element is a parameter, we already have a
     // HParameterValue for it. We cannot create another one because
     // it could then have another name than the real parameter. And
     // the other one would not know it is just a copy of the real
     // parameter.
-    if (element.isParameter) return builder.parameters[element];
+    if (local is ParameterElement) return builder.parameters[local];
 
-    return builder.activationVariables.putIfAbsent(element, () {
+    return builder.activationVariables.putIfAbsent(local, () {
       JavaScriptBackend backend = builder.backend;
-      HLocalValue local = new HLocalValue(element, backend.nonNullType);
-      builder.graph.entry.addAtExit(local);
-      return local;
+      HLocalValue localValue = new HLocalValue(local, backend.nonNullType);
+      builder.graph.entry.addAtExit(localValue);
+      return localValue;
     });
   }
 
@@ -441,12 +428,12 @@
    * Sets the [element] to [value]. If the element is boxed or stored in a
    * closure then the method generates code to set the value.
    */
-  void updateLocal(Element element, HInstruction value) {
-    assert(!isStoredInClosureField(element));
-    if (isAccessedDirectly(element)) {
-      directLocals[element] = value;
-    } else if (isBoxed(element)) {
-      BoxFieldElement redirect = redirectionMapping[element];
+  void updateLocal(Local local, HInstruction value) {
+    assert(!isStoredInClosureField(local));
+    if (isAccessedDirectly(local)) {
+      directLocals[local] = value;
+    } else if (isBoxed(local)) {
+      BoxFieldElement redirect = redirectionMapping[local];
       // The box itself could be captured, or be local. A local variable that
       // is captured will be boxed, but the box itself will be a local.
       // Inside the closure the box is stored in a closure-field and cannot
@@ -454,9 +441,9 @@
       HInstruction box = readLocal(redirect.box);
       builder.add(new HFieldSet(redirect, box, value));
     } else {
-      assert(isUsedInTry(element));
-      HLocalValue local = getLocal(element);
-      builder.add(new HLocalSet(element, local, value));
+      assert(isUsedInTry(local));
+      HLocalValue localValue = getLocal(local);
+      builder.add(new HLocalSet(local, localValue, value));
     }
   }
 
@@ -524,21 +511,22 @@
    */
   void beginLoopHeader(HBasicBlock loopEntry) {
     // Create a copy because we modify the map while iterating over it.
-    Map<Element, HInstruction> savedDirectLocals =
-        new Map<Element, HInstruction>.from(directLocals);
+    Map<Local, HInstruction> savedDirectLocals =
+        new Map<Local, HInstruction>.from(directLocals);
 
     JavaScriptBackend backend = builder.backend;
     // Create phis for all elements in the definitions environment.
-    savedDirectLocals.forEach((Element element, HInstruction instruction) {
-      if (isAccessedDirectly(element)) {
+    savedDirectLocals.forEach((Local local,
+                               HInstruction instruction) {
+      if (isAccessedDirectly(local)) {
         // We know 'this' cannot be modified.
-        if (!identical(element, closureData.thisElement)) {
+        if (local != closureData.thisLocal) {
           HPhi phi = new HPhi.singleInput(
-              element, instruction, backend.dynamicType);
+              local, instruction, backend.dynamicType);
           loopEntry.addPhi(phi);
-          directLocals[element] = phi;
+          directLocals[local] = phi;
         } else {
-          directLocals[element] = instruction;
+          directLocals[local] = instruction;
         }
       }
     });
@@ -576,7 +564,7 @@
     // phis.
     if (loopEntry.predecessors.length == 1) return;
     loopEntry.forEachPhi((HPhi phi) {
-      Element element = phi.sourceElement;
+      Local element = phi.sourceElement;
       HInstruction postLoopDefinition = directLocals[element];
       phi.addInput(postLoopDefinition);
     });
@@ -594,24 +582,25 @@
     // block. Since variable declarations are scoped the declared
     // variable cannot be alive outside the block. Note: this is only
     // true for nodes where we do joins.
-    Map<Element, HInstruction> joinedLocals =
-        new Map<Element, HInstruction>();
+    Map<Local, HInstruction> joinedLocals =
+        new Map<Local, HInstruction>();
     JavaScriptBackend backend = builder.backend;
-    otherLocals.directLocals.forEach((element, instruction) {
+    otherLocals.directLocals.forEach((Local local,
+                                      HInstruction instruction) {
       // We know 'this' cannot be modified.
-      if (identical(element, closureData.thisElement)) {
-        assert(directLocals[element] == instruction);
-        joinedLocals[element] = instruction;
+      if (identical(local, closureData.thisLocal)) {
+        assert(directLocals[local] == instruction);
+        joinedLocals[local] = instruction;
       } else {
-        HInstruction mine = directLocals[element];
+        HInstruction mine = directLocals[local];
         if (mine == null) return;
         if (identical(instruction, mine)) {
-          joinedLocals[element] = instruction;
+          joinedLocals[local] = instruction;
         } else {
           HInstruction phi = new HPhi.manyInputs(
-              element, <HInstruction>[mine, instruction], backend.dynamicType);
+              local, <HInstruction>[mine, instruction], backend.dynamicType);
           joinBlock.addPhi(phi);
-          joinedLocals[element] = phi;
+          joinedLocals[local] = phi;
         }
       }
     });
@@ -629,14 +618,14 @@
                               HBasicBlock joinBlock) {
     assert(localsHandlers.length > 0);
     if (localsHandlers.length == 1) return localsHandlers[0];
-    Map<Element, HInstruction> joinedLocals =
-        new Map<Element,HInstruction>();
+    Map<Local, HInstruction> joinedLocals =
+        new Map<Local, HInstruction>();
     HInstruction thisValue = null;
     JavaScriptBackend backend = builder.backend;
-    directLocals.forEach((Element element, HInstruction instruction) {
-      if (element != closureData.thisElement) {
-        HPhi phi = new HPhi.noInputs(element, backend.dynamicType);
-        joinedLocals[element] = phi;
+    directLocals.forEach((Local local, HInstruction instruction) {
+      if (local != closureData.thisLocal) {
+        HPhi phi = new HPhi.noInputs(local, backend.dynamicType);
+        joinedLocals[local] = phi;
         joinBlock.addPhi(phi);
       } else {
         // We know that "this" never changes, if it's there.
@@ -646,8 +635,9 @@
       }
     });
     for (LocalsHandler handler in localsHandlers) {
-      handler.directLocals.forEach((Element element, HInstruction instruction) {
-        HPhi phi = joinedLocals[element];
+      handler.directLocals.forEach((Local local,
+                                    HInstruction instruction) {
+        HPhi phi = joinedLocals[local];
         if (phi != null) {
           phi.addInput(instruction);
         }
@@ -655,17 +645,18 @@
     }
     if (thisValue != null) {
       // If there was a "this" for the scope, add it to the new locals.
-      joinedLocals[closureData.thisElement] = thisValue;
+      joinedLocals[closureData.thisLocal] = thisValue;
     }
 
     // Remove locals that are not in all handlers.
-    directLocals = new Map<Element, HInstruction>();
-    joinedLocals.forEach((element, instruction) {
-      if (element != closureData.thisElement
+    directLocals = new Map<Local, HInstruction>();
+    joinedLocals.forEach((Local local,
+                          HInstruction instruction) {
+      if (local != closureData.thisLocal
           && instruction.inputs.length != localsHandlers.length) {
         joinBlock.removePhi(instruction);
       } else {
-        directLocals[element] = instruction;
+        directLocals[local] = instruction;
       }
     });
     return this;
@@ -963,7 +954,8 @@
 
   HParameterValue lastAddedParameter;
 
-  Map<Element, HInstruction> parameters = <Element, HInstruction>{};
+  Map<ParameterElement, HInstruction> parameters =
+      <ParameterElement, HInstruction>{};
 
   Map<TargetElement, JumpHandler> jumpTargets = <TargetElement, JumpHandler>{};
 
@@ -972,7 +964,8 @@
    * being updated in try/catch blocks, and should be
    * accessed indirectly through [HLocalGet] and [HLocalSet].
    */
-  Map<Element, HLocalValue> activationVariables = <Element, HLocalValue>{};
+  Map<Local, HLocalValue> activationVariables =
+      <Local, HLocalValue>{};
 
   // We build the Ssa graph by simulating a stack machine.
   List<HInstruction> stack = <HInstruction>[];
@@ -1355,7 +1348,7 @@
 
   final List<AstInliningState> inliningStack = <AstInliningState>[];
 
-  Element returnElement;
+  Local returnLocal;
   DartType returnType;
 
   bool inTryStatement = false;
@@ -1383,8 +1376,8 @@
   TypeMask getTypeOfThis() {
     TypeMask result = cachedTypeOfThis;
     if (result == null) {
-      ThisElement element = localsHandler.closureData.thisElement;
-      ClassElement cls = element.enclosingElement.enclosingClass;
+      ThisLocal element = localsHandler.closureData.thisLocal;
+      ClassElement cls = element.enclosingClass;
       if (compiler.world.isUsedAsMixin(cls)) {
         // If the enclosing class is used as a mixin, [:this:] can be
         // of the class that mixins the enclosing class. These two
@@ -1517,9 +1510,9 @@
     return bodyElement;
   }
 
-  HParameterValue addParameter(Element element, TypeMask type) {
+  HParameterValue addParameter(Local parameter, TypeMask type) {
     assert(inliningStack.isEmpty);
-    HParameterValue result = new HParameterValue(element, type);
+    HParameterValue result = new HParameterValue(parameter, type);
     if (lastAddedParameter == null) {
       graph.entry.addBefore(graph.entry.first, result);
     } else {
@@ -1536,7 +1529,7 @@
    * When inlining a function, [:return:] statements are not emitted as
    * [HReturn] instructions. Instead, the value of a synthetic element is
    * updated in the [localsHandler]. This function creates such an element and
-   * stores it in the [returnElement] field.
+   * stores it in the [returnLocal] field.
    */
   void setupStateForInlining(FunctionElement function,
                              List<HInstruction> compiledArguments) {
@@ -1544,22 +1537,20 @@
     localsHandler.closureData =
         compiler.closureToClassMapper.computeClosureToClassMapping(
             function, function.node, elements);
-    // TODO(kasperl): Bad smell. We shouldn't be constructing elements here.
-    returnElement = new VariableElementX.synthetic("result",
-        ElementKind.VARIABLE, function);
-    localsHandler.updateLocal(returnElement,
+    returnLocal = new SyntheticLocal("result");
+    localsHandler.updateLocal(returnLocal,
         graph.addConstantNull(compiler));
 
     inTryStatement = false; // TODO(lry): why? Document.
 
     int argumentIndex = 0;
     if (function.isInstanceMember) {
-      localsHandler.updateLocal(localsHandler.closureData.thisElement,
+      localsHandler.updateLocal(localsHandler.closureData.thisLocal,
           compiledArguments[argumentIndex++]);
     }
 
     FunctionSignature signature = function.functionSignature;
-    signature.orderedForEachParameter((Element parameter) {
+    signature.orderedForEachParameter((ParameterElement parameter) {
       HInstruction argument = compiledArguments[argumentIndex++];
       localsHandler.updateLocal(parameter, argument);
     });
@@ -1584,7 +1575,7 @@
 
   void restoreState(AstInliningState state) {
     localsHandler = state.oldLocalsHandler;
-    returnElement = state.oldReturnElement;
+    returnLocal = state.oldReturnLocal;
     inTryStatement = state.inTryStatement;
     elements = state.oldElements;
     returnType = state.oldReturnType;
@@ -1673,14 +1664,15 @@
           Iterator<DartType> variables = typeVariables.iterator;
           type.typeArguments.forEach((DartType argument) {
             variables.moveNext();
+            TypeVariableType typeVariable = variables.current;
             localsHandler.updateLocal(
-                variables.current.element,
+                typeVariable.element,
                 analyzeTypeArgument(argument));
           });
         } else {
           // If the supertype is a raw type, we need to set to null the
           // type variables.
-          for (DartType variable in typeVariables) {
+          for (TypeVariableType variable in typeVariables) {
             localsHandler.updateLocal(variable.element,
                 graph.addConstantNull(compiler));
           }
@@ -1698,7 +1690,7 @@
 
       int index = 0;
       FunctionSignature params = callee.functionSignature;
-      params.orderedForEachParameter((Element parameter) {
+      params.orderedForEachParameter((ParameterElement parameter) {
         HInstruction argument = compiledArguments[index++];
         // Because we are inlining the initializer, we must update
         // what was given as parameter. This will be used in case
@@ -1707,7 +1699,7 @@
         localsHandler.updateLocal(parameter, argument);
         // Don't forget to update the field, if the parameter is of the
         // form [:this.x:].
-        if (parameter.kind == ElementKind.FIELD_PARAMETER) {
+        if (parameter.isFieldParameter) {
           FieldParameterElement fieldParameterElement = parameter;
           fieldValues[fieldParameterElement.fieldElement] = argument;
         }
@@ -1746,8 +1738,8 @@
     assert(invariant(constructor, constructor.isImplementation));
     if (constructor.isSynthesized) {
       List<HInstruction> arguments = <HInstruction>[];
-      HInstruction compileArgument(Element element) {
-        return localsHandler.readLocal(element);
+      HInstruction compileArgument(ParameterElement parameter) {
+        return localsHandler.readLocal(parameter);
       }
 
       Element target = constructor.definingConstructor.implementation;
@@ -1909,13 +1901,14 @@
 
     // Compile field-parameters such as [:this.x:].
     FunctionSignature params = functionElement.functionSignature;
-    params.orderedForEachParameter((Element element) {
-      if (element.kind == ElementKind.FIELD_PARAMETER) {
+    params.orderedForEachParameter((ParameterElement parameter) {
+      if (parameter.isFieldParameter) {
         // If the [element] is a field-parameter then
         // initialize the field element with its value.
-        FieldParameterElement fieldParameterElement = element;
-        HInstruction parameterValue = localsHandler.readLocal(element);
-        fieldValues[fieldParameterElement.fieldElement] = parameterValue;
+        FieldParameterElement fieldParameter = parameter;
+        HInstruction parameterValue =
+            localsHandler.readLocal(fieldParameter);
+        fieldValues[fieldParameter.fieldElement] = parameterValue;
       }
     });
 
@@ -1981,7 +1974,7 @@
       // we can simply copy the list from this.
 
       // These locals are modified by [isIndexedTypeArgumentGet].
-      HInstruction source;  // The source of the type arguments.
+      HThis source;  // The source of the type arguments.
       bool allIndexed = true;
       int expectedIndex = 0;
       ClassElement contextClass;  // The class of `this`.
@@ -2068,7 +2061,7 @@
 
       FunctionSignature functionSignature = body.functionSignature;
       // Provide the parameters to the generative constructor body.
-      functionSignature.orderedForEachParameter((parameter) {
+      functionSignature.orderedForEachParameter((ParameterElement parameter) {
         // If [parameter] is boxed, it will be a field in the box passed as the
         // last parameter. So no need to directly pass it.
         if (!localsHandler.isBoxed(parameter)) {
@@ -2080,7 +2073,7 @@
       if (backend.classNeedsRti(currentClass)) {
         // If [currentClass] needs RTI, we add the type variables as
         // parameters of the generative constructor body.
-        currentClass.typeVariables.forEach((DartType argument) {
+        currentClass.typeVariables.forEach((TypeVariableType argument) {
           // TODO(johnniwinther): Substitute [argument] with
           // `localsHandler.substInContext(argument)`.
           bodyCallInputs.add(localsHandler.readLocal(argument.element));
@@ -2109,7 +2102,7 @@
       closeAndGotoExit(new HReturn(newObject));
       return closeFunction();
     } else {
-      localsHandler.updateLocal(returnElement, newObject);
+      localsHandler.updateLocal(returnLocal, newObject);
       return null;
     }
   }
@@ -2150,13 +2143,12 @@
       // because that is where the type guards will also be inserted.
       // This way we ensure that a type guard will dominate the type
       // check.
+      ClosureScope scopeData =
+          localsHandler.closureData.capturingScopes[node];
       signature.orderedForEachParameter((ParameterElement parameterElement) {
         if (element.isGenerativeConstructorBody) {
-          ClosureScope scopeData =
-              localsHandler.closureData.capturingScopes[node];
-          if (scopeData != null
-              && scopeData.capturedVariableMapping.containsKey(
-                  parameterElement)) {
+          if (scopeData != null &&
+              scopeData.isCapturedVariable(parameterElement)) {
             // The parameter will be a field in the box passed as the
             // last parameter. So no need to have it.
             return;
@@ -2851,7 +2843,7 @@
         compiler.closureToClassMapper.getMappingForNestedFunction(node);
     assert(nestedClosureData != null);
     assert(nestedClosureData.closureClassElement != null);
-    ClassElement closureClassElement =
+    ClosureClassElement closureClassElement =
         nestedClosureData.closureClassElement;
     FunctionElement callElement = nestedClosureData.callElement;
     // TODO(ahe): This should be registered in codegen, not here.
@@ -2862,14 +2854,11 @@
     registry.registerInstantiatedClass(closureClassElement);
 
     List<HInstruction> capturedVariables = <HInstruction>[];
-    closureClassElement.forEachMember((_, Element member) {
-      // The backendMembers also contains the call method(s). We are only
-      // interested in the fields.
-      if (member.isField) {
-        Element capturedLocal = nestedClosureData.capturedFieldMapping[member];
-        assert(capturedLocal != null);
-        capturedVariables.add(localsHandler.readLocal(capturedLocal));
-      }
+    closureClassElement.closureFields.forEach((ClosureFieldElement field) {
+      Local capturedLocal =
+          nestedClosureData.getLocalVariableForClosureField(field);
+      assert(capturedLocal != null);
+      capturedVariables.add(localsHandler.readLocal(capturedLocal));
     });
 
     TypeMask type = new TypeMask.nonNullExact(compiler.functionClass);
@@ -2884,7 +2873,8 @@
   visitFunctionDeclaration(ast.FunctionDeclaration node) {
     assert(isReachable);
     visit(node.function);
-    localsHandler.updateLocal(elements[node], pop());
+    FunctionElement localFunction = elements[node];
+    localsHandler.updateLocal(localFunction, pop());
   }
 
   visitIdentifier(ast.Identifier node) {
@@ -3079,7 +3069,8 @@
                                 noSuchMethodTargetSymbolString(element, 'get'),
                                 argumentNodes: const Link<ast.Node>());
     } else {
-      stack.add(localsHandler.readLocal(element));
+      TypedElement local = element;
+      stack.add(localsHandler.readLocal(local));
     }
   }
 
@@ -3132,17 +3123,18 @@
                                 argumentValues: arguments);
     } else {
       stack.add(value);
+      TypedElement local = element;
       // If the value does not already have a name, give it here.
       if (value.sourceElement == null) {
-        value.sourceElement = element;
+        value.sourceElement = local;
       }
       HInstruction checked =
-          potentiallyCheckType(value, element.computeType(compiler));
+          potentiallyCheckType(value, local.type);
       if (!identical(checked, value)) {
         pop();
         stack.add(checked);
       }
-      localsHandler.updateLocal(element, checked);
+      localsHandler.updateLocal(local, checked);
     }
   }
 
@@ -3386,8 +3378,8 @@
       visit(node.selector);
       closureTarget = pop();
     } else {
-      assert(Elements.isLocal(element));
-      closureTarget = localsHandler.readLocal(element);
+      TypedElement local = element;
+      closureTarget = localsHandler.readLocal(local);
     }
     var inputs = <HInstruction>[];
     inputs.add(closureTarget);
@@ -3886,9 +3878,9 @@
   // TODO(karlklose): this is needed to avoid a bug where the resolved type is
   // not stored on a type annotation in the closure translator. Remove when
   // fixed.
-  bool hasDirectLocal(Element element) {
-    return !localsHandler.isAccessedDirectly(element) ||
-        localsHandler.directLocals[element] != null;
+  bool hasDirectLocal(Local local) {
+    return !localsHandler.isAccessedDirectly(local) ||
+        localsHandler.directLocals[local] != null;
   }
 
   /**
@@ -4882,7 +4874,7 @@
       FunctionSignature targetSignature = targetConstructor.functionSignature;
       FunctionSignature redirectingSignature =
           redirectingConstructor.functionSignature;
-      redirectingSignature.forEachRequiredParameter((Element element) {
+      redirectingSignature.forEachRequiredParameter((ParameterElement element) {
         inputs.add(localsHandler.readLocal(element));
       });
       List<Element> targetOptionals =
@@ -4891,7 +4883,8 @@
           redirectingSignature.orderedOptionalParameters;
       int i = 0;
       for (; i < redirectingOptionals.length; i++) {
-        inputs.add(localsHandler.readLocal(redirectingOptionals[i]));
+        ParameterElement parameter = redirectingOptionals[i];
+        inputs.add(localsHandler.readLocal(parameter));
       }
       for (; i < targetOptionals.length; i++) {
         inputs.add(handleConstantForOptionalParameter(targetOptionals[i]));
@@ -4942,7 +4935,8 @@
       ast.Node definition = link.head;
       if (definition is ast.Identifier) {
         HInstruction initialValue = graph.addConstantNull(compiler);
-        localsHandler.updateLocal(elements[definition], initialValue);
+        VariableElement local = elements[definition];
+        localsHandler.updateLocal(local, initialValue);
       } else {
         assert(definition is ast.SendSet);
         visitSendSet(definition);
@@ -5636,11 +5630,9 @@
       localsHandler = new LocalsHandler.from(savedLocals);
       startCatchBlock = graph.addNewBlock();
       open(startCatchBlock);
-      // TODO(kasperl): Bad smell. We shouldn't be constructing elements here.
-      // Note that the name of this element is irrelevant.
-      Element element = new VariableElementX.synthetic('exception',
-          ElementKind.PARAMETER, sourceElement);
-      exception = new HLocalValue(element, backend.nonNullType);
+      // Note that the name of this local is irrelevant.
+      SyntheticLocal local = new SyntheticLocal('exception');
+      exception = new HLocalValue(local, backend.nonNullType);
       add(exception);
       HInstruction oldRethrowableException = rethrowableException;
       rethrowableException = exception;
@@ -5684,14 +5676,16 @@
         ast.CatchBlock catchBlock = link.head;
         link = link.tail;
         if (catchBlock.exception != null) {
-          localsHandler.updateLocal(elements[catchBlock.exception],
+          VariableElement exceptionVariable = elements[catchBlock.exception];
+          localsHandler.updateLocal(exceptionVariable,
                                     unwrappedException);
         }
         ast.Node trace = catchBlock.trace;
         if (trace != null) {
           pushInvokeStatic(trace, backend.getTraceFromException(), [exception]);
           HInstruction traceInstruction = pop();
-          localsHandler.updateLocal(elements[trace], traceInstruction);
+          VariableElement traceVariable = elements[trace];
+          localsHandler.updateLocal(traceVariable, traceInstruction);
         }
         visit(catchBlock);
       }
@@ -5812,7 +5806,7 @@
                           ast.Node _,
                           List<HInstruction> compiledArguments) {
     AstInliningState state = new AstInliningState(
-        function, returnElement, returnType, elements, stack, localsHandler,
+        function, returnLocal, returnType, elements, stack, localsHandler,
         inTryStatement);
     inliningStack.add(state);
 
@@ -5823,7 +5817,7 @@
   }
 
   void leaveInlinedMethod() {
-    HInstruction result = localsHandler.readLocal(returnElement);
+    HInstruction result = localsHandler.readLocal(returnLocal);
     AstInliningState state = inliningStack.removeLast();
     restoreState(state);
     stack.add(result);
@@ -5837,7 +5831,7 @@
     if (inliningStack.isEmpty) {
       closeAndGotoExit(attachPosition(new HReturn(value), node));
     } else {
-      localsHandler.updateLocal(returnElement, value);
+      localsHandler.updateLocal(returnLocal, value);
     }
   }
 }
@@ -6050,7 +6044,7 @@
 }
 
 class AstInliningState extends InliningState {
-  final Element oldReturnElement;
+  final Local oldReturnLocal;
   final DartType oldReturnType;
   final TreeElements oldElements;
   final List<HInstruction> oldStack;
@@ -6058,7 +6052,7 @@
   final bool inTryStatement;
 
   AstInliningState(FunctionElement function,
-                   this.oldReturnElement,
+                   this.oldReturnLocal,
                    this.oldReturnType,
                    this.oldElements,
                    this.oldStack,
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 5b1005e..e8f5746 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -317,8 +317,9 @@
   visitLess(HLess node) => visitRelational(node);
   visitLessEqual(HLessEqual node) => visitRelational(node);
   visitLiteralList(HLiteralList node) => visitInstruction(node);
-  visitLocalGet(HLocalGet node) => visitFieldAccess(node);
-  visitLocalSet(HLocalSet node) => visitFieldAccess(node);
+  visitLocalAccess(HLocalAccess node) => visitInstruction(node);
+  visitLocalGet(HLocalGet node) => visitLocalAccess(node);
+  visitLocalSet(HLocalSet node) => visitLocalAccess(node);
   visitLocalValue(HLocalValue node) => visitInstruction(node);
   visitLoopBranch(HLoopBranch node) => visitConditionalBranch(node);
   visitNegate(HNegate node) => visitInvokeUnary(node);
@@ -757,7 +758,7 @@
 }
 
 abstract class HInstruction implements Spannable {
-  Element sourceElement;
+  Entity sourceElement;
   SourceFileLocation sourcePosition;
 
   final int id;
@@ -1528,9 +1529,11 @@
     // stored in the generated closure class, and accessed through a
     // [HFieldGet].
     JavaScriptBackend backend = compiler.backend;
-    bool interceptor =
-        backend.isInterceptorClass(sourceElement.enclosingClass);
-    return interceptor && sourceElement is ThisElement;
+    if (sourceElement is ThisLocal) {
+      ThisLocal thisLocal = sourceElement;
+      return backend.isInterceptorClass(thisLocal.enclosingClass);
+    }
+    return false;
   }
 
   bool canThrow() => receiver.canBeNull();
@@ -1622,20 +1625,29 @@
   String toString() => "ReadModifyWrite $jsOp $opKind $element";
 }
 
-class HLocalGet extends HFieldAccess {
+abstract class HLocalAccess extends HInstruction {
+  final Local variable;
+
+  HLocalAccess(this.variable, List<HInstruction> inputs, TypeMask type)
+      : super(inputs, type);
+
+  HInstruction get receiver => inputs[0];
+}
+
+class HLocalGet extends HLocalAccess {
   // No need to use GVN for a [HLocalGet], it is just a local
   // access.
-  HLocalGet(Element element, HLocalValue local, TypeMask type)
-      : super(element, <HInstruction>[local], type);
+  HLocalGet(Local variable, HLocalValue local, TypeMask type)
+      : super(variable, <HInstruction>[local], type);
 
   accept(HVisitor visitor) => visitor.visitLocalGet(this);
 
   HLocalValue get local => inputs[0];
 }
 
-class HLocalSet extends HFieldAccess {
-  HLocalSet(Element element, HLocalValue local, HInstruction value)
-      : super(element, <HInstruction>[local, value],
+class HLocalSet extends HLocalAccess {
+  HLocalSet(Local variable, HLocalValue local, HInstruction value)
+      : super(variable, <HInstruction>[local, value],
               const TypeMask.nonNullEmpty());
 
   accept(HVisitor visitor) => visitor.visitLocalSet(this);
@@ -2040,8 +2052,9 @@
   * value from the start, whereas [HLocalValue]s need to be initialized first.
   */
 class HLocalValue extends HInstruction {
-  HLocalValue(Element element, TypeMask type) : super(<HInstruction>[], type) {
-    sourceElement = element;
+  HLocalValue(Local variable, TypeMask type)
+      : super(<HInstruction>[], type) {
+    sourceElement = variable;
   }
 
   toString() => 'local ${sourceElement.name}';
@@ -2049,21 +2062,27 @@
 }
 
 class HParameterValue extends HLocalValue {
-  HParameterValue(Element element, type) : super(element, type);
+  HParameterValue(Local variable, type) : super(variable, type);
 
   toString() => 'parameter ${sourceElement.name}';
   accept(HVisitor visitor) => visitor.visitParameterValue(this);
 }
 
 class HThis extends HParameterValue {
-  HThis(Element element, TypeMask type) : super(element, type);
-  toString() => 'this';
+  HThis(ThisLocal element, TypeMask type) : super(element, type);
+
+  ThisLocal get sourceElement => super.sourceElement;
+
   accept(HVisitor visitor) => visitor.visitThis(this);
+
   bool isCodeMotionInvariant() => true;
+
   bool isInterceptor(Compiler compiler) {
     JavaScriptBackend backend = compiler.backend;
     return backend.isInterceptorClass(sourceElement.enclosingClass);
   }
+
+  String toString() => 'this';
 }
 
 class HPhi extends HInstruction {
@@ -2076,16 +2095,18 @@
   // The order of the [inputs] must correspond to the order of the
   // predecessor-edges. That is if an input comes from the first predecessor
   // of the surrounding block, then the input must be the first in the [HPhi].
-  HPhi(Element element, List<HInstruction> inputs, TypeMask type)
+  HPhi(Local variable, List<HInstruction> inputs, TypeMask type)
       : super(inputs, type) {
-    sourceElement = element;
+    sourceElement = variable;
   }
-  HPhi.noInputs(Element element, TypeMask type)
-      : this(element, <HInstruction>[], type);
-  HPhi.singleInput(Element element, HInstruction input, TypeMask type)
-      : this(element, <HInstruction>[input], type);
-  HPhi.manyInputs(Element element, List<HInstruction> inputs, TypeMask type)
-      : this(element, inputs, type);
+  HPhi.noInputs(Local variable, TypeMask type)
+      : this(variable, <HInstruction>[], type);
+  HPhi.singleInput(Local variable, HInstruction input, TypeMask type)
+      : this(variable, <HInstruction>[input], type);
+  HPhi.manyInputs(Local variable,
+                  List<HInstruction> inputs,
+                  TypeMask type)
+      : this(variable, inputs, type);
 
   void addInput(HInstruction input) {
     assert(isInBasicBlock());
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
index cb08770..9aa417e 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/ssa_tracer.dart
@@ -233,13 +233,13 @@
   }
 
   String visitLocalGet(HLocalGet node) {
-    String localName = node.element.name;
+    String localName = node.variable.name;
     return 'local get ${temporaryId(node.local)}.$localName';
   }
 
   String visitLocalSet(HLocalSet node) {
     String valueId = temporaryId(node.value);
-    String localName = node.element.name;
+    String localName = node.variable.name;
     return 'local set ${temporaryId(node.local)}.$localName to $valueId';
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/tracer.dart b/sdk/lib/_internal/compiler/implementation/tracer.dart
index 46efc0f..d766fe6 100644
--- a/sdk/lib/_internal/compiler/implementation/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/tracer.dart
@@ -8,10 +8,10 @@
 import 'dart:async' show EventSink;
 import 'ssa/ssa.dart' as ssa;
 import 'ssa/ssa_tracer.dart' show HTracer;
-import 'ir/ir_nodes.dart' as ir;
-import 'ir/ir_tracer.dart' show IRTracer;
-import 'dart_backend/dart_tree.dart' as tree;
-import 'dart_backend/tree_tracer.dart' show TreeTracer;
+import 'cps_ir/cps_ir_nodes.dart' as cps_ir;
+import 'cps_ir/cps_ir_tracer.dart' show IRTracer;
+import 'dart_backend/tree_ir_nodes.dart' as tree_ir;
+import 'dart_backend/tree_ir_tracer.dart' show TreeTracer;
 import 'dart2jslib.dart';
 
 /**
@@ -57,10 +57,10 @@
     if (irObject is ssa.HGraph) {
       new HTracer(output, compiler, context).traceGraph(name, irObject);
     }
-    else if (irObject is ir.FunctionDefinition) {
+    else if (irObject is cps_ir.FunctionDefinition) {
       new IRTracer(output).traceGraph(name, irObject);
     }
-    else if (irObject is tree.FunctionDefinition) {
+    else if (irObject is tree_ir.FunctionDefinition) {
       new TreeTracer(output).traceGraph(name, irObject);
     }
   }
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index cabe18d..8904464 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -40,9 +40,9 @@
 
 import 'ssa/ssa.dart' as ssa;
 
-import 'ir/ir_nodes.dart' as ir_nodes;
+import 'cps_ir/cps_ir_nodes.dart' as cps_ir_nodes;
 
-import 'ir/ir_builder.dart' as ir_builder;
+import 'cps_ir/cps_ir_builder.dart' as ir_builder;
 
 class ElementVisitor extends elements_visitor.ElementVisitor {
   visitElement(e) {}
@@ -134,7 +134,6 @@
     ..visit(null)
     ..visitAbstractFieldElement(null)
     ..visitAmbiguousElement(null)
-    ..visitBoxElement(null)
     ..visitBoxFieldElement(null)
     ..visitClassElement(null)
     ..visitClosureClassElement(null)
@@ -145,14 +144,12 @@
     ..visitErroneousElement(null)
     ..visitFieldParameterElement(null)
     ..visitFunctionElement(null)
-    ..visitInterceptedElement(null)
     ..visitLabelElement(null)
     ..visitLibraryElement(null)
     ..visitMixinApplicationElement(null)
     ..visitPrefixElement(null)
     ..visitScopeContainerElement(null)
     ..visitTargetElement(null)
-    ..visitThisElement(null)
     ..visitTypeDeclarationElement(null)
     ..visitTypeVariableElement(null)
     ..visitTypedefElement(null)
@@ -213,9 +210,9 @@
   n.isAccessibleFrom(null);
 }
 
-useIr(ir_nodes.SExpressionStringifier stringifier,
+useIr(cps_ir_nodes.SExpressionStringifier stringifier,
       ir_builder.IrBuilderTask task) {
-  new ir_nodes.SExpressionStringifier();
+  new cps_ir_nodes.SExpressionStringifier();
   stringifier
     ..newContinuationName()
     ..newValueName()
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index 9aec329..02c2ebf 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -1854,6 +1854,28 @@
       howToFix: DONT_KNOW_HOW_TO_FIX,
       examples: const ["main(x) {x}"]);
 
+  static const MessageKind CONSIDER_ANALYZE_ALL = const MessageKind(
+      "Could not find '#{main}'.  Nothing will be analyzed.",
+      howToFix: "Try using '--analyze-all' to analyze everything.",
+      examples: const ['']);
+
+  static const MessageKind MISSING_MAIN = const MessageKind(
+      "Could not find '#{main}'.",
+      howToFix: "Try adding a method named '#{main}' to your program."
+      /* No example, test uses '--analyze-only' which will produce the above
+       * message [CONSIDER_ANALYZE_ALL].  An example for a human operator would
+       * be an empty file. */);
+
+  static const MessageKind MAIN_NOT_A_FUNCTION = const MessageKind(
+      "'#{main}' is not a function.",
+      howToFix: DONT_KNOW_HOW_TO_FIX, /* Don't state the obvious. */
+      examples: const ['var main;']);
+
+  static const MessageKind MAIN_WITH_EXTRA_PARAMETER = const MessageKind(
+      "'#{main}' cannot have more than two parameters.",
+      howToFix: DONT_KNOW_HOW_TO_FIX, /* Don't state the obvious. */
+      examples: const ['main(a, b, c) {}']);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "The compiler crashed when compiling this element.");
 
diff --git a/sdk/lib/_internal/lib/async_patch.dart b/sdk/lib/_internal/lib/async_patch.dart
index 0203e4d..004f433 100644
--- a/sdk/lib/_internal/lib/async_patch.dart
+++ b/sdk/lib/_internal/lib/async_patch.dart
@@ -8,7 +8,8 @@
     patch,
     Primitives,
     convertDartClosureToJS,
-    loadDeferredLibrary;
+    loadDeferredLibrary,
+    requiresPreamble;
 import 'dart:_isolate_helper' show
     IsolateNatives,
     TimerImpl,
@@ -30,11 +31,44 @@
       _initializeScheduleImmediate();
 
   static Function _initializeScheduleImmediate() {
+    requiresPreamble();
     if (JS('', 'self.scheduleImmediate') != null) {
       return _scheduleImmediateJsOverride;
     }
+    if (JS('', 'self.MutationObserver') != null &&
+        JS('', 'self.document') != null) {
+      // Use mutationObservers.
+      var div = JS('', 'self.document.createElement("div")');
+      var span = JS('', 'self.document.createElement("span")');
+      var storedCallback;
+
+      internalCallback(_) {
+        leaveJsAsync();
+        var f = storedCallback;
+        storedCallback = null;
+        f();
+      };
+
+      var observer = JS('', 'new self.MutationObserver(#)',
+          convertDartClosureToJS(internalCallback, 1));
+      JS('', '#.observe(#, { childList: true })',
+          observer, div);
+
+      return (void callback()) {
+        assert(storedCallback == null);
+        enterJsAsync();
+        storedCallback = callback;
+        // Because of a broken shadow-dom polyfill we have to change the
+        // children instead a cheap property.
+        // See https://github.com/Polymer/ShadowDOM/issues/468
+        JS('', '#.firstChild ? #.removeChild(#): #.appendChild(#)',
+            div, div, span, div, span);
+      };
+
+    }
     // TODO(9002): don't use the Timer to enqueue the immediate callback.
-    // Also check for other JS options like mutation observer or runImmediate.
+    // Also check for other JS options like setImmediate.
+    // TODO(20055): We should use DOM promises when available.
     return _scheduleImmediateWithTimer;
   }
 
diff --git a/sdk/lib/_internal/lib/convert_patch.dart b/sdk/lib/_internal/lib/convert_patch.dart
index 7de2808..ec09d24 100644
--- a/sdk/lib/_internal/lib/convert_patch.dart
+++ b/sdk/lib/_internal/lib/convert_patch.dart
@@ -269,7 +269,10 @@
 
   Map get _upgradedMap {
     assert(_isUpgraded);
-    return _data;
+    // 'cast' the union type to LinkedHashMap.  It would be even better if we
+    // could 'cast' to the implementation type, since LinkedHashMap includes
+    // _JsonMap.
+    return JS('LinkedHashMap', '#', _data);
   }
 
   List<String> _computeKeys() {
@@ -278,7 +281,7 @@
     if (keys == null) {
       keys = _data = _getPropertyNames(_original);
     }
-    return keys;
+    return JS('JSExtendableArray', '#', keys);
   }
 
   Map _upgrade() {
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 37f016e..41fc902 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -3330,3 +3330,23 @@
     return completer.future;
   });
 }
+
+class MainError extends Error implements NoSuchMethodError {
+  final String _message;
+
+  MainError(this._message);
+
+  String toString() => 'NoSuchMethodError: $_message';
+}
+
+void missingMain() {
+  throw new MainError("No top-level function named 'main'.");
+}
+
+void badMain() {
+  throw new MainError("'main' is not a function.");
+}
+
+void mainHasTooManyParameters() {
+  throw new MainError("'main' expects too many parameters.");
+}
diff --git a/sdk/lib/_internal/lib/native_typed_data.dart b/sdk/lib/_internal/lib/native_typed_data.dart
index 9b6e568..575e827 100644
--- a/sdk/lib/_internal/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/lib/native_typed_data.dart
@@ -60,8 +60,8 @@
   }
 
   Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
-    NativeUint32List storage =
-        this.asUint32List(offsetInBytes, length != null ? length * 4 : null);
+    NativeInt32List storage =
+        this.asInt32List(offsetInBytes, length != null ? length * 4 : null);
     return new NativeInt32x4List._externalStorage(storage);
   }
 
@@ -180,15 +180,15 @@
     double _y = _storage[(index * 4) + 1];
     double _z = _storage[(index * 4) + 2];
     double _w = _storage[(index * 4) + 3];
-    return new Float32x4(_x, _y, _z, _w);
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
-  void operator[]=(int index, NativeFloat32x4 value) {
+  void operator[]=(int index, Float32x4 value) {
     _checkIndex(index, length);
-    _storage[(index * 4) + 0] = value._storage[0];
-    _storage[(index * 4) + 1] = value._storage[1];
-    _storage[(index * 4) + 2] = value._storage[2];
-    _storage[(index * 4) + 3] = value._storage[3];
+    _storage[(index * 4) + 0] = value.x;
+    _storage[(index * 4) + 1] = value.y;
+    _storage[(index * 4) + 2] = value.z;
+    _storage[(index * 4) + 3] = value.w;
   }
 
   List<Float32x4> sublist(int start, [int end]) {
@@ -208,18 +208,18 @@
     extends Object with ListMixin<Int32x4>, FixedLengthListMixin<Int32x4>
     implements Int32x4List {
 
-  final Uint32List _storage;
+  final Int32List _storage;
 
   /**
    * Creates a [Int32x4List] of the specified length (in elements),
    * all of whose elements are initially zero.
    */
-  NativeInt32x4List(int length) : _storage = new NativeUint32List(length * 4);
+  NativeInt32x4List(int length) : _storage = new NativeInt32List(length * 4);
 
-  NativeInt32x4List._externalStorage(Uint32List storage) : _storage = storage;
+  NativeInt32x4List._externalStorage(Int32List storage) : _storage = storage;
 
   NativeInt32x4List._slowFromList(List<Int32x4> list)
-      : _storage = new NativeUint32List(list.length * 4) {
+      : _storage = new NativeInt32List(list.length * 4) {
     for (int i = 0; i < list.length; i++) {
       var e = list[i];
       _storage[(i * 4) + 0] = e.x;
@@ -238,7 +238,7 @@
   factory NativeInt32x4List.fromList(List<Int32x4> list) {
     if (list is NativeInt32x4List) {
       return new NativeInt32x4List._externalStorage(
-          new NativeUint32List.fromList(list._storage));
+          new NativeInt32List.fromList(list._storage));
     } else {
       return new NativeInt32x4List._slowFromList(list);
     }
@@ -287,15 +287,15 @@
     int _y = _storage[(index * 4) + 1];
     int _z = _storage[(index * 4) + 2];
     int _w = _storage[(index * 4) + 3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    return new NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
-  void operator[]=(int index, NativeInt32x4 value) {
+  void operator[]=(int index, Int32x4 value) {
     _checkIndex(index, length);
-    _storage[(index * 4) + 0] = value._storage[0];
-    _storage[(index * 4) + 1] = value._storage[1];
-    _storage[(index * 4) + 2] = value._storage[2];
-    _storage[(index * 4) + 3] = value._storage[3];
+    _storage[(index * 4) + 0] = value.x;
+    _storage[(index * 4) + 1] = value.y;
+    _storage[(index * 4) + 2] = value.z;
+    _storage[(index * 4) + 3] = value.w;
   }
 
   List<Int32x4> sublist(int start, [int end]) {
@@ -393,10 +393,10 @@
     return new Float64x2(_x, _y);
   }
 
-  void operator[]=(int index, NativeFloat64x2 value) {
+  void operator[]=(int index, Float64x2 value) {
     _checkIndex(index, length);
-    _storage[(index * 2) + 0] = value._storage[0];
-    _storage[(index * 2) + 1] = value._storage[1];
+    _storage[(index * 2) + 0] = value.x;
+    _storage[(index * 2) + 1] = value.y;
   }
 
   List<Float64x2> sublist(int start, [int end]) {
@@ -842,7 +842,7 @@
     implements JavaScriptIndexingBehavior {
   int get length => JS('JSUInt32', '#.length', this);
 
-  bool _setRangeFast(int start, int end,
+  void _setRangeFast(int start, int end,
       NativeTypedArray source, int skipCount) {
     int targetLength = this.length;
     _checkIndex(start, targetLength + 1);
@@ -1298,192 +1298,212 @@
  * The lanes are "x", "y", "z", and "w" respectively.
  */
 class NativeFloat32x4 implements Float32x4 {
-  final _storage = new Float32List(4);
+  final double x;
+  final double y;
+  final double z;
+  final double w;
 
-  NativeFloat32x4(double x, double y, double z, double w) {
-    _storage[0] = x;
-    _storage[1] = y;
-    _storage[2] = z;
-    _storage[3] = w;
+  static final NativeFloat32List _list = new NativeFloat32List(4);
+  static final Uint32List _uint32view = _list.buffer.asUint32List();
+
+  static _truncate(x) {
+    _list[0] = x;
+    return _list[0];
   }
 
-  NativeFloat32x4.splat(double v) {
-    _storage[0] = v;
-    _storage[1] = v;
-    _storage[2] = v;
-    _storage[3] = v;
+  NativeFloat32x4(double x, double y, double z, double w)
+    : this.x = _truncate(x),
+      this.y = _truncate(y),
+      this.z = _truncate(z),
+      this.w = _truncate(w) {
+    // We would prefer to check for `double` but in dart2js we can't see the
+    // difference anyway.
+    if (x is! num) throw new ArgumentError(x);
+    if (y is! num) throw new ArgumentError(y);
+    if (z is! num) throw new ArgumentError(z);
+    if (w is! num) throw new ArgumentError(w);
   }
 
-  NativeFloat32x4.zero();
-  /// Returns a bit-wise copy of [x] as a Float32x4.
+  NativeFloat32x4.splat(double v) : this(v, v, v, v);
+  NativeFloat32x4.zero() : this._truncated(0.0, 0.0, 0.0, 0.0);
 
-  NativeFloat32x4.fromInt32x4Bits(NativeInt32x4 x) {
-    var view = x._storage.buffer.asFloat32List();
-    _storage[0] = view[0];
-    _storage[1] = view[1];
-    _storage[2] = view[2];
-    _storage[3] = view[3];
+  /// Returns a bit-wise copy of [i] as a Float32x4.
+  factory NativeFloat32x4.fromInt32x4Bits(Int32x4 i) {
+    _uint32view[0] = i.x;
+    _uint32view[1] = i.y;
+    _uint32view[2] = i.z;
+    _uint32view[3] = i.w;
+    return new NativeFloat32x4._truncated(_list[0], _list[1], _list[2], _list[3]);
   }
 
-  NativeFloat32x4.fromFloat64x2(NativeFloat64x2 v) {
-    _storage[0] = v._storage[0];
-    _storage[1] = v._storage[1];
-  }
+  NativeFloat32x4.fromFloat64x2(Float64x2 v)
+    : this._truncated(_truncate(v.x), _truncate(v.y), 0.0, 0.0);
+
+  /// Creates a new NativeFloat32x4.
+  ///
+  /// Does not verify if the given arguments are non-null.
+  NativeFloat32x4._doubles(double x, double y, double z, double w)
+    : this.x = _truncate(x),
+      this.y = _truncate(y),
+      this.z = _truncate(z),
+      this.w = _truncate(w);
+
+  /// Creates a new NativeFloat32x4.
+  ///
+  /// The constructor does not truncate the arguments. They must already be in
+  /// the correct range. It does not verify the type of the given arguments,
+  /// either.
+  NativeFloat32x4._truncated(this.x, this.y, this.z, this.w);
 
   String toString() {
-    return '[${_storage[0]}, ${_storage[1]}, ${_storage[2]}, ${_storage[3]}]';
+    return '[$x, $y, $z, $w]';
   }
 
    /// Addition operator.
-  Float32x4 operator+(NativeFloat32x4 other) {
-    double _x = _storage[0] + other._storage[0];
-    double _y = _storage[1] + other._storage[1];
-    double _z = _storage[2] + other._storage[2];
-    double _w = _storage[3] + other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 operator+(Float32x4 other) {
+    double _x = x + other.x;
+    double _y = y + other.y;
+    double _z = z + other.z;
+    double _w = w + other.w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Negate operator.
   Float32x4 operator-() {
-    double _x = -_storage[0];
-    double _y = -_storage[1];
-    double _z = -_storage[2];
-    double _w = -_storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    return new NativeFloat32x4._truncated(-x, -y, -z, -w);
   }
 
   /// Subtraction operator.
-  Float32x4 operator-(NativeFloat32x4 other) {
-    double _x = _storage[0] - other._storage[0];
-    double _y = _storage[1] - other._storage[1];
-    double _z = _storage[2] - other._storage[2];
-    double _w = _storage[3] - other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 operator-(Float32x4 other) {
+    double _x = x - other.x;
+    double _y = y - other.y;
+    double _z = z - other.z;
+    double _w = w - other.w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Multiplication operator.
-  Float32x4 operator*(NativeFloat32x4 other) {
-    double _x = _storage[0] * other._storage[0];
-    double _y = _storage[1] * other._storage[1];
-    double _z = _storage[2] * other._storage[2];
-    double _w = _storage[3] * other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 operator*(Float32x4 other) {
+    double _x = x * other.x;
+    double _y = y * other.y;
+    double _z = z * other.z;
+    double _w = w * other.w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Division operator.
-  Float32x4 operator/(NativeFloat32x4 other) {
-    double _x = _storage[0] / other._storage[0];
-    double _y = _storage[1] / other._storage[1];
-    double _z = _storage[2] / other._storage[2];
-    double _w = _storage[3] / other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 operator/(Float32x4 other) {
+    double _x = x / other.x;
+    double _y = y / other.y;
+    double _z = z / other.z;
+    double _w = w / other.w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Relational less than.
-  Int32x4 lessThan(NativeFloat32x4 other) {
-    bool _cx = _storage[0] < other._storage[0];
-    bool _cy = _storage[1] < other._storage[1];
-    bool _cz = _storage[2] < other._storage[2];
-    bool _cw = _storage[3] < other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 lessThan(Float32x4 other) {
+    bool _cx = x < other.x;
+    bool _cy = y < other.y;
+    bool _cz = z < other.z;
+    bool _cw = w < other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Relational less than or equal.
-  Int32x4 lessThanOrEqual(NativeFloat32x4 other) {
-    bool _cx = _storage[0] <= other._storage[0];
-    bool _cy = _storage[1] <= other._storage[1];
-    bool _cz = _storage[2] <= other._storage[2];
-    bool _cw = _storage[3] <= other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 lessThanOrEqual(Float32x4 other) {
+    bool _cx = x <= other.x;
+    bool _cy = y <= other.y;
+    bool _cz = z <= other.z;
+    bool _cw = w <= other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Relational greater than.
-  Int32x4 greaterThan(NativeFloat32x4 other) {
-    bool _cx = _storage[0] > other._storage[0];
-    bool _cy = _storage[1] > other._storage[1];
-    bool _cz = _storage[2] > other._storage[2];
-    bool _cw = _storage[3] > other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 greaterThan(Float32x4 other) {
+    bool _cx = x > other.x;
+    bool _cy = y > other.y;
+    bool _cz = z > other.z;
+    bool _cw = w > other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Relational greater than or equal.
-  Int32x4 greaterThanOrEqual(NativeFloat32x4 other) {
-    bool _cx = _storage[0] >= other._storage[0];
-    bool _cy = _storage[1] >= other._storage[1];
-    bool _cz = _storage[2] >= other._storage[2];
-    bool _cw = _storage[3] >= other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 greaterThanOrEqual(Float32x4 other) {
+    bool _cx = x >= other.x;
+    bool _cy = y >= other.y;
+    bool _cz = z >= other.z;
+    bool _cw = w >= other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Relational equal.
-  Int32x4 equal(NativeFloat32x4 other) {
-    bool _cx = _storage[0] == other._storage[0];
-    bool _cy = _storage[1] == other._storage[1];
-    bool _cz = _storage[2] == other._storage[2];
-    bool _cw = _storage[3] == other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 equal(Float32x4 other) {
+    bool _cx = x == other.x;
+    bool _cy = y == other.y;
+    bool _cz = z == other.z;
+    bool _cw = w == other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Relational not-equal.
-  Int32x4 notEqual(NativeFloat32x4 other) {
-    bool _cx = _storage[0] != other._storage[0];
-    bool _cy = _storage[1] != other._storage[1];
-    bool _cz = _storage[2] != other._storage[2];
-    bool _cw = _storage[3] != other._storage[3];
-    return new NativeInt32x4(_cx == true ? 0xFFFFFFFF : 0x0,
-                        _cy == true ? 0xFFFFFFFF : 0x0,
-                        _cz == true ? 0xFFFFFFFF : 0x0,
-                        _cw == true ? 0xFFFFFFFF : 0x0);
+  Int32x4 notEqual(Float32x4 other) {
+    bool _cx = x != other.x;
+    bool _cy = y != other.y;
+    bool _cz = z != other.z;
+    bool _cw = w != other.w;
+    return new NativeInt32x4._truncated(_cx ? -1 : 0,
+                                        _cy ? -1 : 0,
+                                        _cz ? -1 : 0,
+                                        _cw ? -1 : 0);
   }
 
   /// Returns a copy of [this] each lane being scaled by [s].
   Float32x4 scale(double s) {
-    double _x = s * _storage[0];
-    double _y = s * _storage[1];
-    double _z = s * _storage[2];
-    double _w = s * _storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    double _x = s * x;
+    double _y = s * y;
+    double _z = s * z;
+    double _w = s * w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the absolute value of this [Float32x4].
   Float32x4 abs() {
-    double _x = _storage[0].abs();
-    double _y = _storage[1].abs();
-    double _z = _storage[2].abs();
-    double _w = _storage[3].abs();
-    return new Float32x4(_x, _y, _z, _w);
+    double _x = x.abs();
+    double _y = y.abs();
+    double _z = z.abs();
+    double _w = w.abs();
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
-  NativeFloat32x4 clamp(NativeFloat32x4 lowerLimit,
-                        NativeFloat32x4 upperLimit) {
-    double _lx = lowerLimit._storage[0];
-    double _ly = lowerLimit._storage[1];
-    double _lz = lowerLimit._storage[2];
-    double _lw = lowerLimit._storage[3];
-    double _ux = upperLimit._storage[0];
-    double _uy = upperLimit._storage[1];
-    double _uz = upperLimit._storage[2];
-    double _uw = upperLimit._storage[3];
-    double _x = _storage[0];
-    double _y = _storage[1];
-    double _z = _storage[2];
-    double _w = _storage[3];
+  Float32x4 clamp(Float32x4 lowerLimit, Float32x4 upperLimit) {
+    double _lx = lowerLimit.x;
+    double _ly = lowerLimit.y;
+    double _lz = lowerLimit.z;
+    double _lw = lowerLimit.w;
+    double _ux = upperLimit.x;
+    double _uy = upperLimit.y;
+    double _uz = upperLimit.z;
+    double _uw = upperLimit.w;
+    double _x = x;
+    double _y = y;
+    double _z = z;
+    double _w = w;
     // MAX(MIN(self, upper), lower).
     _x = _x > _ux ? _ux : _x;
     _y = _y > _uy ? _uy : _y;
@@ -1493,26 +1513,23 @@
     _y = _y < _ly ? _ly : _y;
     _z = _z < _lz ? _lz : _z;
     _w = _w < _lw ? _lw : _w;
-    return new Float32x4(_x, _y, _z, _w);
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
-  /// Extracted x value.
-  double get x => _storage[0];
-  /// Extracted y value.
-  double get y => _storage[1];
-  /// Extracted z value.
-  double get z => _storage[2];
-  /// Extracted w value.
-  double get w => _storage[3];
-
   /// Extract the sign bit from each lane return them in the first 4 bits.
   int get signMask {
-    var view = new NativeUint32List.view(_storage.buffer, 0, null);
-    var mx = (view[0] & 0x80000000) >> 31;
-    var my = (view[1] & 0x80000000) >> 31;
-    var mz = (view[2] & 0x80000000) >> 31;
-    var mw = (view[3] & 0x80000000) >> 31;
-    return mx | my << 1 | mz << 2 | mw << 3;
+    var view = _uint32view;
+    var mx, my, mz, mw;
+    _list[0] = x;
+    _list[1] = y;
+    _list[2] = z;
+    _list[3] = w;
+    // This is correct because dart2js uses the unsigned right shift.
+    mx = (view[0] & 0x80000000) >> 31;
+    my = (view[1] & 0x80000000) >> 30;
+    mz = (view[2] & 0x80000000) >> 29;
+    mw = (view[3] & 0x80000000) >> 28;
+    return mx | my | mz | mw;
   }
 
   /// Shuffle the lane values. [mask] must be one of the 256 shuffle constants.
@@ -1520,114 +1537,104 @@
     if ((m < 0) || (m > 255)) {
       throw new RangeError('mask $m must be in the range [0..256)');
     }
-    double _x = _storage[m & 0x3];
-    double _y = _storage[(m >> 2) & 0x3];
-    double _z = _storage[(m >> 4) & 0x3];
-    double _w = _storage[(m >> 6) & 0x3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    _list[0] = x;
+    _list[1] = y;
+    _list[2] = z;
+    _list[3] = w;
+
+    double _x = _list[m & 0x3];
+    double _y = _list[(m >> 2) & 0x3];
+    double _z = _list[(m >> 4) & 0x3];
+    double _w = _list[(m >> 6) & 0x3];
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Shuffle the lane values in [this] and [other]. The returned
   /// Float32x4 will have XY lanes from [this] and ZW lanes from [other].
   /// Uses the same [mask] as [shuffle].
-  Float32x4 shuffleMix(NativeFloat32x4 other, int m) {
+  Float32x4 shuffleMix(Float32x4 other, int m) {
     if ((m < 0) || (m > 255)) {
       throw new RangeError('mask $m must be in the range [0..256)');
     }
-    double _x = _storage[m & 0x3];
-    double _y = _storage[(m >> 2) & 0x3];
-    double _z = other._storage[(m >> 4) & 0x3];
-    double _w = other._storage[(m >> 6) & 0x3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    _list[0] = x;
+    _list[1] = y;
+    _list[2] = z;
+    _list[3] = w;
+    double _x = _list[m & 0x3];
+    double _y = _list[(m >> 2) & 0x3];
+
+    _list[0] = other.x;
+    _list[1] = other.y;
+    _list[2] = other.z;
+    _list[3] = other.w;
+    double _z = _list[(m >> 4) & 0x3];
+    double _w = _list[(m >> 6) & 0x3];
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Copy [this] and replace the [x] lane.
-  Float32x4 withX(double x) {
-    double _x = x;
-    double _y = _storage[1];
-    double _z = _storage[2];
-    double _w = _storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 withX(double newX) {
+    return new NativeFloat32x4._truncated(_truncate(newX), y, z, w);
   }
 
   /// Copy [this] and replace the [y] lane.
-  Float32x4 withY(double y) {
-    double _x = _storage[0];
-    double _y = y;
-    double _z = _storage[2];
-    double _w = _storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 withY(double newY) {
+    return new NativeFloat32x4._truncated(x, _truncate(newY), z, w);
   }
 
   /// Copy [this] and replace the [z] lane.
-  Float32x4 withZ(double z) {
-    double _x = _storage[0];
-    double _y = _storage[1];
-    double _z = z;
-    double _w = _storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 withZ(double newZ) {
+    return new NativeFloat32x4._truncated(x, y, _truncate(newZ), w);
   }
 
   /// Copy [this] and replace the [w] lane.
-  Float32x4 withW(double w) {
-    double _x = _storage[0];
-    double _y = _storage[1];
-    double _z = _storage[2];
-    double _w = w;
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 withW(double newW) {
+    return new NativeFloat32x4._truncated(x, y, z, _truncate(newW));
   }
 
   /// Returns the lane-wise minimum value in [this] or [other].
-  Float32x4 min(NativeFloat32x4 other) {
-    double _x = _storage[0] < other._storage[0] ?
-        _storage[0] : other._storage[0];
-    double _y = _storage[1] < other._storage[1] ?
-        _storage[1] : other._storage[1];
-    double _z = _storage[2] < other._storage[2] ?
-        _storage[2] : other._storage[2];
-    double _w = _storage[3] < other._storage[3] ?
-        _storage[3] : other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 min(Float32x4 other) {
+    double _x = x < other.x ? x : other.x;
+    double _y = y < other.y ? y : other.y;
+    double _z = z < other.z ? z : other.z;
+    double _w = w < other.w ? w : other.w;
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns the lane-wise maximum value in [this] or [other].
-  Float32x4 max(NativeFloat32x4 other) {
-    double _x = _storage[0] > other._storage[0] ?
-        _storage[0] : other._storage[0];
-    double _y = _storage[1] > other._storage[1] ?
-        _storage[1] : other._storage[1];
-    double _z = _storage[2] > other._storage[2] ?
-        _storage[2] : other._storage[2];
-    double _w = _storage[3] > other._storage[3] ?
-        _storage[3] : other._storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+  Float32x4 max(Float32x4 other) {
+    double _x = x > other.x ? x : other.x;
+    double _y = y > other.y ? y : other.y;
+    double _z = z > other.z ? z : other.z;
+    double _w = w > other.w ? w : other.w;
+    return new NativeFloat32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns the square root of [this].
   Float32x4 sqrt() {
-    double _x = Math.sqrt(_storage[0]);
-    double _y = Math.sqrt(_storage[1]);
-    double _z = Math.sqrt(_storage[2]);
-    double _w = Math.sqrt(_storage[3]);
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    double _x = Math.sqrt(x);
+    double _y = Math.sqrt(y);
+    double _z = Math.sqrt(z);
+    double _w = Math.sqrt(w);
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the reciprocal of [this].
   Float32x4 reciprocal() {
-    double _x = 1.0 / _storage[0];
-    double _y = 1.0 / _storage[1];
-    double _z = 1.0 / _storage[2];
-    double _w = 1.0 / _storage[3];
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    double _x = 1.0 / x;
+    double _y = 1.0 / y;
+    double _z = 1.0 / z;
+    double _w = 1.0 / w;
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 
   /// Returns the square root of the reciprocal of [this].
   Float32x4 reciprocalSqrt() {
-    double _x = Math.sqrt(1.0 / _storage[0]);
-    double _y = Math.sqrt(1.0 / _storage[1]);
-    double _z = Math.sqrt(1.0 / _storage[2]);
-    double _w = Math.sqrt(1.0 / _storage[3]);
-    return new NativeFloat32x4(_x, _y, _z, _w);
+    double _x = Math.sqrt(1.0 / x);
+    double _y = Math.sqrt(1.0 / y);
+    double _z = Math.sqrt(1.0 / z);
+    double _w = Math.sqrt(1.0 / w);
+    return new NativeFloat32x4._doubles(_x, _y, _z, _w);
   }
 }
 
@@ -1638,95 +1645,111 @@
  * The lanes are "x", "y", "z", and "w" respectively.
  */
 class NativeInt32x4 implements Int32x4 {
-  final _storage = new NativeInt32List(4);
+  final int x;
+  final int y;
+  final int z;
+  final int w;
 
-  NativeInt32x4(int x, int y, int z, int w) {
-    _storage[0] = x;
-    _storage[1] = y;
-    _storage[2] = z;
-    _storage[3] = w;
+  static final _list = new NativeInt32List(4);
+
+  static _truncate(x) {
+    _list[0] = x;
+    return _list[0];
   }
 
-  NativeInt32x4.bool(bool x, bool y, bool z, bool w) {
-    _storage[0] = x == true ? 0xFFFFFFFF : 0x0;
-    _storage[1] = y == true ? 0xFFFFFFFF : 0x0;
-    _storage[2] = z == true ? 0xFFFFFFFF : 0x0;
-    _storage[3] = w == true ? 0xFFFFFFFF : 0x0;
+  NativeInt32x4(int x, int y, int z, int w)
+    : this.x = _truncate(x),
+      this.y = _truncate(y),
+      this.z = _truncate(z),
+      this.w = _truncate(w) {
+    if (x != this.x && x is! int) throw new ArgumentError(x);
+    if (y != this.y && y is! int) throw new ArgumentError(y);
+    if (z != this.z && z is! int) throw new ArgumentError(z);
+    if (w != this.w && w is! int) throw new ArgumentError(w);
   }
 
-  /// Returns a bit-wise copy of [x] as a Int32x4.
-  NativeInt32x4.fromFloat32x4Bits(NativeFloat32x4 x) {
-    var view = new NativeUint32List.view(x._storage.buffer, 0, null);
-    _storage[0] = view[0];
-    _storage[1] = view[1];
-    _storage[2] = view[2];
-    _storage[3] = view[3];
+  NativeInt32x4.bool(bool x, bool y, bool z, bool w)
+    : this.x = x ? -1 : 0,
+      this.y = y ? -1 : 0,
+      this.z = z ? -1 : 0,
+      this.w = w ? -1 : 0;
+
+  /// Returns a bit-wise copy of [f] as a Int32x4.
+  factory NativeInt32x4.fromFloat32x4Bits(Float32x4 f) {
+    NativeFloat32List floatList = NativeFloat32x4._list;
+    floatList[0] = f.x;
+    floatList[1] = f.y;
+    floatList[2] = f.z;
+    floatList[3] = f.w;
+    NativeInt32List view = floatList.buffer.asInt32List();
+    return new NativeInt32x4._truncated(view[0], view[1], view[2], view[3]);
   }
 
-  String toString() {
-    return '[${_storage[0]}, ${_storage[1]}, ${_storage[2]}, ${_storage[3]}]';
-  }
+  NativeInt32x4._truncated(this.x, this.y, this.z, this.w);
+
+  String toString() => '[$x, $y, $z, $w]';
+
 
   /// The bit-wise or operator.
-  Int32x4 operator|(NativeInt32x4 other) {
-    int _x = _storage[0] | other._storage[0];
-    int _y = _storage[1] | other._storage[1];
-    int _z = _storage[2] | other._storage[2];
-    int _w = _storage[3] | other._storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 operator|(Int32x4 other) {
+    // Dart2js uses unsigned results for bit-operations.
+    // We use "JS" to fall back to the signed versions.
+    return new NativeInt32x4._truncated(JS("int", "# | #", x, other.x),
+                                        JS("int", "# | #", y, other.y),
+                                        JS("int", "# | #", z, other.z),
+                                        JS("int", "# | #", w, other.w));
   }
 
   /// The bit-wise and operator.
-  Int32x4 operator&(NativeInt32x4 other) {
-    int _x = _storage[0] & other._storage[0];
-    int _y = _storage[1] & other._storage[1];
-    int _z = _storage[2] & other._storage[2];
-    int _w = _storage[3] & other._storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 operator&(Int32x4 other) {
+    // Dart2js uses unsigned results for bit-operations.
+    // We use "JS" to fall back to the signed versions.
+    return new NativeInt32x4._truncated(JS("int", "# & #", x, other.x),
+                                        JS("int", "# & #", y, other.y),
+                                        JS("int", "# & #", z, other.z),
+                                        JS("int", "# & #", w, other.w));
   }
 
   /// The bit-wise xor operator.
-  Int32x4 operator^(NativeInt32x4 other) {
-    int _x = _storage[0] ^ other._storage[0];
-    int _y = _storage[1] ^ other._storage[1];
-    int _z = _storage[2] ^ other._storage[2];
-    int _w = _storage[3] ^ other._storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 operator^(Int32x4 other) {
+    // Dart2js uses unsigned results for bit-operations.
+    // We use "JS" to fall back to the signed versions.
+    return new NativeInt32x4._truncated(JS("int", "# ^ #", x, other.x),
+                                        JS("int", "# ^ #", y, other.y),
+                                        JS("int", "# ^ #", z, other.z),
+                                        JS("int", "# ^ #", w, other.w));
   }
 
-  Int32x4 operator+(NativeInt32x4 other) {
-    var r = new NativeInt32x4(0, 0, 0, 0);
-    r._storage[0] = (_storage[0] + other._storage[0]);
-    r._storage[1] = (_storage[1] + other._storage[1]);
-    r._storage[2] = (_storage[2] + other._storage[2]);
-    r._storage[3] = (_storage[3] + other._storage[3]);
-    return r;
+  Int32x4 operator+(Int32x4 other) {
+    // Avoid going through the typed array by "| 0" the result.
+    return new NativeInt32x4._truncated(JS("int", "(# + #) | 0", x, other.x),
+                                        JS("int", "(# + #) | 0", y, other.y),
+                                        JS("int", "(# + #) | 0", z, other.z),
+                                        JS("int", "(# + #) | 0", w, other.w));
   }
 
-  Int32x4 operator-(NativeInt32x4 other) {
-    var r = new NativeInt32x4(0, 0, 0, 0);
-    r._storage[0] = (_storage[0] - other._storage[0]);
-    r._storage[1] = (_storage[1] - other._storage[1]);
-    r._storage[2] = (_storage[2] - other._storage[2]);
-    r._storage[3] = (_storage[3] - other._storage[3]);
-    return r;
+  Int32x4 operator-(Int32x4 other) {
+    // Avoid going through the typed array by "| 0" the result.
+    return new NativeInt32x4._truncated(JS("int", "(# - #) | 0", x, other.x),
+                                        JS("int", "(# - #) | 0", y, other.y),
+                                        JS("int", "(# - #) | 0", z, other.z),
+                                        JS("int", "(# - #) | 0", w, other.w));
   }
 
-  /// Extract 32-bit mask from x lane.
-  int get x => _storage[0];
-  /// Extract 32-bit mask from y lane.
-  int get y => _storage[1];
-  /// Extract 32-bit mask from z lane.
-  int get z => _storage[2];
-  /// Extract 32-bit mask from w lane.
-  int get w => _storage[3];
+  Int32x4 operator-() {
+    // Avoid going through the typed array by "| 0" the result.
+    return new NativeInt32x4._truncated(JS("int", "(-#) | 0", x),
+                                        JS("int", "(-#) | 0", y),
+                                        JS("int", "(-#) | 0", z),
+                                        JS("int", "(-#) | 0", w));
+  }
 
   /// Extract the top bit from each lane return them in the first 4 bits.
   int get signMask {
-    int mx = (_storage[0] & 0x80000000) >> 31;
-    int my = (_storage[1] & 0x80000000) >> 31;
-    int mz = (_storage[2] & 0x80000000) >> 31;
-    int mw = (_storage[3] & 0x80000000) >> 31;
+    int mx = (x & 0x80000000) >> 31;
+    int my = (y & 0x80000000) >> 31;
+    int mz = (z & 0x80000000) >> 31;
+    int mw = (w & 0x80000000) >> 31;
     return mx | my << 1 | mz << 2 | mw << 3;
   }
 
@@ -1735,226 +1758,212 @@
     if ((mask < 0) || (mask > 255)) {
       throw new RangeError('mask $mask must be in the range [0..256)');
     }
-    int _x = _storage[mask & 0x3];
-    int _y = _storage[(mask >> 2) & 0x3];
-    int _z = _storage[(mask >> 4) & 0x3];
-    int _w = _storage[(mask >> 6) & 0x3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    _list[0] = x;
+    _list[1] = y;
+    _list[2] = z;
+    _list[3] = w;
+    int _x = _list[mask & 0x3];
+    int _y = _list[(mask >> 2) & 0x3];
+    int _z = _list[(mask >> 4) & 0x3];
+    int _w = _list[(mask >> 6) & 0x3];
+    return new NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Shuffle the lane values in [this] and [other]. The returned
   /// Int32x4 will have XY lanes from [this] and ZW lanes from [other].
   /// Uses the same [mask] as [shuffle].
-  Int32x4 shuffleMix(NativeInt32x4 other, int mask) {
+  Int32x4 shuffleMix(Int32x4 other, int mask) {
     if ((mask < 0) || (mask > 255)) {
       throw new RangeError('mask $mask must be in the range [0..256)');
     }
-    int _x = _storage[mask & 0x3];
-    int _y = _storage[(mask >> 2) & 0x3];
-    int _z = other._storage[(mask >> 4) & 0x3];
-    int _w = other._storage[(mask >> 6) & 0x3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    _list[0] = x;
+    _list[1] = y;
+    _list[2] = z;
+    _list[3] = w;
+    int _x = _list[mask & 0x3];
+    int _y = _list[(mask >> 2) & 0x3];
+
+    _list[0] = other.x;
+    _list[1] = other.y;
+    _list[2] = other.z;
+    _list[3] = other.w;
+    int _z = _list[(mask >> 4) & 0x3];
+    int _w = _list[(mask >> 6) & 0x3];
+    return new NativeInt32x4._truncated(_x, _y, _z, _w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new x value.
   Int32x4 withX(int x) {
-    int _x = x;
-    int _y = _storage[1];
-    int _z = _storage[2];
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    int _x = _truncate(x);
+    return new NativeInt32x4._truncated(_x, y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new y value.
   Int32x4 withY(int y) {
-    int _x = _storage[0];
-    int _y = y;
-    int _z = _storage[2];
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    int _y = _truncate(y);
+    return new NativeInt32x4._truncated(x, _y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new z value.
   Int32x4 withZ(int z) {
-    int _x = _storage[0];
-    int _y = _storage[1];
-    int _z = z;
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+    int _z = _truncate(z);
+    return new NativeInt32x4._truncated(x, y, _z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new w value.
   Int32x4 withW(int w) {
-    int _x = _storage[0];
-    int _y = _storage[1];
-    int _z = _storage[2];
-    int _w = w;
-    return new NativeInt32x4(_x, _y, _z, _w);
+    int _w = _truncate(w);
+    return new NativeInt32x4._truncated(x, y, z, _w);
   }
 
-  /// Extracted x value. Returns false for 0, true for any other value.
-  bool get flagX => _storage[0] != 0x0;
-  /// Extracted y value. Returns false for 0, true for any other value.
-  bool get flagY => _storage[1] != 0x0;
-  /// Extracted z value. Returns false for 0, true for any other value.
-  bool get flagZ => _storage[2] != 0x0;
-  /// Extracted w value. Returns false for 0, true for any other value.
-  bool get flagW => _storage[3] != 0x0;
+  /// Extracted x value. Returns `false` for 0, `true` for any other value.
+  bool get flagX => x != 0;
+  /// Extracted y value. Returns `false` for 0, `true` for any other value.
+  bool get flagY => y != 0;
+  /// Extracted z value. Returns `false` for 0, `true` for any other value.
+  bool get flagZ => z != 0;
+  /// Extracted w value. Returns `false` for 0, `true` for any other value.
+  bool get flagW => w != 0;
 
   /// Returns a new [Int32x4] copied from [this] with a new x value.
-  Int32x4 withFlagX(bool x) {
-    int _x = x == true ? 0xFFFFFFFF : 0x0;
-    int _y = _storage[1];
-    int _z = _storage[2];
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 withFlagX(bool flagX) {
+    int _x = flagX ? -1 : 0;
+    return new NativeInt32x4._truncated(_x, y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new y value.
-  Int32x4 withFlagY(bool y) {
-    int _x = _storage[0];
-    int _y = y == true ? 0xFFFFFFFF : 0x0;
-    int _z = _storage[2];
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 withFlagY(bool flagY) {
+    int _y = flagY ? -1 : 0;
+    return new NativeInt32x4._truncated(x, _y, z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new z value.
-  Int32x4 withFlagZ(bool z) {
-    int _x = _storage[0];
-    int _y = _storage[1];
-    int _z = z == true ? 0xFFFFFFFF : 0x0;
-    int _w = _storage[3];
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 withFlagZ(bool flagZ) {
+    int _z = flagZ ? -1 : 0;
+    return new NativeInt32x4._truncated(x, y, _z, w);
   }
 
   /// Returns a new [Int32x4] copied from [this] with a new w value.
-  Int32x4 withFlagW(bool w) {
-    int _x = _storage[0];
-    int _y = _storage[1];
-    int _z = _storage[2];
-    int _w = w == true ? 0xFFFFFFFF : 0x0;
-    return new NativeInt32x4(_x, _y, _z, _w);
+  Int32x4 withFlagW(bool flagW) {
+    int _w = flagW ? -1 : 0;
+    return new NativeInt32x4._truncated(x, y, z, _w);
   }
 
   /// Merge [trueValue] and [falseValue] based on [this]' bit mask:
   /// Select bit from [trueValue] when bit in [this] is on.
   /// Select bit from [falseValue] when bit in [this] is off.
-  Float32x4 select(NativeFloat32x4 trueValue, NativeFloat32x4 falseValue) {
-    var trueView = trueValue._storage.buffer.asInt32List();
-    var falseView = falseValue._storage.buffer.asInt32List();
-    int cmx = _storage[0];
-    int cmy = _storage[1];
-    int cmz = _storage[2];
-    int cmw = _storage[3];
-    int stx = trueView[0];
-    int sty = trueView[1];
-    int stz = trueView[2];
-    int stw = trueView[3];
-    int sfx = falseView[0];
-    int sfy = falseView[1];
-    int sfz = falseView[2];
-    int sfw = falseView[3];
-    int _x = (cmx & stx) | (~cmx & sfx);
-    int _y = (cmy & sty) | (~cmy & sfy);
-    int _z = (cmz & stz) | (~cmz & sfz);
-    int _w = (cmw & stw) | (~cmw & sfw);
-    var r = new NativeFloat32x4(0.0, 0.0, 0.0, 0.0);
-    var rView = r._storage.buffer.asInt32List();
-    rView[0] = _x;
-    rView[1] = _y;
-    rView[2] = _z;
-    rView[3] = _w;
-    return r;
+  Float32x4 select(Float32x4 trueValue, Float32x4 falseValue) {
+    var floatList = NativeFloat32x4._list;
+    var intView = NativeFloat32x4._uint32view;
+
+    floatList[0] = trueValue.x;
+    floatList[1] = trueValue.y;
+    floatList[2] = trueValue.z;
+    floatList[3] = trueValue.w;
+    int stx = intView[0];
+    int sty = intView[1];
+    int stz = intView[2];
+    int stw = intView[3];
+
+    floatList[0] = falseValue.x;
+    floatList[1] = falseValue.y;
+    floatList[2] = falseValue.z;
+    floatList[3] = falseValue.w;
+    int sfx = intView[0];
+    int sfy = intView[1];
+    int sfz = intView[2];
+    int sfw = intView[3];
+    int _x = (x & stx) | (~x & sfx);
+    int _y = (y & sty) | (~y & sfy);
+    int _z = (z & stz) | (~z & sfz);
+    int _w = (w & stw) | (~w & sfw);
+    intView[0] = _x;
+    intView[1] = _y;
+    intView[2] = _z;
+    intView[3] = _w;
+    return new NativeFloat32x4._truncated(
+        floatList[0], floatList[1], floatList[2], floatList[3]);
   }
 }
 
 class NativeFloat64x2 implements Float64x2 {
-  final _storage = new Float64List(2);
+  final double x;
+  final double y;
 
-  NativeFloat64x2(double x, double y) {
-    _storage[0] = x;
-    _storage[1] = y;
+  static NativeFloat64List _list = new NativeFloat64List(2);
+  static NativeUint32List _uint32View = _list.buffer.asUint32List();
+
+  NativeFloat64x2(this.x, this.y) {
+    if (x is! num) throw new ArgumentError(x);
+    if (y is! num) throw new ArgumentError(y);
   }
 
-  NativeFloat64x2.splat(double v) {
-    _storage[0] = v;
-    _storage[1] = v;
-  }
+  NativeFloat64x2.splat(double v) : this(v, v);
 
-  NativeFloat64x2.zero();
+  NativeFloat64x2.zero() : this.splat(0.0);
 
-  NativeFloat64x2.fromFloat32x4(NativeFloat32x4 v) {
-    _storage[0] = v._storage[0];
-    _storage[1] = v._storage[1];
-  }
+  NativeFloat64x2.fromFloat32x4(Float32x4 v) : this(v.x, v.y);
 
-  String toString() {
-    return '[${_storage[0]}, ${_storage[1]}]';
-  }
+  /// Arguments [x] and [y] must be doubles.
+  NativeFloat64x2._doubles(this.x, this.y);
+
+  String toString() => '[$x, $y]';
 
   /// Addition operator.
-  Float64x2 operator+(NativeFloat64x2 other) {
-    return new NativeFloat64x2(_storage[0] + other._storage[0],
-                               _storage[1] + other._storage[1]);
+  Float64x2 operator+(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x + other.x, y + other.y);
   }
 
   /// Negate operator.
   Float64x2 operator-() {
-    return new NativeFloat64x2(-_storage[0], -_storage[1]);
+    return new NativeFloat64x2._doubles(-x, -y);
   }
 
   /// Subtraction operator.
-  Float64x2 operator-(NativeFloat64x2 other) {
-    return new NativeFloat64x2(_storage[0] - other._storage[0],
-                               _storage[1] - other._storage[1]);
+  Float64x2 operator-(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x - other.x, y - other.y);
   }
   /// Multiplication operator.
-  Float64x2 operator*(NativeFloat64x2 other) {
-    return new NativeFloat64x2(_storage[0] * other._storage[0],
-                          _storage[1] * other._storage[1]);
+  Float64x2 operator*(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x * other.x, y * other.y);
   }
   /// Division operator.
-  Float64x2 operator/(NativeFloat64x2 other) {
-    return new NativeFloat64x2(_storage[0] / other._storage[0],
-                          _storage[1] / other._storage[1]);
+  Float64x2 operator/(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x / other.x, y / other.y);
   }
 
   /// Returns a copy of [this] each lane being scaled by [s].
   Float64x2 scale(double s) {
-    return new NativeFloat64x2(_storage[0] * s, _storage[1] * s);
+    return new NativeFloat64x2._doubles(x * s, y * s);
   }
 
   /// Returns the absolute value of this [Float64x2].
   Float64x2 abs() {
-    return new NativeFloat64x2(_storage[0].abs(), _storage[1].abs());
+    return new NativeFloat64x2._doubles(x.abs(), y.abs());
   }
 
   /// Clamps [this] to be in the range [lowerLimit]-[upperLimit].
-  Float64x2 clamp(NativeFloat64x2 lowerLimit,
-                  NativeFloat64x2 upperLimit) {
-    double _lx = lowerLimit._storage[0];
-    double _ly = lowerLimit._storage[1];
-    double _ux = upperLimit._storage[0];
-    double _uy = upperLimit._storage[1];
-    double _x = _storage[0];
-    double _y = _storage[1];
+  Float64x2 clamp(Float64x2 lowerLimit,
+                  Float64x2 upperLimit) {
+    double _lx = lowerLimit.x;
+    double _ly = lowerLimit.y;
+    double _ux = upperLimit.x;
+    double _uy = upperLimit.y;
+    double _x = x;
+    double _y = y;
     // MAX(MIN(self, upper), lower).
     _x = _x > _ux ? _ux : _x;
     _y = _y > _uy ? _uy : _y;
     _x = _x < _lx ? _lx : _x;
     _y = _y < _ly ? _ly : _y;
-    return new NativeFloat64x2(_x, _y);
+    return new NativeFloat64x2._doubles(_x, _y);
   }
 
-  /// Extracted x value.
-  double get x => _storage[0];
-  /// Extracted y value.
-  double get y => _storage[1];
-
   /// Extract the sign bits from each lane return them in the first 2 bits.
   int get signMask {
-    var view = _storage.buffer.asUint32List();
+    var view = _uint32View;
+    _list[0] = x;
+    _list[1] = y;
     var mx = (view[1] & 0x80000000) >> 31;
     var my = (view[3] & 0x80000000) >> 31;
     return mx | my << 1;
@@ -1962,31 +1971,31 @@
 
   /// Returns a new [Float64x2] copied from [this] with a new x value.
   Float64x2 withX(double x) {
-    return new NativeFloat64x2(x, _storage[1]);
+    if (x is! num) throw new ArgumentError(x);
+    return new NativeFloat64x2._doubles(x, y);
   }
 
   /// Returns a new [Float64x2] copied from [this] with a new y value.
   Float64x2 withY(double y) {
-    return new NativeFloat64x2(_storage[0], y);
+    if (y is! num) throw new ArgumentError(y);
+    return new NativeFloat64x2._doubles(x, y);
   }
 
   /// Returns the lane-wise minimum value in [this] or [other].
-  Float64x2 min(NativeFloat64x2 other) {
-    return new NativeFloat64x2(
-        _storage[0] < other._storage[0] ? _storage[0] : other._storage[0],
-        _storage[1] < other._storage[1] ? _storage[1] : other._storage[1]);
+  Float64x2 min(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x < other.x ? x : other.x,
+                                        y < other.y ? y : other.y);
 
   }
 
   /// Returns the lane-wise maximum value in [this] or [other].
-  Float64x2 max(NativeFloat64x2 other) {
-    return new NativeFloat64x2(
-        _storage[0] > other._storage[0] ? _storage[0] : other._storage[0],
-        _storage[1] > other._storage[1] ? _storage[1] : other._storage[1]);
+  Float64x2 max(Float64x2 other) {
+    return new NativeFloat64x2._doubles(x > other.x ? x : other.x,
+                                        y > other.y ? y : other.y);
   }
 
   /// Returns the lane-wise square root of [this].
   Float64x2 sqrt() {
-    return new NativeFloat64x2(Math.sqrt(_storage[0]), Math.sqrt(_storage[1]));
+      return new NativeFloat64x2._doubles(Math.sqrt(x), Math.sqrt(y));
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 1f5ac2a..0b3e985 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -13,6 +13,7 @@
 import 'command/build.dart';
 import 'command/cache.dart';
 import 'command/deps.dart';
+import 'command/downgrade.dart';
 import 'command/get.dart';
 import 'command/global.dart';
 import 'command/help.dart';
@@ -108,7 +109,17 @@
   ArgResults get commandOptions => _commandOptions;
   ArgResults _commandOptions;
 
-  Entrypoint entrypoint;
+  /// Gets the [Entrypoint] package for the current working directory.
+  ///
+  /// This will load the pubspec and fail with an error if the current directory
+  /// is not a package.
+  Entrypoint get entrypoint {
+    // Lazy load it.
+    if (_entrypoint == null) _entrypoint = new Entrypoint(path.current, _cache);
+    return _entrypoint;
+  }
+
+  Entrypoint _entrypoint;
 
   /// A one-line description of this command.
   String get description;
@@ -129,12 +140,6 @@
   /// The URL for web documentation for this command.
   String get docUrl => null;
 
-  /// Whether or not this command requires [entrypoint] to be defined.
-  ///
-  /// If false, pub won't look for a pubspec and [entrypoint] will be null when
-  /// the command runs. This only needs to be set in leaf commands.
-  bool get requiresEntrypoint => true;
-
   /// Whether or not this command takes arguments in addition to options.
   ///
   /// If false, pub will exit with an error if arguments are provided. This
@@ -183,13 +188,6 @@
     _cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
     _globals = new GlobalPackages(_cache);
 
-    if (requiresEntrypoint) {
-      // TODO(rnystrom): Will eventually need better logic to walk up
-      // subdirectories until we hit one that looks package-like. For now,
-      // just assume the cwd is it.
-      entrypoint = new Entrypoint(path.current, cache);
-    }
-
     return syncFuture(onRun);
   }
 
@@ -261,6 +259,7 @@
     'build': new BuildCommand(),
     'cache': new CacheCommand(),
     'deps': new DepsCommand(),
+    'downgrade': new DowngradeCommand(),
     'global': new GlobalCommand(),
     'get': new GetCommand(),
     'help': new HelpCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
index 54d5685..8c8b4d8 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
@@ -18,7 +18,6 @@
   String get usage =>
       "pub cache add <package> [--version <constraint>] [--all]";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
 
   CacheAddCommand() {
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_list.dart b/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
index 39d67e6..c4a2811 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_list.dart
@@ -16,7 +16,6 @@
   String get description => "List packages in the system cache.";
   String get usage => "pub cache list";
   bool get hidden => true;
-  bool get requiresEntrypoint => false;
 
   Future onRun() {
     // TODO(keertip): Add flag to list packages from non default sources.
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
index 3c67061..b16efe2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_repair.dart
@@ -18,7 +18,6 @@
   String get description => "Reinstall cached packages.";
   String get usage => "pub cache repair";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-cache.html";
-  bool get requiresEntrypoint => false;
 
   Future onRun() {
     var successes = 0;
diff --git a/sdk/lib/_internal/pub/lib/src/command/downgrade.dart b/sdk/lib/_internal/pub/lib/src/command/downgrade.dart
new file mode 100644
index 0000000..94e8fc6
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/downgrade.dart
@@ -0,0 +1,41 @@
+// 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.
+
+library pub.command.downgrade;
+
+import 'dart:async';
+
+import '../command.dart';
+import '../log.dart' as log;
+import '../solver/version_solver.dart';
+
+/// Handles the `downgrade` pub command.
+class DowngradeCommand extends PubCommand {
+  String get description =>
+      "Downgrade the current package's dependencies to oldest versions.\n\n"
+      "This doesn't modify the lockfile, so it can be reset with \"pub get\".";
+  String get usage => "pub downgrade [dependencies...]";
+  bool get takesArguments => true;
+
+  bool get isOffline => commandOptions['offline'];
+
+  DowngradeCommand() {
+    commandParser.addFlag('offline',
+        help: 'Use cached packages instead of accessing the network.');
+
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: "Report what dependencies would change but don't change any.");
+  }
+
+  Future onRun() {
+    var dryRun = commandOptions['dry-run'];
+    return entrypoint.acquireDependencies(SolveType.DOWNGRADE,
+        useLatest: commandOptions.rest, dryRun: dryRun).then((_) {
+      if (isOffline) {
+        log.warning("Warning: Downgrading when offline may not update you to "
+            "the oldest versions of your dependencies.");
+      }
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/get.dart b/sdk/lib/_internal/pub/lib/src/command/get.dart
index 3c066fd..7394e0c 100644
--- a/sdk/lib/_internal/pub/lib/src/command/get.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/get.dart
@@ -7,6 +7,7 @@
 import 'dart:async';
 
 import '../command.dart';
+import '../solver/version_solver.dart';
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
@@ -25,6 +26,7 @@
   }
 
   Future onRun() {
-    return entrypoint.acquireDependencies(dryRun: commandOptions['dry-run']);
+    return entrypoint.acquireDependencies(SolveType.GET,
+        dryRun: commandOptions['dry-run']);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
index 5c3e523..6fc25e3 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_activate.dart
@@ -14,7 +14,6 @@
 class GlobalActivateCommand extends PubCommand {
   String get description => "Make a package's executables globally available.";
   String get usage => "pub global activate <package> [version]";
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
 
   Future onRun() {
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
index 047067a..585d9d1 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_deactivate.dart
@@ -8,13 +8,11 @@
 
 import '../command.dart';
 import '../utils.dart';
-import '../version.dart';
 
 /// Handles the `global deactivate` pub command.
 class GlobalDeactivateCommand extends PubCommand {
   String get description => "Remove a previously activated package.";
   String get usage => "pub global deactivate <package>";
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
 
   Future onRun() {
@@ -31,5 +29,6 @@
     }
 
     globals.deactivate(commandOptions.rest.first);
+    return null;
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/global_run.dart b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
index 11f08c0..2629854 100644
--- a/sdk/lib/_internal/pub/lib/src/command/global_run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/global_run.dart
@@ -5,45 +5,41 @@
 library pub.command.global_run;
 
 import 'dart:async';
-import 'dart:io';
 
-import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
-
-import '../barback/asset_environment.dart';
 import '../command.dart';
-import '../entrypoint.dart';
 import '../executable.dart';
-import '../exit_codes.dart' as exit_codes;
 import '../io.dart';
-import '../log.dart' as log;
 import '../utils.dart';
 
 /// Handles the `global run` pub command.
 class GlobalRunCommand extends PubCommand {
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
   bool get allowTrailingOptions => false;
   String get description =>
       "Run an executable from a globally activated package.";
-  String get usage => "pub global run <package> <executable> [args...]";
+  String get usage => "pub global run <package>:<executable> [args...]";
 
   Future onRun() {
     if (commandOptions.rest.isEmpty) {
-      usageError("Must specify a package and executable to run.");
-    }
-
-    if (commandOptions.rest.length == 1) {
       usageError("Must specify an executable to run.");
     }
 
-    var package = commandOptions.rest[0];
-    var executable = commandOptions.rest[1];
-    var args = commandOptions.rest.skip(2);
+    var package;
+    var executable = commandOptions.rest[0];
+    if (executable.contains(":")) {
+      var parts = split1(executable, ":");
+      package = parts[0];
+      executable = parts[1];
+    } else {
+      // If the package name is omitted, use the same name for both.
+      package = executable;
+    }
+
+    var args = commandOptions.rest.skip(1).toList();
 
     return globals.find(package).then((entrypoint) {
-      return runExecutable(this, entrypoint, package, executable, args);
+      return runExecutable(this, entrypoint, package, executable, args,
+          isGlobal: true);
     }).then(flushThenExit);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/help.dart b/sdk/lib/_internal/pub/lib/src/command/help.dart
index 1959b93..d7df223 100644
--- a/sdk/lib/_internal/pub/lib/src/command/help.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/help.dart
@@ -12,7 +12,6 @@
 class HelpCommand extends PubCommand {
   String get description => "Display help information for Pub.";
   String get usage => "pub help [command]";
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
 
   Future onRun() {
diff --git a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
index 8294594..87c3a69 100644
--- a/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/list_package_dirs.dart
@@ -49,8 +49,11 @@
     packages[entrypoint.root.name] = path.join(entrypoint.root.dir, "lib");
 
     // Include the file(s) which when modified will affect the results. For pub,
-    // that's just the lockfile.
-    output["input_files"] = [entrypoint.lockFilePath];
+    // that's just the pubspec and lockfile.
+    output["input_files"] = [
+      entrypoint.lockFilePath,
+      entrypoint.pubspecPath
+    ];
 
     return Future.wait(futures).then((_) {
       log.json.message(output);
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
index e1f3166..34ac728 100644
--- a/sdk/lib/_internal/pub/lib/src/command/run.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -5,18 +5,10 @@
 library pub.command.run;
 
 import 'dart:async';
-import 'dart:io';
 
-import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
-
-import '../barback/asset_environment.dart';
 import '../command.dart';
 import '../executable.dart';
-import '../exit_codes.dart' as exit_codes;
 import '../io.dart';
-import '../log.dart' as log;
 import '../utils.dart';
 
 /// Handles the `run` pub command.
@@ -31,7 +23,6 @@
       usageError("Must specify an executable to run.");
     }
 
-    var environment;
     var package = entrypoint.root.name;
     var executable = commandOptions.rest[0];
     var args = commandOptions.rest.skip(1).toList();
diff --git a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
index e8b6ad0..c42c33b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
@@ -8,6 +8,7 @@
 
 import '../command.dart';
 import '../log.dart' as log;
+import '../solver/version_solver.dart';
 
 /// Handles the `upgrade` pub command.
 class UpgradeCommand extends PubCommand {
@@ -30,8 +31,8 @@
 
   Future onRun() {
     var dryRun = commandOptions['dry-run'];
-    return entrypoint.acquireDependencies(useLatest: commandOptions.rest,
-        isUpgrade: true, dryRun: dryRun).then((_) {
+    return entrypoint.acquireDependencies(SolveType.UPGRADE,
+        useLatest: commandOptions.rest, dryRun: dryRun).then((_) {
       if (isOffline) {
         log.warning("Warning: Upgrading when offline may not update you to the "
                     "latest versions of your dependencies.");
diff --git a/sdk/lib/_internal/pub/lib/src/command/uploader.dart b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
index 90f913d..0324dcb 100644
--- a/sdk/lib/_internal/pub/lib/src/command/uploader.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/uploader.dart
@@ -24,7 +24,6 @@
       "Manage uploaders for a package on pub.dartlang.org.";
   String get usage => "pub uploader [options] {add/remove} <email>";
   String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-uploader.html";
-  bool get requiresEntrypoint => false;
   bool get takesArguments => true;
 
   /// The URL of the package hosting server.
diff --git a/sdk/lib/_internal/pub/lib/src/command/version.dart b/sdk/lib/_internal/pub/lib/src/command/version.dart
index de90f5f..bab6c6b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/version.dart
@@ -14,7 +14,6 @@
 class VersionCommand extends PubCommand {
   String get description => "Print pub version.";
   String get usage => "pub version";
-  bool get requiresEntrypoint => false;
 
   Future onRun() {
     log.message("Pub ${sdk.version}");
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index c866d60..6a9f607 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -74,11 +74,16 @@
     return _lockFile;
   }
 
+  /// The path to the entrypoint package's pubspec.
+  String get pubspecPath => path.join(root.dir, 'pubspec.yaml');
+
   /// The path to the entrypoint package's lockfile.
   String get lockFilePath => path.join(root.dir, 'pubspec.lock');
 
   /// Gets all dependencies of the [root] package.
   ///
+  /// Performs version resolution according to [SolveType].
+  ///
   /// [useLatest], if provided, defines a list of packages that will be
   /// unlocked and forced to their latest versions. If [upgradeAll] is
   /// true, the previous lockfile is ignored and all packages are re-resolved
@@ -86,21 +91,21 @@
   /// previously locked packages.
   ///
   /// Shows a report of the changes made relative to the previous lockfile. If
-  /// [isUpgrade] is `true`, all transitive dependencies are shown in the
-  /// report. Otherwise, only dependencies that were changed are shown. If
+  /// this is an upgrade or downgrade, all transitive dependencies are shown in
+  /// the report. Otherwise, only dependencies that were changed are shown. If
   /// [dryRun] is `true`, no physical changes are made.
-  Future acquireDependencies({List<String> useLatest, bool isUpgrade: false,
+  Future acquireDependencies(SolveType type, {List<String> useLatest,
       bool dryRun: false}) {
     return syncFuture(() {
-      return resolveVersions(cache.sources, root, lockFile: lockFile,
-          useLatest: useLatest, upgradeAll: isUpgrade && useLatest.isEmpty);
+      return resolveVersions(type, cache.sources, root, lockFile: lockFile,
+          useLatest: useLatest);
     }).then((result) {
       if (!result.succeeded) throw result.error;
 
-      result.showReport(isUpgrade: isUpgrade);
+      result.showReport(type);
 
       if (dryRun) {
-        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+        result.summarizeChanges(type, dryRun: dryRun);
         return null;
       }
 
@@ -110,7 +115,7 @@
         _saveLockFile(ids);
         _linkSelf();
         _linkSecondaryPackageDirs();
-        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+        result.summarizeChanges(type, dryRun: dryRun);
       });
     });
   }
@@ -211,7 +216,7 @@
       });
     }).then((upToDate) {
       if (upToDate) return null;
-      return acquireDependencies();
+      return acquireDependencies(SolveType.GET);
     });
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
index 74af539..fc83c0c3 100644
--- a/sdk/lib/_internal/pub/lib/src/exceptions.dart
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.dart
@@ -26,6 +26,19 @@
   String toString() => message;
 }
 
+/// An exception class for exceptions that are intended to be seen by the user
+/// and are associated with a problem in a file at some path.
+class FileException implements ApplicationException {
+  final String message;
+
+  /// The path to the file that was missing or erroneous.
+  final String path;
+
+  FileException(this.message, this.path);
+
+  String toString() => message;
+}
+
 /// A class for exceptions that wrap other exceptions.
 class WrappedException extends ApplicationException {
   /// The underlying exception that [this] is wrapping, if any.
diff --git a/sdk/lib/_internal/pub/lib/src/executable.dart b/sdk/lib/_internal/pub/lib/src/executable.dart
index e7d1c10..9d62188 100644
--- a/sdk/lib/_internal/pub/lib/src/executable.dart
+++ b/sdk/lib/_internal/pub/lib/src/executable.dart
@@ -12,7 +12,6 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import 'barback/asset_environment.dart';
-import 'barback/barback_server.dart';
 import 'command.dart';
 import 'entrypoint.dart';
 import 'exit_codes.dart' as exit_codes;
@@ -30,14 +29,18 @@
 ///
 /// Returns the exit code of the spawned app.
 Future<int> runExecutable(PubCommand command, Entrypoint entrypoint,
-    String package, String executable, Iterable<String> args) {
+    String package, String executable, Iterable<String> args,
+    {bool isGlobal: false}) {
   // If the command has a path separator, then it's a path relative to the
   // root of the package. Otherwise, it's implicitly understood to be in
   // "bin".
   var rootDir = "bin";
   var parts = p.split(executable);
   if (parts.length > 1) {
-    if (package != entrypoint.root.name) {
+    if (isGlobal) {
+      command.usageError(
+          'Cannot run an executable in a subdirectory of a global package.');
+    } else if (package != entrypoint.root.name) {
       command.usageError(
           "Cannot run an executable in a subdirectory of a dependency.");
     }
diff --git a/sdk/lib/_internal/pub/lib/src/global_packages.dart b/sdk/lib/_internal/pub/lib/src/global_packages.dart
index 3798146..b9bb548 100644
--- a/sdk/lib/_internal/pub/lib/src/global_packages.dart
+++ b/sdk/lib/_internal/pub/lib/src/global_packages.dart
@@ -5,7 +5,6 @@
 library pub.global_packages;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
@@ -78,10 +77,11 @@
     }).then((p) {
       package = p;
       // Resolve it and download its dependencies.
-      return resolveVersions(cache.sources, package, lockFile: lockFile);
+      return resolveVersions(SolveType.GET, cache.sources, package,
+          lockFile: lockFile);
     }).then((result) {
       if (!result.succeeded) throw result.error;
-      result.showReport();
+      result.showReport(SolveType.GET);
 
       // Make sure all of the dependencies are locally installed.
       return Future.wait(result.packages.map((id) {
diff --git a/sdk/lib/_internal/pub/lib/src/lock_file.dart b/sdk/lib/_internal/pub/lib/src/lock_file.dart
index 95421a6..a2dd6e4 100644
--- a/sdk/lib/_internal/pub/lib/src/lock_file.dart
+++ b/sdk/lib/_internal/pub/lib/src/lock_file.dart
@@ -4,6 +4,7 @@
 
 library pub.lock_file;
 
+import 'package:source_maps/source_maps.dart';
 import 'package:yaml/yaml.dart';
 
 import 'io.dart';
@@ -48,40 +49,44 @@
     var packages = <String, PackageId>{};
 
     if (contents.trim() == '') return new LockFile.empty();
-    var parsed = loadYaml(contents);
+    var parsed = loadYamlNode(contents, sourceName: filePath);
+
+    _validate(parsed is Map, 'The lockfile must be a YAML mapping.', parsed);
 
     var packageEntries = parsed['packages'];
     if (packageEntries != null) {
+      _validate(packageEntries is Map, 'The "packages" field must be a map.',
+          parsed.nodes['packages']);
+
       packageEntries.forEach((name, spec) {
         // Parse the version.
-        if (!spec.containsKey('version')) {
-          throw new FormatException('Package $name is missing a version.');
-        }
+        _validate(spec.containsKey('version'),
+            'Package $name is missing a version.', spec);
         var version = new Version.parse(spec['version']);
 
         // Parse the source.
-        if (!spec.containsKey('source')) {
-          throw new FormatException('Package $name is missing a source.');
-        }
+        _validate(spec.containsKey('source'),
+            'Package $name is missing a source.', spec);
         var sourceName = spec['source'];
 
-        if (!spec.containsKey('description')) {
-          throw new FormatException('Package $name is missing a description.');
-        }
+        _validate(spec.containsKey('description'),
+            'Package $name is missing a description.', spec);
         var description = spec['description'];
 
         // Let the source parse the description.
         var source = sources[sourceName];
-        description = source.parseDescription(filePath, description,
-            fromLockFile: true);
+        try {
+          description = source.parseDescription(filePath, description,
+              fromLockFile: true);
+        } on FormatException catch (ex) {
+          throw new SpanFormatException(ex.message, spec.nodes['source'].span);
+        }
 
         var id = new PackageId(name, sourceName, version, description);
 
         // Validate the name.
-        if (name != id.name) {
-          throw new FormatException(
-            "Package name $name doesn't match ${id.name}.");
-        }
+        _validate(name == id.name,
+            "Package name $name doesn't match ${id.name}.", spec);
 
         packages[name] = id;
       });
@@ -90,6 +95,12 @@
     return new LockFile._(packages);
   }
 
+  /// If [condition] is `false` throws a format error with [message] for [node].
+  static void _validate(bool condition, String message, YamlNode node) {
+    if (condition) return;
+    throw new SpanFormatException(message, node.span);
+  }
+
   /// Returns the serialized YAML text of the lock file.
   ///
   /// [packageDir] is the containing directory of the root package, used to
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 0c2b126..6821581 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -506,6 +506,15 @@
       errorJson["stackTrace"] = new Chain.forTrace(stackTrace).toString();
     }
 
+    // If the error came from a file, include the path.
+    if (error is SpanException && error.span.sourceUrl != null) {
+      errorJson["path"] = p.fromUri(error.span.sourceUrl);
+    }
+
+    if (error is FileException) {
+      errorJson["path"] = error.path;
+    }
+
     this.message(errorJson);
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index 3291b34..dafb513 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -223,7 +223,9 @@
     var pubspecPath = path.join(packageDir, 'pubspec.yaml');
     var pubspecUri = path.toUri(pubspecPath);
     if (!fileExists(pubspecPath)) {
-      fail('Could not find a file named "pubspec.yaml" in "$packageDir".');
+      throw new FileException(
+          'Could not find a file named "pubspec.yaml" in "$packageDir".',
+          pubspecPath);
     }
 
     return new Pubspec.parse(readTextFile(pubspecPath), sources,
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 4c60333..d8b5761 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -59,6 +59,7 @@
 /// versions for speculative package selections. Backtracks and advances to the
 /// next potential solution in the case of a failure.
 class BacktrackingSolver {
+  final SolveType type;
   final SourceRegistry sources;
   final Package root;
 
@@ -73,9 +74,6 @@
   /// packages.
   final _forceLatest = new Set<String>();
 
-  /// If this is set, the contents of [lockFile] are ignored while solving.
-  final bool _upgradeAll;
-
   /// The set of packages whose dependecy is being overridden by the root
   /// package, keyed by the name of the package.
   ///
@@ -109,11 +107,11 @@
   int get attemptedSolutions => _attemptedSolutions;
   var _attemptedSolutions = 1;
 
-  BacktrackingSolver(SourceRegistry sources, this.root, this.lockFile,
-                     List<String> useLatest, {bool upgradeAll: false})
-      : sources = sources,
-        cache = new PubspecCache(sources),
-        _upgradeAll = upgradeAll {
+  BacktrackingSolver(SolveType type, SourceRegistry sources, this.root,
+          this.lockFile, List<String> useLatest)
+      : type = type,
+        sources = sources,
+        cache = new PubspecCache(type, sources) {
     for (var package in useLatest) {
       _forceLatest.add(package);
     }
@@ -218,9 +216,19 @@
   ///
   /// Returns `null` if it isn't in the lockfile (or has been unlocked).
   PackageId getLocked(String package) {
-    if (_upgradeAll) return null;
-    if (_forceLatest.contains(package)) return null;
+    if (type == SolveType.GET) return lockFile.packages[package];
 
+    // When downgrading, we don't want to force the latest versions of
+    // non-hosted packages, since they don't support multiple versions and thus
+    // can't be downgraded.
+    if (type == SolveType.DOWNGRADE) {
+      var locked = lockFile.packages[package];
+      if (locked != null && !sources[locked.source].hasMultipleVersions) {
+        return locked;
+      }
+    }
+
+    if (_forceLatest.isEmpty || _forceLatest.contains(package)) return null;
     return lockFile.packages[package];
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
index 4012bdc..7fed60a 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
@@ -18,9 +18,7 @@
 ///
 /// It's a report builder.
 class SolveReport {
-  /// Whether all dependencies should be reported, or just ones that changed.
-  final bool _showAll;
-
+  final SolveType _type;
   final SourceRegistry _sources;
   final Package _root;
   final LockFile _previousLockFile;
@@ -31,9 +29,8 @@
 
   final _output = new StringBuffer();
 
-  SolveReport(this._sources, this._root, this._previousLockFile,
-      this._result, {bool showAll: false})
-      : _showAll = showAll {
+  SolveReport(this._type, this._sources, this._root, this._previousLockFile,
+      this._result) {
     // Fill the map so we can use it later.
     for (var id in _result.packages) {
       _dependencies[id.name] = id;
@@ -80,10 +77,10 @@
       }
     } else {
       if (numChanged == 0) {
-        if (_showAll) {
-          log.message("No dependencies changed.");
-        } else {
+        if (_type == SolveType.GET) {
           log.message("Got dependencies!");
+        } else {
+          log.message("No dependencies changed.");
         }
       } else if (numChanged == 1) {
         log.message("Changed $numChanged dependency!");
@@ -137,8 +134,8 @@
   /// Reports the results of the upgrade on the package named [name].
   ///
   /// If [alwaysShow] is true, the package is reported even if it didn't change,
-  /// regardless of [_showAll]. If [highlightOverride] is true (or absent),
-  /// writes "(override)" next to overridden packages.
+  /// regardless of [_type]. If [highlightOverride] is true (or absent), writes
+  /// "(override)" next to overridden packages.
   void _reportPackage(String name,
       {bool alwaysShow: false, bool highlightOverride: true}) {
     var newId = _dependencies[name];
@@ -186,7 +183,9 @@
       icon = "  ";
     }
 
-    if (!(alwaysShow || changed || addedOrRemoved || _showAll)) return;
+    if (_type == SolveType.GET && !(alwaysShow || changed || addedOrRemoved)) {
+      return;
+    }
 
     _output.write(icon);
     _output.write(log.bold(id.name));
@@ -207,8 +206,9 @@
 
     // See if there are any newer versions of the package that we were
     // unable to upgrade to.
-    if (newId != null) {
+    if (newId != null && _type != SolveType.DOWNGRADE) {
       var versions = _result.availableVersions[newId.name];
+
       var newerStable = false;
       var newerUnstable = false;
 
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index 9e0939c..ec276ea 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -30,14 +30,14 @@
 /// packages.
 ///
 /// If [upgradeAll] is true, the contents of [lockFile] are ignored.
-Future<SolveResult> resolveVersions(SourceRegistry sources, Package root,
-    {LockFile lockFile, List<String> useLatest, bool upgradeAll: false}) {
+Future<SolveResult> resolveVersions(SolveType type, SourceRegistry sources,
+    Package root, {LockFile lockFile, List<String> useLatest}) {
   if (lockFile == null) lockFile = new LockFile.empty();
   if (useLatest == null) useLatest = [];
 
   return log.progress('Resolving dependencies', () {
-    return new BacktrackingSolver(sources, root, lockFile, useLatest,
-        upgradeAll: upgradeAll).solve();
+    return new BacktrackingSolver(type, sources, root, lockFile, useLatest)
+        .solve();
   });
 }
 
@@ -87,21 +87,18 @@
 
   /// Displays a report of what changes were made to the lockfile.
   ///
-  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
-  /// command.
-  void showReport({bool isUpgrade: false}) {
-    new SolveReport(_sources, _root, _previousLockFile, this,
-        showAll: isUpgrade).show();
+  /// [type] is the type of version resolution that was run.
+  void showReport(SolveType type) {
+    new SolveReport(type, _sources, _root, _previousLockFile, this).show();
   }
 
   /// Displays a one-line message summarizing what changes were made (or would
   /// be made) to the lockfile.
   ///
-  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
-  /// command.
-  void summarizeChanges({bool isUpgrade: false, bool dryRun: false}) {
-    new SolveReport(_sources, _root, _previousLockFile, this,
-        showAll: isUpgrade).summarize(dryRun: dryRun);
+  /// [type] is the type of version resolution that was run.
+  void summarizeChanges(SolveType type, {bool dryRun: false}) {
+    new SolveReport(type, _sources, _root, _previousLockFile, this)
+        .summarize(dryRun: dryRun);
   }
 
   String toString() {
@@ -130,6 +127,9 @@
   /// The already-requested cached pubspecs.
   final _pubspecs = new Map<PackageId, Pubspec>();
 
+  /// The type of version resolution that was run.
+  final SolveType _type;
+
   /// The number of times a version list was requested and it wasn't cached and
   /// had to be requested from the source.
   int _versionCacheMisses = 0;
@@ -146,7 +146,7 @@
   /// returned.
   int _pubspecCacheHits = 0;
 
-  PubspecCache(this._sources);
+  PubspecCache(this._type, this._sources);
 
   /// Caches [pubspec] as the [Pubspec] for the package identified by [id].
   void cache(PackageId id, Pubspec pubspec) {
@@ -205,7 +205,8 @@
     return source.getVersions(package.name, package.description)
         .then((versions) {
       // Sort by priority so we try preferred versions first.
-      versions.sort(Version.prioritize);
+      versions.sort(_type == SolveType.DOWNGRADE ? Version.antiPrioritize :
+          Version.prioritize);
 
       var ids = versions.reversed.map(
           (version) => package.atVersion(version)).toList();
@@ -286,6 +287,27 @@
   String toString() => '$depender $dependerVersion -> $dep';
 }
 
+/// An enum for types of version resolution.
+class SolveType {
+  /// As few changes to the lockfile as possible to be consistent with the
+  /// pubspec.
+  static const GET = const SolveType._("get");
+
+  /// Upgrade all packages or specific packages to the highest versions
+  /// possible, regardless of the lockfile.
+  static const UPGRADE = const SolveType._("upgrade");
+
+  /// Downgrade all packages or specific packages to the lowest versions
+  /// possible, regardless of the lockfile.
+  static const DOWNGRADE = const SolveType._("downgrade");
+
+  final String _name;
+
+  const SolveType._(this._name);
+
+  String toString() => _name;
+}
+
 /// Base class for all failures that can occur while trying to resolve versions.
 abstract class SolveFailure implements ApplicationException {
   /// The name of the package whose version could not be solved.
diff --git a/sdk/lib/_internal/pub/lib/src/source.dart b/sdk/lib/_internal/pub/lib/src/source.dart
index 0235792..4152384 100644
--- a/sdk/lib/_internal/pub/lib/src/source.dart
+++ b/sdk/lib/_internal/pub/lib/src/source.dart
@@ -27,6 +27,12 @@
   /// all sources.
   String get name;
 
+  /// Whether this source can choose between multiple versions of the same
+  /// package during version solving.
+  ///
+  /// Defaults to `false`.
+  final bool hasMultipleVersions = false;
+
   /// Whether or not this source is the default source.
   bool get isDefault => systemCache.sources.defaultSource == this;
 
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index ec21d20..5dcba33 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -25,6 +25,7 @@
 /// the same API as pub.dartlang.org.
 class HostedSource extends CachedSource {
   final name = "hosted";
+  final hasMultipleVersions = true;
 
   /// Gets the default URL for the package server for hosted dependencies.
   static String get defaultUrl {
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 3c2e1aa..4e1a369 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -368,6 +368,15 @@
       compare(element, max) > 0 ? element : max);
 }
 
+/// Returns the minimum value in [iter] by [compare].
+///
+/// [compare] defaults to [Comparable.compare].
+minAll(Iterable iter, [int compare(element1, element2)]) {
+  if (compare == null) compare = Comparable.compare;
+  return iter.reduce((max, element) =>
+      compare(element, max) < 0 ? element : max);
+}
+
 /// Replace each instance of [matcher] in [source] with the return value of
 /// [fn].
 String replace(String source, Pattern matcher, String fn(Match)) {
diff --git a/sdk/lib/_internal/pub/lib/src/version.dart b/sdk/lib/_internal/pub/lib/src/version.dart
index 7e33fe2..50cfb0c5 100644
--- a/sdk/lib/_internal/pub/lib/src/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/version.dart
@@ -54,6 +54,18 @@
     return a.compareTo(b);
   }
 
+  /// Like [proiritize], but lower version numbers are considered greater than
+  /// higher version numbers.
+  ///
+  /// This still considers prerelease versions to be lower than non-prerelease
+  /// versions.
+  static int antiPrioritize(Version a, Version b) {
+    if (a.isPreRelease && !b.isPreRelease) return -1;
+    if (!a.isPreRelease && b.isPreRelease) return 1;
+
+    return b.compareTo(a);
+  }
+
   /// The major version number: "1" in "1.2.3".
   final int major;
 
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index f9df64b..fbfb876 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -14,3 +14,4 @@
 
 [ $runtime == vm && $system == windows ]
 test/run/app_can_read_from_stdin_test: Fail # Issue 19448
+test/list_package_dirs/lockfile_error_test: Fail # Issue 20104
diff --git a/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
index e49fe21..7ed6754 100644
--- a/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
+++ b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
@@ -2,8 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
index eb43c7e..54d2e94 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
@@ -5,7 +5,6 @@
 library pub_tests;
 
 import 'package:scheduled_test/scheduled_test.dart';
-import 'package:scheduled_test/scheduled_stream.dart';
 
 import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
diff --git a/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart b/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart
new file mode 100644
index 0000000..e62bff0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/downgrade/does_not_show_other_versions_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, 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 pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("does not show how many other versions are available", () {
+    servePackages([
+      packageMap("downgraded", "1.0.0"),
+      packageMap("downgraded", "2.0.0"),
+      packageMap("downgraded", "3.0.0-dev")
+    ]);
+
+    d.appDir({
+      "downgraded": "3.0.0-dev"
+    }).create();
+
+    pubGet();
+
+    // Loosen the constraints.
+    d.appDir({
+      "downgraded": ">=2.0.0"
+    }).create();
+
+    pubDowngrade(output: contains("downgraded 2.0.0 (was 3.0.0-dev)"));
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/downgrade/doesnt_change_git_dependencies_test.dart b/sdk/lib/_internal/pub/test/downgrade/doesnt_change_git_dependencies_test.dart
new file mode 100644
index 0000000..e1e7395
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/downgrade/doesnt_change_git_dependencies_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, 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 '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("doesn't change git dependencies", () {
+    ensureGit();
+
+    d.git('foo.git', [
+      d.libDir('foo'),
+      d.libPubspec('foo', '1.0.0')
+    ]).create();
+
+    d.appDir({
+      "foo": {"git": "../foo.git"}
+    }).create();
+
+    pubGet();
+
+    d.dir(packagesPath, [
+      d.dir('foo', [
+        d.file('foo.dart', 'main() => "foo";')
+      ])
+    ]).validate();
+
+    d.git('foo.git', [
+      d.libDir('foo', 'foo 2'),
+      d.libPubspec('foo', '1.0.0')
+    ]).commit();
+
+    pubDowngrade();
+
+    d.dir(packagesPath, [
+      d.dir('foo', [
+        d.file('foo.dart', 'main() => "foo";')
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart
new file mode 100644
index 0000000..4bae763
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/downgrade/dry_run_does_not_apply_changes_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, 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:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("--dry-run shows report but does not apply changes", () {
+    servePackages([
+      packageMap("foo", "1.0.0"),
+      packageMap("foo", "2.0.0"),
+    ]);
+
+    // Create the first lockfile.
+    d.appDir({
+      "foo": "2.0.0"
+    }).create();
+
+    pubGet();
+
+    // Change the pubspec.
+    d.appDir({
+      "foo": "any"
+    }).create();
+
+    // Also delete the "packages" directory.
+    schedule(() {
+      deleteEntry(path.join(sandboxDir, appPath, "packages"));
+    });
+
+    // Do the dry run.
+    pubDowngrade(args: ["--dry-run"], output: allOf([
+      contains("< foo 1.0.0"),
+      contains("Would change 1 dependency.")
+    ]));
+
+    d.dir(appPath, [
+      // The lockfile should be unmodified.
+      d.matcherFile("pubspec.lock", contains("2.0.0")),
+      // The "packages" directory should not have been regenerated.
+      d.nothing("packages")
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart b/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart
new file mode 100644
index 0000000..93a376c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/downgrade/unlock_dependers_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("downgrades a locked package's dependers in order to get it to "
+      "min version", () {
+    servePackages([
+      packageMap("foo", "2.0.0", {"bar": ">1.0.0"}),
+      packageMap("bar", "2.0.0")
+    ]);
+
+    d.appDir({"foo": "any", "bar": "any"}).create();
+
+    pubGet();
+
+    d.packagesDir({
+      "foo": "2.0.0",
+      "bar": "2.0.0"
+    }).validate();
+
+    servePackages([
+      packageMap("foo", "1.0.0", {"bar": "any"}),
+      packageMap("bar", "1.0.0")
+    ]);
+
+    pubDowngrade(args: ['bar']);
+
+    d.packagesDir({
+      "foo": "1.0.0",
+      "bar": "1.0.0"
+    }).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart b/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart
new file mode 100644
index 0000000..48c7bd8
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/downgrade/unlock_if_necessary_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("downgrades one locked hosted package's dependencies if it's "
+      "necessary", () {
+    servePackages([
+      packageMap("foo", "2.0.0", {"foo_dep": "any"}),
+      packageMap("foo_dep", "2.0.0")
+    ]);
+
+    d.appDir({"foo": "any"}).create();
+
+    pubGet();
+
+    d.packagesDir({
+      "foo": "2.0.0",
+      "foo_dep": "2.0.0"
+    }).validate();
+
+    servePackages([
+      packageMap("foo", "1.0.0", {"foo_dep": "<2.0.0"}),
+      packageMap("foo_dep", "1.0.0")
+    ]);
+
+    pubDowngrade(args: ['foo']);
+
+    d.packagesDir({
+      "foo": "1.0.0",
+      "foo_dep": "1.0.0"
+    }).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
index 42f4c62..9091a55 100644
--- a/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/different_version_test.dart
@@ -2,9 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart b/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
index 516ae65..6b8b7fb 100644
--- a/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/empty_constraint_test.dart
@@ -2,10 +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 'package:scheduled_test/scheduled_test.dart';
-
 import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
index fa111f2..d7726f6 100644
--- a/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/installs_dependencies_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/activate/same_version_test.dart b/sdk/lib/_internal/pub/test/global/activate/same_version_test.dart
index 046315c..f13a70a 100644
--- a/sdk/lib/_internal/pub/test/global/activate/same_version_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/same_version_test.dart
@@ -2,9 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
index 4a6e3a6..9bf1066 100644
--- a/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/activate/unknown_package_test.dart
@@ -5,7 +5,6 @@
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
index 0e04d18..b1c6005 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_and_reactivate_package_test.dart
@@ -2,10 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
-import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_package_test.dart
index f6e9056..661cced 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/deactivate_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/deactivate_package_test.dart
@@ -2,10 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
-import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
index 3860c48..014cecf 100644
--- a/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/deactivate/unknown_package_test.dart
@@ -2,10 +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 'package:scheduled_test/scheduled_test.dart';
-
 import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
diff --git a/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
new file mode 100644
index 0000000..8193876
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/errors_if_outside_bin_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, 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:path/path.dart' as p;
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('errors if the script is in a subdirectory.', () {
+    servePackages([
+      packageMap("foo", "1.0.0")
+    ], contents: [
+      d.dir("example", [
+        d.file("script.dart", "main(args) => print('ok');")
+      ])
+    ]);
+
+    schedulePub(args: ["global", "activate", "foo"]);
+    schedulePub(args: ["global", "run", "foo:example/script"],
+        error: """
+Cannot run an executable in a subdirectory of a global package.
+
+Usage: pub global run <package>:<executable> [args...]
+-h, --help    Print usage information for this command.
+
+Run "pub help" to see global options.
+""",
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart b/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart
new file mode 100644
index 0000000..ad93bac
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/global/run/implicit_executable_name_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, 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 '../../../lib/src/exit_codes.dart' as exit_codes;
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('defaults to the package name if the script is omitted', () {
+    servePackages([
+      packageMap("foo", "1.0.0")
+    ], contents: [
+      d.dir("bin", [
+        d.file("foo.dart", "main(args) => print('foo');")
+      ])
+    ]);
+
+    schedulePub(args: ["global", "activate", "foo"]);
+
+    var pub = pubRun(global: true, args: ["foo"]);
+    pub.stdout.expect("foo");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
index 791b099..3e7a075 100644
--- a/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/missing_executable_arg_test.dart
@@ -8,11 +8,11 @@
 main() {
   initConfig();
   integration('fails if no executable was given', () {
-    schedulePub(args: ["global", "run", "pkg"],
+    schedulePub(args: ["global", "run"],
         error: """
             Must specify an executable to run.
 
-            Usage: pub global run <package> <executable> [args...]
+            Usage: pub global run <package>:<executable> [args...]
             -h, --help    Print usage information for this command.
 
             Run "pub help" to see global options.
diff --git a/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart b/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart
deleted file mode 100644
index dac0523..0000000
--- a/sdk/lib/_internal/pub/test/global/run/missing_package_arg_test.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2014, 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 '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../test_pub.dart';
-
-main() {
-  initConfig();
-  integration('fails if no package was given', () {
-    schedulePub(args: ["global", "run"],
-        error: """
-            Must specify a package and executable to run.
-
-            Usage: pub global run <package> <executable> [args...]
-            -h, --help    Print usage information for this command.
-
-            Run "pub help" to see global options.
-            """,
-        exitCode: exit_codes.USAGE);
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
index 714b222..76c3b31 100644
--- a/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/nonexistent_script_test.dart
@@ -5,7 +5,6 @@
 import 'package:path/path.dart' as p;
 
 import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
@@ -15,7 +14,7 @@
 
     schedulePub(args: ["global", "activate", "foo"]);
 
-    var pub = pubRun(global: true, args: ["foo", "script"]);
+    var pub = pubRun(global: true, args: ["foo:script"]);
     pub.stderr.expect("Could not find ${p.join("bin", "script.dart")}.");
     pub.shouldExit(exit_codes.NO_INPUT);
   });
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
index 217758f..caf8f42 100644
--- a/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/runs_script_test.dart
@@ -2,7 +2,6 @@
 // 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 '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -19,7 +18,7 @@
 
     schedulePub(args: ["global", "activate", "foo"]);
 
-    var pub = pubRun(global: true, args: ["foo", "script"]);
+    var pub = pubRun(global: true, args: ["foo:script"]);
     pub.stdout.expect("ok");
     pub.shouldExit();
   });
diff --git a/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart b/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart
index 79a181c..8353ac9 100644
--- a/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/runs_transformer_test.dart
@@ -39,7 +39,7 @@
         ])])
       ], pkg: ['barback']);
 
-      var pub = pubRun(global: true, args: ["foo", "script"]);
+      var pub = pubRun(global: true, args: ["foo:script"]);
 
       pub.stdout.expect("generated");
       pub.shouldExit();
diff --git a/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
index 4787812..e5a4bab 100644
--- a/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
+++ b/sdk/lib/_internal/pub/test/global/run/unknown_package_test.dart
@@ -5,7 +5,6 @@
 import 'package:scheduled_test/scheduled_test.dart';
 
 import '../../../lib/src/exit_codes.dart' as exit_codes;
-import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
 main() {
@@ -13,7 +12,7 @@
   integration('errors if the package is not activated', () {
     servePackages([]);
 
-    schedulePub(args: ["global", "run", "foo", "bar"],
+    schedulePub(args: ["global", "run", "foo:bar"],
         error: startsWith("No active package foo."),
         exitCode: exit_codes.DATA);
   });
diff --git a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
index 2f18b34c..b02123e 100644
--- a/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/implicit_dependency_test.dart
@@ -2,8 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 import '../lib/src/barback.dart' as barback;
diff --git a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
index efd4ab4..fd0dda8 100644
--- a/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart
@@ -2,8 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:shelf/shelf.dart' as shelf;
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
index 179ef84..33d5065 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/ignores_updated_pubspec_test.dart
@@ -42,7 +42,8 @@
             "myapp": canonicalize(path.join(sandboxDir, appPath, "lib"))
           },
           "input_files": [
-            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock"))
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock")),
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.yaml"))
           ]
         });
   });
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
index aed1bf3..69bbe4544 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/includes_dev_dependencies_test.dart
@@ -38,7 +38,8 @@
             "myapp": canonicalize(path.join(sandboxDir, appPath, "lib"))
           },
           "input_files": [
-            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock"))
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock")),
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.yaml"))
           ]
         });
   });
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
index c920e19..95a8c5d 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -40,7 +40,8 @@
             "myapp": canonicalize(path.join(sandboxDir, appPath, "lib"))
           },
           "input_files": [
-            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock"))
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.lock")),
+            canonicalize(path.join(sandboxDir, appPath, "pubspec.yaml"))
           ]
         });
   });
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lockfile_error_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lockfile_error_test.dart
new file mode 100644
index 0000000..893e206
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lockfile_error_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("reports the lockfile path when there is an error in it", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.file("pubspec.lock", "some bad yaml")
+    ]).create();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "error": contains('The lockfile must be a YAML mapping.'),
+          "path": canonicalize(path.join(sandboxDir, appPath, "pubspec.lock"))
+        },
+        exitCode: exit_codes.DATA);
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/missing_pubspec_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/missing_pubspec_test.dart
new file mode 100644
index 0000000..ea32e58
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/missing_pubspec_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  // This is a regression test for #20065.
+  integration("reports a missing pubspec error using JSON", () {
+    d.dir(appPath).create();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "error":
+            'Could not find a file named "pubspec.yaml" in "'
+                '${canonicalize(path.join(sandboxDir, appPath))}".',
+          "path": canonicalize(path.join(sandboxDir, appPath, "pubspec.yaml"))
+        },
+        exitCode: 1);
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
index 3bbc72a..397e4a2 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/no_lockfile_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE d.file.
 
 import '../../lib/src/exit_codes.dart' as exit_codes;
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/pubspec_error_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/pubspec_error_test.dart
new file mode 100644
index 0000000..6e4a4ee
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/pubspec_error_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS d.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 d.file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("reports the pubspec path when there is an error in it", () {
+    d.dir(appPath, [
+      d.file("pubspec.yaml", "some bad yaml")
+    ]).create();
+
+    schedulePub(args: ["list-package-dirs", "--format=json"],
+        outputJson: {
+          "error": contains('Error on line 1'),
+          "path": canonicalize(path.join(sandboxDir, appPath, "pubspec.yaml"))
+        },
+        exitCode: exit_codes.DATA);
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/lock_file_test.dart b/sdk/lib/_internal/pub/test/lock_file_test.dart
index c6c5a22..68d04ce 100644
--- a/sdk/lib/_internal/pub/test/lock_file_test.dart
+++ b/sdk/lib/_internal/pub/test/lock_file_test.dart
@@ -110,6 +110,22 @@
         expect(lockFile.packages, isEmpty);
       });
 
+      test("throws if the top level is not a map", () {
+        expect(() {
+          new LockFile.parse('''
+not a map
+''', sources);
+        }, throwsFormatException);
+      });
+
+      test("throws if the contents of 'packages' is not a map", () {
+        expect(() {
+          new LockFile.parse('''
+packages: not a map
+''', sources);
+        }, throwsFormatException);
+      });
+
       test("throws if the version is missing", () {
         expect(() {
           new LockFile.parse('''
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
index e36f97d..25ca1ca 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
index b2627b6..b34b447 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart
@@ -3,13 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_test.dart';
 import 'package:scheduled_test/scheduled_server.dart';
 import 'package:shelf/shelf.dart' as shelf;
 
-import '../../lib/src/io.dart';
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index ae6ad21..525cd0f 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -28,18 +28,19 @@
     -v, --verbose         Shortcut for "--verbosity=all".
 
     Available commands:
-      build      Apply transformers to build a package.
-      cache      Work with the system cache.
-      deps       Print package dependencies.
-      get        Get the current package's dependencies.
-      global     Work with global packages.
-      help       Display help information for Pub.
-      publish    Publish the current package to pub.dartlang.org.
-      run        Run an executable from a package.
-      serve      Run a local web development server.
-      upgrade    Upgrade the current package's dependencies to latest versions.
-      uploader   Manage uploaders for a package on pub.dartlang.org.
-      version    Print pub version.
+      build       Apply transformers to build a package.
+      cache       Work with the system cache.
+      deps        Print package dependencies.
+      downgrade   Downgrade the current package's dependencies to oldest versions.
+      get         Get the current package's dependencies.
+      global      Work with global packages.
+      help        Display help information for Pub.
+      publish     Publish the current package to pub.dartlang.org.
+      run         Run an executable from a package.
+      serve       Run a local web development server.
+      upgrade     Upgrade the current package's dependencies to latest versions.
+      uploader    Manage uploaders for a package on pub.dartlang.org.
+      version     Print pub version.
 
     Run "pub help [command]" for more information about a command.
     See http://dartlang.org/tools/pub for detailed documentation.
@@ -127,18 +128,19 @@
         Could not find a command named "quylthulg".
 
         Available commands:
-          build      Apply transformers to build a package.
-          cache      Work with the system cache.
-          deps       Print package dependencies.
-          get        Get the current package's dependencies.
-          global     Work with global packages.
-          help       Display help information for Pub.
-          publish    Publish the current package to pub.dartlang.org.
-          run        Run an executable from a package.
-          serve      Run a local web development server.
-          upgrade    Upgrade the current package's dependencies to latest versions.
-          uploader   Manage uploaders for a package on pub.dartlang.org.
-          version    Print pub version.
+          build       Apply transformers to build a package.
+          cache       Work with the system cache.
+          deps        Print package dependencies.
+          downgrade   Downgrade the current package's dependencies to oldest versions.
+          get         Get the current package's dependencies.
+          global      Work with global packages.
+          help        Display help information for Pub.
+          publish     Publish the current package to pub.dartlang.org.
+          run         Run an executable from a package.
+          serve       Run a local web development server.
+          upgrade     Upgrade the current package's dependencies to latest versions.
+          uploader    Manage uploaders for a package on pub.dartlang.org.
+          version     Print pub version.
         ''',
         exitCode: exit_codes.USAGE);
   });
@@ -297,18 +299,19 @@
             Could not find a command named "quylthulg".
 
             Available commands:
-              build      Apply transformers to build a package.
-              cache      Work with the system cache.
-              deps       Print package dependencies.
-              get        Get the current package's dependencies.
-              global     Work with global packages.
-              help       Display help information for Pub.
-              publish    Publish the current package to pub.dartlang.org.
-              run        Run an executable from a package.
-              serve      Run a local web development server.
-              upgrade    Upgrade the current package's dependencies to latest versions.
-              uploader   Manage uploaders for a package on pub.dartlang.org.
-              version    Print pub version.
+              build       Apply transformers to build a package.
+              cache       Work with the system cache.
+              deps        Print package dependencies.
+              downgrade   Downgrade the current package's dependencies to oldest versions.
+              get         Get the current package's dependencies.
+              global      Work with global packages.
+              help        Display help information for Pub.
+              publish     Publish the current package to pub.dartlang.org.
+              run         Run an executable from a package.
+              serve       Run a local web development server.
+              upgrade     Upgrade the current package's dependencies to latest versions.
+              uploader    Manage uploaders for a package on pub.dartlang.org.
+              version     Print pub version.
             ''',
             exitCode: exit_codes.USAGE);
     });
diff --git a/sdk/lib/_internal/pub/test/pub_uploader_test.dart b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
index 82792db..fbfba2c 100644
--- a/sdk/lib/_internal/pub/test/pub_uploader_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_uploader_test.dart
@@ -5,7 +5,6 @@
 library pub_uploader_test;
 
 import 'dart:convert';
-import 'dart:io';
 
 import 'package:scheduled_test/scheduled_process.dart';
 import 'package:scheduled_test/scheduled_server.dart';
@@ -13,7 +12,6 @@
 import 'package:shelf/shelf.dart' as shelf;
 
 import '../lib/src/exit_codes.dart' as exit_codes;
-import '../lib/src/io.dart';
 import '../lib/src/utils.dart';
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
@@ -104,7 +102,6 @@
       return new shelf.Response.ok(JSON.encode({
         'success': {'message': 'Good job!'}
       }), headers: {'content-type': 'application/json'});
-      request.response.close();
     });
 
     pub.stdout.expect('Good job!');
diff --git a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
index 1b3fd2a..1614175 100644
--- a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
+++ b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
@@ -2,8 +2,6 @@
 // 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:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 0e5d021..f3a6fa8 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -343,7 +343,7 @@
 
 /// Schedules closing the web socket connection to the currently-running pub
 /// serve.
-Future closeWebSocket() {
+void closeWebSocket() {
   schedule(() {
     return _ensureWebSocket().then((_) => _webSocket.close())
         .then((_) => _webSocket = null);
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
index 04bfda5..340e932b 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
@@ -5,7 +5,6 @@
 library pub_tests;
 
 import 'package:path/path.dart' as p;
-import 'package:scheduled_test/scheduled_test.dart';
 
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart
index 4c5cb4d..f73a7ec 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_with_line_test.dart
@@ -4,7 +4,6 @@
 
 library pub_tests;
 
-import 'package:scheduled_test/scheduled_test.dart';
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 import '../utils.dart';
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index 0650075..1bbf307 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -329,6 +329,8 @@
       r'Got dependencies!|Changed \d+ dependenc(y|ies)!'));
   static final upgrade = new RunCommand('upgrade', new RegExp(
       r'(No dependencies changed\.|Changed \d+ dependenc(y|ies)!)$'));
+  static final downgrade = new RunCommand('downgrade', new RegExp(
+      r'(No dependencies changed\.|Changed \d+ dependenc(y|ies)!)$'));
 
   final String name;
   final RegExp success;
@@ -388,6 +390,12 @@
       warning: warning, exitCode: exitCode);
 }
 
+void pubDowngrade({Iterable<String> args, output, error, warning,
+    int exitCode}) {
+  pubCommand(RunCommand.downgrade, args: args, output: output, error: error,
+      warning: warning, exitCode: exitCode);
+}
+
 /// Schedules starting the "pub [global] run" process and validates the
 /// expected startup output.
 ///
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
index ab2b92b..5efbb20 100644
--- a/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
@@ -4,8 +4,6 @@
 
 library pub_tests;
 
-import 'package:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
index a8458c1..b45eda4 100644
--- a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
@@ -4,8 +4,6 @@
 
 library pub_tests;
 
-import 'package:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import 'utils.dart';
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart
index f3607be..db1671c 100644
--- a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/dev_transformers_test.dart
@@ -4,8 +4,6 @@
 
 library pub_tests;
 
-import 'package:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import 'utils.dart';
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
index 342425e..a923cea 100644
--- a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
@@ -4,8 +4,6 @@
 
 library pub_tests;
 
-import 'package:scheduled_test/scheduled_test.dart';
-
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import 'utils.dart';
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
index 47e1cf7..789dad5 100644
--- a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
@@ -16,7 +16,6 @@
 import '../../lib/src/source/path.dart';
 import '../../lib/src/system_cache.dart';
 import '../../lib/src/utils.dart';
-import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
 /// Expects that [computeTransformersNeededByTransformers] will return a graph
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index b5302cb..000ea2b 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -43,6 +43,7 @@
   group('SDK constraint', sdkConstraint);
   group('pre-release', prerelease);
   group('override', override);
+  group('downgrade', downgrade);
 }
 
 void basicGraph() {
@@ -1057,25 +1058,58 @@
   });
 }
 
+void downgrade() {
+  testResolve("downgrades a dependency to the lowest matching version", {
+    'myapp 0.0.0': {
+      'foo': '>=2.0.0 <3.0.0'
+    },
+    'foo 1.0.0': {},
+    'foo 2.0.0-dev': {},
+    'foo 2.0.0': {},
+    'foo 2.1.0': {}
+  }, lockfile: {
+    'foo': '2.1.0'
+  }, result: {
+    'myapp from root': '0.0.0',
+    'foo': '2.0.0'
+  }, downgrade: true);
+
+  testResolve('use earliest allowed prerelease if no stable versions match '
+      'while downgrading', {
+    'myapp 0.0.0': {
+      'a': '>=2.0.0-dev.1 <3.0.0'
+    },
+    'a 1.0.0': {},
+    'a 2.0.0-dev.1': {},
+    'a 2.0.0-dev.2': {},
+    'a 2.0.0-dev.3': {}
+  }, result: {
+    'myapp from root': '0.0.0',
+    'a': '2.0.0-dev.1'
+  }, downgrade: true);
+}
+
 testResolve(String description, Map packages, {
     Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
-    int maxTries}) {
+    int maxTries, bool downgrade: false}) {
   _testResolve(test, description, packages, lockfile: lockfile,
-      overrides: overrides, result: result, error: error, maxTries: maxTries);
+      overrides: overrides, result: result, error: error, maxTries: maxTries,
+      downgrade: downgrade);
 }
 
 solo_testResolve(String description, Map packages, {
     Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
-    int maxTries}) {
+    int maxTries, bool downgrade: false}) {
   log.verbosity = log.Verbosity.SOLVER;
   _testResolve(solo_test, description, packages, lockfile: lockfile,
-      overrides: overrides, result: result, error: error, maxTries: maxTries);
+      overrides: overrides, result: result, error: error, maxTries: maxTries,
+      downgrade: downgrade);
 }
 
 _testResolve(void testFn(String description, Function body),
     String description, Map packages, {
     Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
-    int maxTries}) {
+    int maxTries, bool downgrade: false}) {
   if (maxTries == null) maxTries = 1;
 
   testFn(description, () {
@@ -1124,7 +1158,9 @@
     }
 
     // Resolve the versions.
-    var future = resolveVersions(cache.sources, root, lockFile: realLockFile);
+    var future = resolveVersions(
+        downgrade ? SolveType.DOWNGRADE : SolveType.GET,
+        cache.sources, root, lockFile: realLockFile);
 
     var matcher;
     if (result != null) {
@@ -1327,6 +1363,7 @@
   final _requestedPubspecs = new Map<String, Set<Version>>();
 
   final String name;
+  final hasMultipleVersions = true;
 
   MockSource(this.name);
 
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index 2a42860..7204031 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -20,7 +20,7 @@
  * The keys of a `HashMap` must have consistent [Object.operator==]
  * and [Object.hashCode] implementations. This means that the `==` operator
  * must define a stable equivalence relation on the keys (reflexive,
- * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * symmetric, transitive, and consistent over time), and that `hashCode`
  * must be the same for objects that are considered equal by `==`.
  *
  * The map allows `null` as a key.
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index 9cd24a0..c430cf8 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -39,7 +39,7 @@
  * The elements of a `HashSet` must have consistent equality
  * and hashCode implementations. This means that the equals operation
  * must define a stable equivalence relation on the elements (reflexive,
- * anti-symmetric, transitive, and consistent over time), and that the hashCode
+ * symmetric, transitive, and consistent over time), and that the hashCode
  * must consistent with equality, so that the same for objects that are
  * considered equal.
  *
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index 48190a2..c4e2eb6 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -18,7 +18,7 @@
  * The keys of a `LinkedHashMap` must have consistent [Object.operator==]
  * and [Object.hashCode] implementations. This means that the `==` operator
  * must define a stable equivalence relation on the keys (reflexive,
- * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * symmetric, transitive, and consistent over time), and that `hashCode`
  * must be the same for objects that are considered equal by `==`.
  *
  * The map allows `null` as a key.
diff --git a/sdk/lib/collection/linked_hash_set.dart b/sdk/lib/collection/linked_hash_set.dart
index 0f50e09..c96d94d 100644
--- a/sdk/lib/collection/linked_hash_set.dart
+++ b/sdk/lib/collection/linked_hash_set.dart
@@ -13,7 +13,7 @@
  * The elements of a `LinkedHashSet` must have consistent [Object.operator==]
  * and [Object.hashCode] implementations. This means that the `==` operator
  * must define a stable equivalence relation on the elements (reflexive,
- * anti-symmetric, transitive, and consistent over time), and that `hashCode`
+ * symmetric, transitive, and consistent over time), and that `hashCode`
  * must be the same for objects that are considered equal by `==`.
  *
  * The set allows `null` as an element.
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 2e93ad1..5cc9707 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -282,13 +282,13 @@
       int millisecondsSinceEpoch = _brokenDownDateToMillisecondsSinceEpoch(
           years, month, day, hour, minute, second, millisecond, isUtc);
       if (millisecondsSinceEpoch == null) {
-        throw new FormatException(formattedString);
+        throw new FormatException("Time out of range", formattedString);
       }
       if (addOneMillisecond) millisecondsSinceEpoch++;
       return new DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch,
                                                      isUtc: isUtc);
     } else {
-      throw new FormatException(formattedString);
+      throw new FormatException("Invalid date format", formattedString);
     }
   }
 
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 800a652..3aa48c6 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -44,13 +44,122 @@
    * A message describing the format error.
    */
   final String message;
+  /**
+   * The source that caused the error.
+   *
+   * This is usually a [String], but can be other types too. If it is a string,
+   * parts of it may be included in the [toString] message.
+   *
+   * May also be `null` if omitted.
+   */
+  final source;
+  /**
+   * The position in source where the error was detected.
+   *
+   * May be omitted. If present, [source] should also be present.
+   */
+  final int position;
 
   /**
    * Creates a new FormatException with an optional error [message].
+   *
+   * Optionally also supply the [source] that had the incorrect format, and
+   * even the [position] in the format where this was detected.
    */
-  const FormatException([this.message = ""]);
+  const FormatException([this.message = "", this.source, this.position]);
 
-  String toString() => "FormatException: $message";
+  /**
+   * Returns a description of the format exception.
+   *
+   * The description always contains the [message].
+   * If [source] was provided, the description will contain (at least a part of)
+   * the source.
+   * If [position] is also provided, the part of the source included will
+   * contain that position, and the position will be marked.
+   *
+   * If the source contains a line break before position, only the line
+   * containing position will be included, and its line number will also be
+   * part of the description. Line and character offsets are 1-based.
+   */
+  String toString() {
+    String report = "FormatException";
+    if (message != null && "" != message) {
+      report = "$report: $message";
+    }
+    int position = this.position;
+    if (source is! String) {
+      if (position != null) {
+        report += " (at position $position)";
+      }
+      return report;
+    }
+    if (position != null && (position < 0 || position > source.length)) {
+      position = null;
+    }
+    // Source is string and position is null or valid.
+    if (position == null) {
+      String source = this.source;
+      if (source.length > 78) {
+        source = source.substring(0, 75) + "...";
+      }
+      return "$report\n$source";
+    }
+    int lineNum = 1;
+    int lineStart = 0;
+    bool lastWasCR;
+    for (int i = 0; i < position; i++) {
+      int char = source.codeUnitAt(i);
+      if (char == 0x0a) {
+        if (lineStart != i || !lastWasCR) {
+          lineNum++;
+        }
+        lineStart = i + 1;
+        lastWasCR = false;
+      } else if (char == 0x0d) {
+        lineNum++;
+        lineStart = i + 1;
+        lastWasCR = true;
+      }
+    }
+    if (lineNum > 1) {
+      report += " (at line $lineNum, character ${position - lineStart + 1})\n";
+    } else {
+      report += " (at character ${position + 1})\n";
+    }
+    int lineEnd = source.length;
+    for (int i = position; i < source.length; i++) {
+      int char = source.codeUnitAt(i);
+      if (char == 0x0a || char == 0x0d) {
+        lineEnd = i;
+        break;
+      }
+    }
+    int length = lineEnd - lineStart;
+    int start = lineStart;
+    int end = lineEnd;
+    String prefix = "";
+    String postfix = "";
+    if (length > 78) {
+      // Can't show entire line. Try to anchor at the nearest end, if
+      // one is within reach.
+      int index = position - lineStart;
+      if (index < 75) {
+        end = start + 75;
+        postfix = "...";
+      } else if (end - position < 75) {
+        start = end - 75;
+        prefix = "...";
+      } else {
+        // Neither end is near, just pick an area around the position.
+        start = position - 36;
+        end = position + 36;
+        prefix = postfix = "...";
+      }
+    }
+    String slice = source.substring(start, end);
+    int markOffset = position - start + prefix.length;
+    return "$report$prefix$slice$postfix\n${" " * markOffset}^\n";
+  }
 }
 
 class IntegerDivisionByZeroException implements Exception {
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 8529de9..1e26d01f 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -396,34 +396,7 @@
 
   // Report a parse failure.
   static void _fail(String uri, int index, String message) {
-    // TODO(lrn): Consider adding this to FormatException.
-    if (index == uri.length) {
-      message += " at end of input.";
-    } else {
-      message += " at position $index.\n";
-      // Pick a slice of uri containing index and, if
-      // necessary, truncate the ends to ensure the entire
-      // slice fits on one line.
-      int min = 0;
-      int max = uri.length;
-      String pre = "";
-      String post = "";
-      if (uri.length > 78) {
-        min = index - 10;
-        if (min < 0) min = 0;
-        int max = min + 72;
-        if (max > uri.length) {
-          max = uri.length;
-          min = max - 72;
-        }
-        if (min != 0) pre = "...";
-        if (max != uri.length) post = "...";
-      }
-      // Combine message, slice and a caret pointing to the error index.
-      message = "$message$pre${uri.substring(min, max)}$post\n"
-                "${' ' * (pre.length + index - min)}^";
-    }
-    throw new FormatException(message);
+    throw new FormatException(message, uri, index);
   }
 
   /// Internal non-verifying constructor. Only call with validated arguments.
@@ -608,13 +581,15 @@
           if (authority.codeUnitAt(hostEnd) == _RIGHT_BRACKET) break;
         }
         if (hostEnd == authority.length) {
-          throw new FormatException("Invalid IPv6 host entry.");
+          throw new FormatException("Invalid IPv6 host entry.",
+                                    authority, hostStart);
         }
         parseIPv6Address(authority, hostStart + 1, hostEnd);
         hostEnd++;  // Skip the closing bracket.
         if (hostEnd != authority.length &&
             authority.codeUnitAt(hostEnd) != _COLON) {
-          throw new FormatException("Invalid end of authority");
+          throw new FormatException("Invalid end of authority",
+                                    authority, hostEnd);
         }
       }
       // Split host and port.
@@ -1811,16 +1786,16 @@
     //  - One (and only one) wildcard (`::`) may be present, representing a fill
     //    of 0's. The IPv6 `::` is thus 16 bytes of `0`.
     //  - The last two parts may be replaced by an IPv4 address.
-    void error(String msg) {
-      throw new FormatException('Illegal IPv6 address, $msg');
+    void error(String msg, [position]) {
+      throw new FormatException('Illegal IPv6 address, $msg', host, position);
     }
     int parseHex(int start, int end) {
       if (end - start > 4) {
-        error('an IPv6 part can only contain a maximum of 4 hex digits');
+        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
       }
       int value = int.parse(host.substring(start, end), radix: 16);
       if (value < 0 || value > (1 << 16) - 1) {
-        error('each part must be in the range of `0x0..0xFFFF`');
+        error('each part must be in the range of `0x0..0xFFFF`', start);
       }
       return value;
     }
@@ -1835,14 +1810,14 @@
           // If we see a `:` in the beginning, expect wildcard.
           i++;
           if (host.codeUnitAt(i) != _COLON) {
-            error('invalid start colon.');
+            error('invalid start colon.', i);
           }
           partStart = i;
         }
         if (i == partStart) {
           // Wildcard. We only allow one.
           if (wildcardSeen) {
-            error('only one wildcard `::` is allowed');
+            error('only one wildcard `::` is allowed', i);
           }
           wildcardSeen = true;
           parts.add(-1);
@@ -1857,7 +1832,7 @@
     bool atEnd = (partStart == end);
     bool isLastWildcard = (parts.last == -1);
     if (atEnd && !isLastWildcard) {
-      error('expected a part after last `:`');
+      error('expected a part after last `:`', end);
     }
     if (!atEnd) {
       try {
@@ -1869,7 +1844,7 @@
           parts.add(last[0] << 8 | last[1]);
           parts.add(last[2] << 8 | last[3]);
         } catch (e) {
-          error('invalid end of IPv6 address.');
+          error('invalid end of IPv6 address.', partStart);
         }
       }
     }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 16fc5cc..2c51456 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -30127,7 +30127,7 @@
 
 @DocsEditable()
 @DomName('ClientRectList')
-class _ClientRectList extends Interceptor with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle>, JavaScriptIndexingBehavior native "ClientRectList" {
+class _ClientRectList extends Interceptor with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle>, JavaScriptIndexingBehavior native "ClientRectList,DOMRectList" {
   // To suppress missing implicit constructor warnings.
   factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
 
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 1422f8b..89febfd 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -12926,6 +12926,15 @@
 @DomName('FileReader')
 class FileReader extends EventTarget {
 
+  @DomName('FileReader.result')
+  @DocsEditable()
+  Object get result {
+    var res = _blink.BlinkFileReader.$result_Getter(this);
+    if (res is ByteBuffer) {
+      return new Uint8List.view(res);
+    }
+    return res;
+  }
 
   // To suppress missing implicit constructor warnings.
   factory FileReader._() { throw new UnsupportedError("Not supported"); }
@@ -13014,10 +13023,6 @@
   @DocsEditable()
   int get readyState => _blink.BlinkFileReader.$readyState_Getter(this);
 
-  @DomName('FileReader.result')
-  @DocsEditable()
-  Object get result => _blink.BlinkFileReader.$result_Getter(this);
-
   @DomName('FileReader.abort')
   @DocsEditable()
   void abort() => _blink.BlinkFileReader.$abort_Callback(this);
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 2d41870..d838dc5 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -13,6 +13,7 @@
 part 'iterable.dart';
 part 'list.dart';
 part 'lists.dart';
+part 'lru.dart';
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
diff --git a/sdk/lib/internal/internal_sources.gypi b/sdk/lib/internal/internal_sources.gypi
index 17cc287..acdf220 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -10,6 +10,7 @@
     'iterable.dart',
     'list.dart',
     'lists.dart',
+    'lru.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/sdk/lib/internal/lru.dart b/sdk/lib/internal/lru.dart
new file mode 100644
index 0000000..8f8a64a
--- /dev/null
+++ b/sdk/lib/internal/lru.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2014, 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 LRUAssociation<K,V> {
+  K key;
+  V value;
+  LRUAssociation previous;
+  LRUAssociation next;
+
+  void insertBetween(before, after) {
+    after.previous = this;
+    before.next = this;
+    this.next = after;
+    this.previous = before;
+  }
+
+  void remove() {
+    var after = next;
+    var before = previous;
+    after.previous = before;
+    before.next = after;
+  }
+}
+
+/**
+ * A map with a fixed capacity that evicts associations when capacity is reached
+ * on a least-recently-used basis. Implemented as an open addressing hash table
+ * with doubly-linked entries forming the LRU queue.
+ */
+class LRUMap<K,V> {
+  final LRUAssociation<K,V> _head;
+  final List _table;
+  final int _mask;
+  final int _capacity;  // Max number of associations before we start evicting.
+  int _size = 0;  // Current number of associations.
+
+  /**
+   * Create an LRUMap whose capacity is 75% of 2^shift.
+   */
+  LRUMap.withShift(int shift)
+      : this._mask = (1 << shift) - 1
+      , this._capacity = (1 << shift) * 3 ~/ 4
+      , this._table = new List(1 << shift)
+      , this._head = new LRUAssociation() {
+    // The scheme used here for handling collisions relies on there always
+    // being at least one empty slot.
+    if (shift < 1) throw new Exception("LRUMap requires a shift >= 1");
+    assert(_table.length > _capacity);
+    _head.insertBetween(_head, _head);
+  }
+
+  int _scanFor(K key) {
+    var start = key.hashCode & _mask;
+    var index = start;
+    do {
+      var assoc = _table[index];
+      if (null == assoc || assoc.key == key) {
+        return index;
+      }
+      index = (index + 1) & _mask;
+    } while (index != start);
+    // Should never happen because we start evicting associations before the
+    // table is full.
+    throw new Exception("Internal error: LRUMap table full");
+  }
+
+  void _fixCollisionsAfter(start) {
+    var assoc;
+    var index = (start + 1) & _mask;
+    while (null != (assoc = _table[index])) {
+      var newIndex = _scanFor(assoc.key);
+      if (newIndex != index) {
+        assert(_table[newIndex] == null);
+        _table[newIndex] = assoc;
+        _table[index] = null;
+      }
+      index = (index + 1) & _mask;
+    }
+  }
+
+  operator []=(K key, V value) {
+    int index = _scanFor(key);
+    var assoc = _table[index];
+    if (null != assoc) {
+      // Existing key, replace value.
+      assert(assoc.key == key);
+      assoc.value = value;
+      assoc.remove();
+      assoc.insertBetween(_head, _head.next);
+    } else {
+      // New key.
+      var newAssoc;
+      if (_size == _capacity) {
+        // Knock out the oldest association.
+        var lru = _head.previous;
+        lru.remove();
+        index = _scanFor(lru.key);
+        _table[index] = null;
+        _fixCollisionsAfter(index);
+        index = _scanFor(key);
+        newAssoc = lru;  // Recycle the association.
+      } else {
+        newAssoc = new LRUAssociation();
+        _size++;
+      }
+      newAssoc.key = key;
+      newAssoc.value = value;
+      newAssoc.insertBetween(_head, _head.next);
+      _table[index] = newAssoc;
+    }
+  }
+
+  V operator [](K key) {
+    var index = _scanFor(key);
+    var assoc = _table[index];
+    if (null == assoc) return null;
+    // Move to front of LRU queue.
+    assoc.remove();
+    assoc.insertBetween(_head, _head.next);
+    return assoc.value;
+  }
+}
diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart
index 6d7717b..3275884 100644
--- a/sdk/lib/mirrors/mirrors.dart
+++ b/sdk/lib/mirrors/mirrors.dart
@@ -900,10 +900,10 @@
   List<ParameterMirror> get parameters;
 
   /**
-   * Is the reflectee static?
+   * A function is considered non-static iff it is permited to refer to 'this'.
    *
-   * For the purposes of the mirrors library, a top-level function is
-   * considered static.
+   * Note that generative constructors are considered non-static, whereas
+   * factory constructors are considered static.
    */
   bool get isStatic;
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index cc56742..5fdb510 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -115,8 +115,10 @@
 
 
 @DomName('AudioBufferSourceNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
 class AudioBufferSourceNode extends AudioSourceNode native "AudioBufferSourceNode" {
 
   // TODO(efortuna): Remove these methods when Chrome stable also uses start
@@ -223,8 +225,10 @@
 
 
 @DomName('AudioContext')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
 class AudioContext extends EventTarget native "AudioContext,webkitAudioContext" {
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 8cdf0ea..4901403 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -165,8 +165,10 @@
 
 @DocsEditable()
 @DomName('AudioBufferSourceNode')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioBufferSourceNode-section
 class AudioBufferSourceNode extends AudioSourceNode {
   // To suppress missing implicit constructor warnings.
   factory AudioBufferSourceNode._() { throw new UnsupportedError("Not supported"); }
@@ -263,8 +265,10 @@
 
 
 @DomName('AudioContext')
-// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
+@SupportedBrowser(SupportedBrowser.CHROME)
+@SupportedBrowser(SupportedBrowser.FIREFOX)
 @Experimental()
+// https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioContext-section
 class AudioContext extends EventTarget {
   // To suppress missing implicit constructor warnings.
   factory AudioContext._() { throw new UnsupportedError("Not supported"); }
diff --git a/site/try/poi/poi.dart b/site/try/poi/poi.dart
index 4b4bcd9..e93e6c8 100644
--- a/site/try/poi/poi.dart
+++ b/site/try/poi/poi.dart
@@ -17,18 +17,56 @@
     FormattingDiagnosticHandler,
     SourceFileProvider;
 
-import 'package:compiler/compiler.dart' as api show
-    Diagnostic;
+import 'package:compiler/compiler.dart' as api;
 
-Future doneFuture;
+import 'package:compiler/implementation/dart2jslib.dart' show
+    Compiler,
+    Enqueuer,
+    QueueFilter,
+    WorkItem;
 
-void main(List<String> arguments) {
+import 'package:compiler/implementation/elements/visitor.dart' show
+    ElementVisitor;
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    ClassElement,
+    CompilationUnitElement,
+    Element,
+    LibraryElement,
+    ScopeContainerElement;
+
+import 'package:compiler/implementation/scanner/scannerlib.dart' show
+    PartialClassElement,
+    PartialElement;
+
+import 'package:compiler/implementation/util/uri_extras.dart' show
+    relativize;
+
+main(List<String> arguments) {
   Uri script = Uri.base.resolve(arguments.first);
   int position = int.parse(arguments[1]);
+
   FormattingDiagnosticHandler handler = new FormattingDiagnosticHandler();
   handler
       ..verbose = true
       ..enableColors = true;
+  api.CompilerInputProvider inputProvider = handler.provider;
+
+  inputProvider(script);
+  handler(
+      script, position, position + 1,
+      'Point of interest.', api.Diagnostic.HINT);
+
+  Future future = runPoi(script, position, inputProvider, handler);
+  return future.then((Element element) {
+    print(scopeInformation(element, position));
+  });
+}
+
+Future<Element> runPoi(
+    Uri script, int position,
+    api.CompilerInputProvider inputProvider,
+    api.DiagnosticHandler handler) {
 
   Uri libraryRoot = Uri.base.resolve('sdk/');
   Uri packageRoot = Uri.base.resolveUri(
@@ -42,22 +80,175 @@
       '--categories=Client,Server',
   ];
 
-  var cachedCompiler = null;
+  Compiler cachedCompiler = null;
   cachedCompiler = reuseCompiler(
       diagnosticHandler: handler,
-      inputProvider: handler.provider,
+      inputProvider: inputProvider,
       options: options,
       cachedCompiler: cachedCompiler,
       libraryRoot: libraryRoot,
       packageRoot: packageRoot,
       packagesAreImmutable: true);
 
-  doneFuture = cachedCompiler.run(script).then((success) {
+  cachedCompiler.enqueuerFilter = new ScriptOnlyFilter(script);
+
+  return cachedCompiler.run(script).then((success) {
     if (success != true) {
       throw 'Compilation failed';
     }
-    handler(
-        script, position, position + 1,
-        'Point of interest.', api.Diagnostic.HINT);
+    return findPosition(position, cachedCompiler.mainApp);
   });
 }
+
+Element findPosition(int position, Element element) {
+  FindPositionVisitor visitor = new FindPositionVisitor(position, element);
+  element.accept(visitor);
+  return visitor.element;
+}
+
+String scopeInformation(Element element, int position) {
+  ScopeInformationVisitor visitor =
+      new ScopeInformationVisitor(element, position);
+  element.accept(visitor);
+  return '${visitor.buffer}';
+}
+
+class FindPositionVisitor extends ElementVisitor {
+  final int position;
+  Element element;
+
+  FindPositionVisitor(this.position, this.element);
+
+  visitElement(Element e) {
+    if (e is PartialElement) {
+      if (e.beginToken.charOffset <= position &&
+          position < e.endToken.next.charOffset) {
+        element = e;
+      }
+    }
+  }
+
+  visitClassElement(ClassElement e) {
+    if (e is PartialClassElement) {
+      if (e.beginToken.charOffset <= position &&
+          position < e.endToken.next.charOffset) {
+        element = e;
+        visitScopeContainerElement(e);
+      }
+    }
+  }
+
+  visitScopeContainerElement(ScopeContainerElement e) {
+    e.forEachLocalMember((Element element) => element.accept(this));
+  }
+}
+
+class ScriptOnlyFilter implements QueueFilter {
+  final Uri script;
+
+  ScriptOnlyFilter(this.script);
+
+  bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) => true;
+
+  void processWorkItem(void f(WorkItem work), WorkItem work) {
+    if (work.element.library.canonicalUri == script) {
+      f(work);
+    }
+  }
+}
+
+class ScopeInformationVisitor extends ElementVisitor/* <void> */ {
+  // TODO(ahe): Include function parameters and local variables.
+
+  final Element element;
+  final int position;
+  final StringBuffer buffer = new StringBuffer();
+  int indentationLevel = 0;
+
+  ScopeInformationVisitor(this.element, this.position);
+
+  String get indentation => '  ' * indentationLevel;
+
+  StringBuffer get indented => buffer..write(indentation);
+
+  void visitElement(Element e) {
+    serialize(e, omitEnclosing: false);
+  }
+
+  void visitLibraryElement(LibraryElement e) {
+    bool isFirst = true;
+    serialize(
+        e, omitEnclosing: true,
+        name: relativize(Uri.base, e.canonicalUri, false),
+        serializeMembers: () {
+          // TODO(ahe): Include imported elements in libraries.
+          e.forEachLocalMember((Element member) {
+            if (!isFirst) {
+              buffer.write(',');
+            }
+            buffer.write('\n');
+            indented;
+            serialize(member);
+            isFirst = false;
+          });
+        });
+  }
+
+  void visitScopeContainerElement(ScopeContainerElement e) {
+    bool isFirst = true;
+    serialize(e, omitEnclosing: false, serializeMembers: () {
+      // TODO(ahe): Include inherited members in classes.
+      e.forEachLocalMember((Element member) {
+        if (!isFirst) {
+          buffer.write(',');
+        }
+        buffer.write('\n');
+        indented;
+        serialize(member);
+        isFirst = false;
+      });
+    });
+  }
+
+  void visitCompilationUnitElement(CompilationUnitElement e) {
+    e.enclosingElement.accept(this);
+  }
+
+  void serialize(
+      Element element,
+      {bool omitEnclosing: true,
+       void serializeMembers(),
+       String name}) {
+    if (name == null) {
+      name = element.name;
+    }
+    buffer.write('{\n');
+    indentationLevel++;
+    indented
+        ..write('"name": "')
+        ..write(name)
+        ..write('",\n');
+    indented
+        ..write('"kind": "')
+        ..write(element.kind)
+        ..write('"');
+    // TODO(ahe): Add a type/signature field.
+    if (serializeMembers != null) {
+      buffer.write(',\n');
+      indented.write('"members": [');
+      indentationLevel++;
+      serializeMembers();
+      indentationLevel--;
+      buffer.write('\n');
+      indented.write(']');
+    }
+    if (!omitEnclosing) {
+      buffer.write(',\n');
+      indented.write('"enclosing": ');
+      element.enclosingElement.accept(this);
+    }
+    indentationLevel--;
+    buffer.write('\n');
+    indented.write('}');
+  }
+}
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index 0fcc793..ad3bbc8 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -78,6 +78,7 @@
   bool usesDartHtml = false;
   Worker worker;
   List<String> objectUrls = <String>[];
+  String firstError;
 
   static CompilationProcess current;
 
@@ -139,7 +140,7 @@
   }
 
   onFail(_) {
-    interaction.onCompilationFailed();
+    interaction.onCompilationFailed(firstError);
   }
 
   onDone(_) {
@@ -197,6 +198,7 @@
 
   void run(String url, IFrameElement makeIframe()) {
     void retryInIframe() {
+      interaction.aboutToRun();
       var frame = makeIframe();
       frame.style
           ..visibility = 'hidden'
@@ -206,9 +208,8 @@
       errorStream(frame).listen(interaction.onIframeError);
     }
     void onError(String errorMessage) {
+      interaction.consolePrintLine(errorMessage);
       console
-          ..appendText(errorMessage)
-          ..appendText(' ')
           ..append(buildButton('Try in iframe', (_) => retryInIframe()))
           ..appendText('\n');
     }
@@ -240,6 +241,9 @@
       interaction.verboseCompilerMessage(message);
       return;
     }
+    if (kind == 'error' && firstError == null) {
+      firstError = message;
+    }
     String uri = diagnostic['uri'];
     if (uri != '${PRIVATE_SCHEME}:/main.dart') {
       interaction.consolePrintLine('$uri: [$kind] $message');
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 8ee2cb3..5891551 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -166,7 +166,7 @@
   /// Called by [:window.onMessage.listen:].
   void onWindowMessage(MessageEvent event);
 
-  void onCompilationFailed();
+  void onCompilationFailed(String firstError);
 
   void onCompilationDone();
 
@@ -285,7 +285,9 @@
 
   void onWindowMessage(MessageEvent event) => state.onWindowMessage(event);
 
-  void onCompilationFailed() => state.onCompilationFailed();
+  void onCompilationFailed(String firstError) {
+    return state.onCompilationFailed(firstError);
+  }
 
   void onCompilationDone() => state.onCompilationDone();
 
@@ -715,8 +717,12 @@
     outputDiv.appendText('$line\n');
   }
 
-  void onCompilationFailed() {
-    consolePrintLine('Compilation failed.');
+  void onCompilationFailed(String firstError) {
+    if (firstError == null) {
+      consolePrintLine('Compilation failed.');
+    } else {
+      consolePrintLine('Compilation failed: $firstError');
+    }
   }
 
   void onCompilationDone() {
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 69d637b..02b15e0 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -108,8 +108,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index c234ae3..ddc256e 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -1369,7 +1369,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/analyze_only_test.dart
index ce0ce69..81b46db 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/analyze_only_test.dart
@@ -12,6 +12,9 @@
 import '../../utils/dummy_compiler_test.dart' as dummy;
 import 'package:compiler/compiler.dart';
 
+import 'package:compiler/implementation/dart2jslib.dart' show
+    MessageKind;
+
 runCompiler(String main, List<String> options,
             onValue(String code, List errors, List warnings)) {
   List errors = new List();
@@ -45,7 +48,14 @@
     onValue(code, errors, warnings);
   }, onError: (e) {
     throw 'Compilation failed: ${Error.safeToString(e)}';
-  }).then(asyncSuccess);
+  }).then(asyncSuccess).catchError((error, stack) {
+    print('\n\n-----------------------------------------------');
+    print('main source:\n$main');
+    print('options: $options\n');
+    print('threw:\n $error\n$stack');
+    print('-----------------------------------------------\n\n');
+    throw error;
+  });
 }
 
 main() {
@@ -53,10 +63,11 @@
     "",
     [],
     (String code, List errors, List warnings) {
-      Expect.isNull(code);
-      Expect.equals(1, errors.length, 'errors=$errors');
-      Expect.equals("Could not find 'main'.", errors[0].toString());
-      Expect.isTrue(warnings.isEmpty, 'warnings=$warnings');
+      Expect.isNotNull(code);
+      Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
+      Expect.equals(
+          "${MessageKind.MISSING_MAIN.message({'main': 'main'})}",
+          warnings.single);
     });
 
   runCompiler(
@@ -73,10 +84,10 @@
     ['--analyze-only'],
     (String code, List errors, List warnings) {
       Expect.isNull(code);
-      Expect.equals(1, errors.length);
-      Expect.isTrue(
-          errors[0].toString().startsWith("Could not find 'main'."));
-      Expect.isTrue(warnings.isEmpty);
+      Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
+      Expect.equals(
+          "${MessageKind.CONSIDER_ANALYZE_ALL.message({'main': 'main'})}",
+          warnings.single);
     });
 
   runCompiler(
@@ -93,10 +104,10 @@
     ['--analyze-only'],
     (String code, List errors, List warnings) {
       Expect.isNull(code);
-      Expect.equals(1, errors.length);
-      Expect.isTrue(
-          errors[0].toString().startsWith("Could not find 'main'."));
-      Expect.isTrue(warnings.isEmpty);
+      Expect.isTrue(errors.isEmpty, 'errors is not empty: $errors');
+      Expect.equals(
+          "${MessageKind.CONSIDER_ANALYZE_ALL.message({'main': 'main'})}",
+          warnings.single);
     });
 
   runCompiler(
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 03930aa..699beff 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -20,7 +20,7 @@
   "implementation/helpers/": const [" is never "],
 
   // Some things in dart_printer are not yet used
-  "implementation/dart_backend/dart_printer.dart" : const [" is never "],
+  "implementation/dart_backend/backend_ast_nodes.dart" : const [" is never "],
 
   // Setlet implements the Set interface: Issue 18959.
   "implementation/util/setlet.dart": const [" is never "],
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/backend_dart/dart_backend_test.dart
similarity index 99%
rename from tests/compiler/dart2js/dart_backend_test.dart
rename to tests/compiler/dart2js/backend_dart/dart_backend_test.dart
index ecc0a00..a465276 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_backend_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import 'mock_compiler.dart';
+import '../mock_compiler.dart';
 import 'package:compiler/compiler.dart';
 import 'package:compiler/implementation/dart2jslib.dart' as leg;
 import 'package:compiler/implementation/dart_backend/dart_backend.dart';
diff --git a/tests/compiler/dart2js/dart_new_backend_test.dart b/tests/compiler/dart2js/backend_dart/dart_new_backend_test.dart
similarity index 97%
rename from tests/compiler/dart2js/dart_new_backend_test.dart
rename to tests/compiler/dart2js/backend_dart/dart_new_backend_test.dart
index b625d91..11b599f 100644
--- a/tests/compiler/dart2js/dart_new_backend_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_new_backend_test.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 'compiler_helper.dart';
+import '../compiler_helper.dart';
 import 'dart:async';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/implementation/dart2jslib.dart';
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
similarity index 99%
rename from tests/compiler/dart2js/dart_printer_test.dart
rename to tests/compiler/dart2js/backend_dart/dart_printer_test.dart
index bba37f4..ad7d11b 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
@@ -5,7 +5,7 @@
 library dart_printer_test;
 
 import "package:expect/expect.dart";
-import 'package:compiler/implementation/dart_backend/dart_printer.dart';
+import 'package:compiler/implementation/dart_backend/backend_ast_nodes.dart';
 import 'package:compiler/implementation/scanner/scannerlib.dart';
 import 'package:compiler/implementation/source_file.dart';
 import 'package:compiler/implementation/dart2jslib.dart';
@@ -13,7 +13,8 @@
 import 'dart:mirrors';
 import 'package:compiler/implementation/tree/tree.dart' as tree;
 import 'package:compiler/implementation/string_validator.dart';
-import 'package:compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
+import 'package:compiler/implementation/dart_backend/backend_ast_to_frontend_ast.dart'
+    show TreePrinter;
 
 /// For debugging the [AstBuilder] stack. Prints information about [x].
 void show(x) {
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index 678e6a8..9d5e04d 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -7,6 +7,7 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
 import 'package:compiler/implementation/dump_info.dart';
+import 'dart:convert';
 
 const String TEST_ONE = r"""
 library main;
@@ -44,27 +45,27 @@
 main() {
   var compiler = compilerFor({'main.dart': TEST_ONE}, options: ["--dump-info"]);
   asyncTest(() => compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) {
-    var visitor = compiler.dumpInfoTask.infoDumpVisitor;
-    var info = visitor.collectDumpInfo();
-    var mainlib = info.libraries[0];
-    Expect.stringEquals("main", mainlib.name);
-    List contents = mainlib.contents;
-    Expect.stringEquals("main", mainlib.name);
-    print(mainlib.contents.map((e)=> e.name));
-    var a = contents.singleWhere((e) => e.name == "a");
-    var c = contents.singleWhere((e) => e.name == "c");
-    var f = contents.singleWhere((e) => e.name == "f");
-    var main = contents.singleWhere((e) => e.name == "main");
-    Expect.stringEquals("library", mainlib.kind);
-    Expect.stringEquals("field", a.kind);
-    Expect.stringEquals("class", c.kind);
-    var constructor = c.contents.singleWhere((e) => e.name == "c");
-    Expect.stringEquals("constructor", constructor.kind);
-    var method = c.contents.singleWhere((e) => e.name == "foo");
-    Expect.stringEquals("method", method.kind);
-    var field = c.contents.singleWhere((e) => e.name == "m");
-    Expect.stringEquals("field", field.kind);
-    Expect.stringEquals("function", f.kind);
-    Expect.stringEquals("function", main.kind);
+    var dumpTask = compiler.dumpInfoTask;
+    dumpTask.collectInfo();
+    var info = dumpTask.infoCollector;
+
+    StringBuffer sb = new StringBuffer();
+    dumpTask.dumpInfoJson(sb);
+    String json = sb.toString();
+    Map<String, dynamic> map = JSON.decode(json);
+    Expect.isTrue(map.isNotEmpty);
+    Expect.isTrue(map['elements'].isNotEmpty);
+    Expect.isTrue(map['elements']['function'].isNotEmpty);
+    Expect.isTrue(map['elements']['library'].isNotEmpty);
+
+    Expect.isTrue(map['elements']['library'].values.any((lib) {
+      return lib['name'] == "main";
+    }));
+    Expect.isTrue(map['elements']['class'].values.any((clazz) {
+      return clazz['name'] == "c";
+    }));
+    Expect.isTrue(map['elements']['function'].values.any((fun) {
+      return fun['name'] == 'f';
+    }));
   }));
 }
diff --git a/tests/compiler/dart2js/if_do_while_test.dart b/tests/compiler/dart2js/if_do_while_test.dart
new file mode 100644
index 0000000..64b76f8
--- /dev/null
+++ b/tests/compiler/dart2js/if_do_while_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, 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 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'compiler_helper.dart';
+
+const String TEST = r"""
+foo(param0, param1, param2) {
+  if (param0)
+    do {
+      param1();
+    } while(param2());
+  else {
+    param2();
+  }
+}
+""";
+
+main() {
+  print("foo");
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    // Check that the do-while in the 'then' is enclosed in braces.
+    // Otherwise Android 4.0 stock browser has a syntax error. See issue 10923.
+    Expect.isTrue(
+        new RegExp(r'if[ ]*\([^)]+\)[ ]*\{[\n ]*do').hasMatch(generated));
+  }));
+}
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 5aec8fa..2adea62 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -60,7 +60,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 = 380;
+    int expectedMethodCount = 381;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 77aa0f7..1cb57dd 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -1,337 +1,342 @@
-// Copyright (c) 2014, 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 for creating mock versions of platform and internal libraries.

-

-library mock_libraries;

-

-String buildLibrarySource(

-    Map<String, String> elementMap,

-    [Map<String, String> additionalElementMap = const <String, String>{}]) {

-  Map<String, String> map = new Map<String, String>.from(elementMap);

-  if (additionalElementMap != null) {

-    map.addAll(additionalElementMap);

-  }

-  StringBuffer sb = new StringBuffer();

-  map.values.forEach((String element) {

-    sb.write('$element\n');

-  });

-  return sb.toString();

-}

-

-const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{

-  'bool': 'class bool {}',

-  'DateTime': r'''

-      class DateTime {

-        DateTime(year);

-        DateTime.utc(year);

-      }''',

-  'double': r'''

-      abstract class double extends num {

-        static var NAN = 0;

-        static parse(s) {}

-      }''',

-  'Function': 'class Function {}',

-  'identical': 'bool identical(Object a, Object b) { return true; }',

-  'int': 'abstract class int extends num { }',

-  'LinkedHashMap': r'''

-      class LinkedHashMap {

-        factory LinkedHashMap._empty() => null;

-        factory LinkedHashMap._literal(elements) => null;

-      }''',

-  'List': r'''

-      class List<E> {

-        var length;

-        List([length]);

-        List.filled(length, element);

-        E get first => null;

-        E get last => null;

-        E get single => null;

-        E removeLast() => null;

-        E removeAt(i) => null;

-        E elementAt(i) => null;

-        E singleWhere(f) => null;

-      }''',

-  'Map': 'abstract class Map<K,V> {}',

-  'Null': 'class Null {}',

-  'num': 'abstract class num {}',

-  'print': 'print(var obj) {}',

-  'proxy': 'const proxy = 0;',

-  'Object': r'''

-      class Object {

-        const Object();

-        operator ==(other) { return true; }

-        get hashCode => throw "Object.hashCode not implemented.";

-        String toString() { return null; }

-        noSuchMethod(im) { throw im; }

-      }''',

-  'StackTrace': 'abstract class StackTrace {}',

-  'String': 'class String implements Pattern {}',

-  'Type': 'class Type {}',

-  'Pattern': 'abstract class Pattern {}',

-};

-

-const String DEFAULT_PATCH_CORE_SOURCE = r'''

-import 'dart:_js_helper';

-import 'dart:_interceptors';

-import 'dart:_isolate_helper';

-''';

-

-const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{

-  'assertHelper': 'assertHelper(a) {}',

-  'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',

-  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',

-  'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',

-  'boolConversionCheck': 'boolConversionCheck(x) {}',

-  'boolTypeCast': 'boolTypeCast(value) {}',

-  'boolTypeCheck': 'boolTypeCheck(value) {}',

-  'BoundClosure': r'''abstract class BoundClosure extends Closure {

-    var self;

-    var target;

-    var receiver;

-  }''',

-  'buildFunctionType':

-      r'''buildFunctionType(returnType, parameterTypes,

-                            optionalParameterTypes) {}''',

-  'buildInterfaceType': 'buildInterfaceType(rti, typeArguments) {}',

-  'buildNamedFunctionType':

-      r'''buildNamedFunctionType(returnType, parameterTypes,

-                                 namedParameters) {}''',

-  'checkFunctionSubtype':

-      r'''checkFunctionSubtype(var target, String signatureName,

-                               String contextName, var context,

-                               var typeArguments) {}''',

-  'checkMalformedType': 'checkMalformedType(value, message) {}',

-  'Closure': 'abstract class Closure implements Function { }',

-  'closureFromTearOff':

-      r'''closureFromTearOff(receiver, functions, reflectionInfo,

-                             isStatic, jsArguments, name) {}''',

-  'computeSignature':

-      'computeSignature(var signature, var context, var contextName) {}',

-  'ConstantMap': 'class ConstantMap {}',

-  'ConstantProtoMap': 'class ConstantProtoMap {}',

-  'ConstantStringMap': 'class ConstantStringMap {}',

-  'copyTypeArguments': 'copyTypeArguments(source, target) {}',

-  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',

-  'createRuntimeType': 'createRuntimeType(a) {}',

-  'doubleTypeCast': 'doubleTypeCast(value) {}',

-  'doubleTypeCheck': 'doubleTypeCheck(value) {}',

-  'functionSubtypeCast':

-      r'''functionSubtypeCast(Object object, String signatureName,

-                              String contextName, var context) {}''',

-  'functionTypeTestMetaHelper': r'''

-      functionTypeTestMetaHelper() {

-        buildFunctionType(null, null, null);

-        buildNamedFunctionType(null, null, null);

-        buildInterfaceType(null, null);

-      }''',

-  'getFallThroughError': 'getFallThroughError() {}',

-  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',

-  'getRuntimeTypeArgument':

-      'getRuntimeTypeArgument(target, substitutionName, index) {}',

-  'getRuntimeTypeArguments':

-      'getRuntimeTypeArguments(target, substitutionName) {}',

-  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',

-  'getTraceFromException': 'getTraceFromException(exception) {}',

-  'getTypeArgumentByIndex': 'getTypeArgumentByIndex(target, index) {}',

-  'GeneralConstantMap': 'class GeneralConstantMap {}',

-  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',

-  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',

-  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',

-  'intTypeCast': 'intTypeCast(value) {}',

-  'intTypeCheck': 'intTypeCheck(value) {}',

-  'IrRepresentation': 'class IrRepresentation {}',

-  'isJsIndexable': 'isJsIndexable(a, b) {}',

-  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',

-  'JSInvocationMirror': 'class JSInvocationMirror {}',

-  'listSuperNativeTypeCast': 'listSuperNativeTypeCast(value) {}',

-  'listSuperNativeTypeCheck': 'listSuperNativeTypeCheck(value) {}',

-  'listSuperTypeCast': 'listSuperTypeCast(value) {}',

-  'listSuperTypeCheck': 'listSuperTypeCheck(value) {}',

-  'listTypeCast': 'listTypeCast(value) {}',

-  'listTypeCheck': 'listTypeCheck(value) {}',

-  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',

-  'NoInline': 'class NoInline {}',

-  'NoSideEffects': 'class NoSideEffects {}',

-  'NoThrows': 'class NoThrows {}',

-  'numberOrStringSuperNativeTypeCast':

-      'numberOrStringSuperNativeTypeCast(value) {}',

-  'numberOrStringSuperNativeTypeCheck':

-      'numberOrStringSuperNativeTypeCheck(value) {}',

-  'numberOrStringSuperTypeCast': 'numberOrStringSuperTypeCast(value) {}',

-  'numberOrStringSuperTypeCheck': 'numberOrStringSuperTypeCheck(value) {}',

-  'numTypeCast': 'numTypeCast(value) {}',

-  'numTypeCheck': 'numTypeCheck(value) {}',

-  'patch': 'const patch = 0;',

-  'propertyTypeCast': 'propertyTypeCast(x) {}',

-  'propertyTypeCheck': 'propertyTypeCheck(value, property) {}',

-  'requiresPreamble': 'requiresPreamble() {}',

-  'RuntimeFunctionType': 'class RuntimeFunctionType {}',

-  'RuntimeTypePlain': 'class RuntimeTypePlain {}',

-  'runtimeTypeToString': 'runtimeTypeToString(type, {onTypeVariable(i)}) {}',

-  'S': 'S() {}',

-  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',

-  'stringSuperNativeTypeCast': 'stringSuperNativeTypeCast(value) {}',

-  'stringSuperNativeTypeCheck': 'stringSuperNativeTypeCheck(value) {}',

-  'stringSuperTypeCast': 'stringSuperTypeCast(value) {}',

-  'stringSuperTypeCheck': 'stringSuperTypeCheck(value) {}',

-  'stringTypeCast': 'stringTypeCast(x) {}',

-  'stringTypeCheck': 'stringTypeCheck(x) {}',

-  'subtypeCast': 'subtypeCast(object, isField, checks, asField) {}',

-  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',

-  'throwAbstractClassInstantiationError':

-      'throwAbstractClassInstantiationError(className) {}',

-  'throwCyclicInit': 'throwCyclicInit() {}',

-  'throwExpression': 'throwExpression(e) {}',

-  'throwNoSuchMethod':

-      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',

-  'throwRuntimeError': 'throwRuntimeError(message) {}',

-  'throwTypeError': 'throwTypeError(message) {}',

-  'TypeImpl': 'class TypeImpl {}',

-  'TypeVariable': 'class TypeVariable {}',

-  'unwrapException': 'unwrapException(e) {}',

-  'voidTypeCheck': 'voidTypeCheck(value) {}',

-  'wrapException': 'wrapException(x) { return x; }',

-};

-

-const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY

-    = const <String, String>{

-  'JS': r'''

-      dynamic JS(String typeDescription, String codeTemplate,

-        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,

-         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',

-};

-

-const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{

-  'findIndexForNativeSubclassType':

-      'findIndexForNativeSubclassType(type) {}',

-  'getDispatchProperty': 'getDispatchProperty(o) {}',

-  'getInterceptor': 'getInterceptor(x) {}',

-  'getNativeInterceptor': 'getNativeInterceptor(x) {}',

-  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',

-  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',

-  'interceptedNames': 'var interceptedNames;',

-  'Interceptor': r'''

-      class Interceptor {

-        toString() {}

-        bool operator==(other) => identical(this, other);

-        get hashCode => throw "Interceptor.hashCode not implemented.";

-        noSuchMethod(im) { throw im; }

-      }''',

-  'JSArray': r'''

-          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {

-            JSArray();

-            factory JSArray.typed(a) => a;

-            var length;

-            operator[](index) => this[index];

-            operator[]=(index, value) { this[index] = value; }

-            add(value) { this[length + 1] = value; }

-            insert(index, value) {}

-            E get first => this[0];

-            E get last => this[0];

-            E get single => this[0];

-            E removeLast() => this[0];

-            E removeAt(index) => this[0];

-            E elementAt(index) => this[0];

-            E singleWhere(f) => this[0];

-          }''',

-  'JSBool': 'class JSBool extends Interceptor implements bool {}',

-  'JSDouble': 'class JSDouble extends JSNumber implements double {}',

-  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',

-  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',

-  'JSFunction':

-      'abstract class JSFunction extends Interceptor implements Function {}',

-  'JSIndexable': r'''

-      abstract class JSIndexable {

-        get length;

-        operator[](index);

-      }''',

-  'JSInt': r'''

-       class JSInt extends JSNumber implements int {

-         operator~() => this;

-       }''',

-  'JSMutableArray':

-      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',

-  'JSMutableIndexable':

-      'abstract class JSMutableIndexable extends JSIndexable {}',

-      'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',

-  'JSNull': r'''

-      class JSNull extends Interceptor {

-        bool operator==(other) => identical(null, other);

-        get hashCode => throw "JSNull.hashCode not implemented.";

-        String toString() => 'Null';

-        Type get runtimeType => null;

-        noSuchMethod(x) => super.noSuchMethod(x);

-      }''',

-  'JSNumber': r'''

-      class JSNumber extends Interceptor implements num {

-        // All these methods return a number to please type inferencing.

-        operator-() => (this is JSInt) ? 42 : 42.2;

-        operator +(other) => (this is JSInt) ? 42 : 42.2;

-        operator -(other) => (this is JSInt) ? 42 : 42.2;

-        operator ~/(other) => _tdivFast(other);

-        operator /(other) => (this is JSInt) ? 42 : 42.2;

-        operator *(other) => (this is JSInt) ? 42 : 42.2;

-        operator %(other) => (this is JSInt) ? 42 : 42.2;

-        operator <<(other) => _shlPositive(other);

-        operator >>(other) {

-          return _shrBothPositive(other) + _shrReceiverPositive(other) +

-            _shrOtherPositive(other);

-        }

-        operator |(other) => 42;

-        operator &(other) => 42;

-        operator ^(other) => 42;

-    

-        operator >(other) => true;

-        operator >=(other) => true;

-        operator <(other) => true;

-        operator <=(other) => true;

-        operator ==(other) => true;

-        get hashCode => throw "JSNumber.hashCode not implemented.";

-    

-        // We force side effects on _tdivFast to mimic the shortcomings of

-        // the effect analysis: because the `_tdivFast` implementation of

-        // the core library has calls that may not already be analyzed,

-        // the analysis will conclude that `_tdivFast` may have side

-        // effects.

-        _tdivFast(other) => new List()..length = 42;

-        _shlPositive(other) => 42;

-        _shrBothPositive(other) => 42;

-        _shrReceiverPositive(other) => 42;

-        _shrOtherPositive(other) => 42;

-    

-        abs() => (this is JSInt) ? 42 : 42.2;

-        remainder(other) => (this is JSInt) ? 42 : 42.2;

-        truncate() => 42;

-      }''',

-  'JSString': r'''

-      class JSString extends Interceptor implements String, JSIndexable {

-        var split;

-        var length;

-        operator[](index) {}

-        toString() {}

-        operator+(other) => this;

-      }''',

-  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',

-  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',

-  'mapTypeToInterceptor': 'var mapTypeToInterceptor;',

-  'ObjectInterceptor': 'class ObjectInterceptor {}',

-  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',

-  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',

-};

-

-const Map<String, String> DEFAULT_ISOLATE_HELPER_LIBRARY =

-    const <String, String>{

-  'startRootIsolate': 'var startRootIsolate;',

-  '_currentIsolate': 'var _currentIsolate;',

-  '_callInIsolate': 'var _callInIsolate;',

-  '_WorkerBase': 'class _WorkerBase {}',

-};

-

-const Map<String, String> DEFAULT_MIRRORS_LIBRARY = const <String, String>{

-  'Comment': 'class Comment {}',

-  'MirrorSystem': 'class MirrorSystem {}',

-  'MirrorsUsed': 'class MirrorsUsed {}',

-};

-

+// Copyright (c) 2014, 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 for creating mock versions of platform and internal libraries.
+
+library mock_libraries;
+
+String buildLibrarySource(
+    Map<String, String> elementMap,
+    [Map<String, String> additionalElementMap = const <String, String>{}]) {
+  Map<String, String> map = new Map<String, String>.from(elementMap);
+  if (additionalElementMap != null) {
+    map.addAll(additionalElementMap);
+  }
+  StringBuffer sb = new StringBuffer();
+  map.values.forEach((String element) {
+    sb.write('$element\n');
+  });
+  return sb.toString();
+}
+
+const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
+  'bool': 'class bool {}',
+  'DateTime': r'''
+      class DateTime {
+        DateTime(year);
+        DateTime.utc(year);
+      }''',
+  'double': r'''
+      abstract class double extends num {
+        static var NAN = 0;
+        static parse(s) {}
+      }''',
+  'Function': 'class Function {}',
+  'identical': 'bool identical(Object a, Object b) { return true; }',
+  'int': 'abstract class int extends num { }',
+  'LinkedHashMap': r'''
+      class LinkedHashMap {
+        factory LinkedHashMap._empty() => null;
+        factory LinkedHashMap._literal(elements) => null;
+      }''',
+  'List': r'''
+      class List<E> {
+        var length;
+        List([length]);
+        List.filled(length, element);
+        E get first => null;
+        E get last => null;
+        E get single => null;
+        E removeLast() => null;
+        E removeAt(i) => null;
+        E elementAt(i) => null;
+        E singleWhere(f) => null;
+      }''',
+  'Map': 'abstract class Map<K,V> {}',
+  'Null': 'class Null {}',
+  'num': 'abstract class num {}',
+  'print': 'print(var obj) {}',
+  'proxy': 'const proxy = 0;',
+  'Object': r'''
+      class Object {
+        const Object();
+        operator ==(other) { return true; }
+        get hashCode => throw "Object.hashCode not implemented.";
+        String toString() { return null; }
+        noSuchMethod(im) { throw im; }
+      }''',
+  'StackTrace': 'abstract class StackTrace {}',
+  'String': 'class String implements Pattern {}',
+  'Type': 'class Type {}',
+  'Pattern': 'abstract class Pattern {}',
+};
+
+const String DEFAULT_PATCH_CORE_SOURCE = r'''
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';
+''';
+
+const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
+  'assertHelper': 'assertHelper(a) {}',
+  'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',
+  'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
+  'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',
+  'boolConversionCheck': 'boolConversionCheck(x) {}',
+  'boolTypeCast': 'boolTypeCast(value) {}',
+  'boolTypeCheck': 'boolTypeCheck(value) {}',
+  'BoundClosure': r'''abstract class BoundClosure extends Closure {
+    var self;
+    var target;
+    var receiver;
+  }''',
+  'buildFunctionType':
+      r'''buildFunctionType(returnType, parameterTypes,
+                            optionalParameterTypes) {}''',
+  'buildInterfaceType': 'buildInterfaceType(rti, typeArguments) {}',
+  'buildNamedFunctionType':
+      r'''buildNamedFunctionType(returnType, parameterTypes,
+                                 namedParameters) {}''',
+  'checkFunctionSubtype':
+      r'''checkFunctionSubtype(var target, String signatureName,
+                               String contextName, var context,
+                               var typeArguments) {}''',
+  'checkMalformedType': 'checkMalformedType(value, message) {}',
+  'Closure': 'abstract class Closure implements Function { }',
+  'closureFromTearOff':
+      r'''closureFromTearOff(receiver, functions, reflectionInfo,
+                             isStatic, jsArguments, name) {}''',
+  'computeSignature':
+      'computeSignature(var signature, var context, var contextName) {}',
+  'ConstantMap': 'class ConstantMap {}',
+  'ConstantProtoMap': 'class ConstantProtoMap {}',
+  'ConstantStringMap': 'class ConstantStringMap {}',
+  'copyTypeArguments': 'copyTypeArguments(source, target) {}',
+  'createInvocationMirror': 'createInvocationMirror(a0, a1, a2, a3, a4, a5) {}',
+  'createRuntimeType': 'createRuntimeType(a) {}',
+  'doubleTypeCast': 'doubleTypeCast(value) {}',
+  'doubleTypeCheck': 'doubleTypeCheck(value) {}',
+  'functionSubtypeCast':
+      r'''functionSubtypeCast(Object object, String signatureName,
+                              String contextName, var context) {}''',
+  'functionTypeTestMetaHelper': r'''
+      functionTypeTestMetaHelper() {
+        buildFunctionType(null, null, null);
+        buildNamedFunctionType(null, null, null);
+        buildInterfaceType(null, null);
+      }''',
+  'getFallThroughError': 'getFallThroughError() {}',
+  'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
+  'getRuntimeTypeArgument':
+      'getRuntimeTypeArgument(target, substitutionName, index) {}',
+  'getRuntimeTypeArguments':
+      'getRuntimeTypeArguments(target, substitutionName) {}',
+  'getRuntimeTypeInfo': 'getRuntimeTypeInfo(a) {}',
+  'getTraceFromException': 'getTraceFromException(exception) {}',
+  'getTypeArgumentByIndex': 'getTypeArgumentByIndex(target, index) {}',
+  'GeneralConstantMap': 'class GeneralConstantMap {}',
+  'iae': 'iae(x) { throw x; } ioore(x) { throw x; }',
+  'interceptedTypeCast': 'interceptedTypeCast(value, property) {}',
+  'interceptedTypeCheck': 'interceptedTypeCheck(value, property) {}',
+  'intTypeCast': 'intTypeCast(value) {}',
+  'intTypeCheck': 'intTypeCheck(value) {}',
+  'IrRepresentation': 'class IrRepresentation {}',
+  'isJsIndexable': 'isJsIndexable(a, b) {}',
+  'JavaScriptIndexingBehavior': 'abstract class JavaScriptIndexingBehavior {}',
+  'JSInvocationMirror': 'class JSInvocationMirror {}',
+  'listSuperNativeTypeCast': 'listSuperNativeTypeCast(value) {}',
+  'listSuperNativeTypeCheck': 'listSuperNativeTypeCheck(value) {}',
+  'listSuperTypeCast': 'listSuperTypeCast(value) {}',
+  'listSuperTypeCheck': 'listSuperTypeCheck(value) {}',
+  'listTypeCast': 'listTypeCast(value) {}',
+  'listTypeCheck': 'listTypeCheck(value) {}',
+  'makeLiteralMap': 'makeLiteralMap(List keyValuePairs) {}',
+  'NoInline': 'class NoInline {}',
+  'NoSideEffects': 'class NoSideEffects {}',
+  'NoThrows': 'class NoThrows {}',
+  'numberOrStringSuperNativeTypeCast':
+      'numberOrStringSuperNativeTypeCast(value) {}',
+  'numberOrStringSuperNativeTypeCheck':
+      'numberOrStringSuperNativeTypeCheck(value) {}',
+  'numberOrStringSuperTypeCast': 'numberOrStringSuperTypeCast(value) {}',
+  'numberOrStringSuperTypeCheck': 'numberOrStringSuperTypeCheck(value) {}',
+  'numTypeCast': 'numTypeCast(value) {}',
+  'numTypeCheck': 'numTypeCheck(value) {}',
+  'patch': 'const patch = 0;',
+  'propertyTypeCast': 'propertyTypeCast(x) {}',
+  'propertyTypeCheck': 'propertyTypeCheck(value, property) {}',
+  'requiresPreamble': 'requiresPreamble() {}',
+  'RuntimeFunctionType': 'class RuntimeFunctionType {}',
+  'RuntimeTypePlain': 'class RuntimeTypePlain {}',
+  'runtimeTypeToString': 'runtimeTypeToString(type, {onTypeVariable(i)}) {}',
+  'S': 'S() {}',
+  'setRuntimeTypeInfo': 'setRuntimeTypeInfo(a, b) {}',
+  'stringSuperNativeTypeCast': 'stringSuperNativeTypeCast(value) {}',
+  'stringSuperNativeTypeCheck': 'stringSuperNativeTypeCheck(value) {}',
+  'stringSuperTypeCast': 'stringSuperTypeCast(value) {}',
+  'stringSuperTypeCheck': 'stringSuperTypeCheck(value) {}',
+  'stringTypeCast': 'stringTypeCast(x) {}',
+  'stringTypeCheck': 'stringTypeCheck(x) {}',
+  'subtypeCast': 'subtypeCast(object, isField, checks, asField) {}',
+  'subtypeOfRuntimeTypeCast': 'subtypeOfRuntimeTypeCast(object, type) {}',
+  'throwAbstractClassInstantiationError':
+      'throwAbstractClassInstantiationError(className) {}',
+  'throwCyclicInit': 'throwCyclicInit() {}',
+  'throwExpression': 'throwExpression(e) {}',
+  'throwNoSuchMethod':
+      'throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {}',
+  'throwRuntimeError': 'throwRuntimeError(message) {}',
+  'throwTypeError': 'throwTypeError(message) {}',
+  'TypeImpl': 'class TypeImpl {}',
+  'TypeVariable': 'class TypeVariable {}',
+  'unwrapException': 'unwrapException(e) {}',
+  'voidTypeCheck': 'voidTypeCheck(value) {}',
+  'wrapException': 'wrapException(x) { return x; }',
+  'badMain': 'badMain() { throw "bad main"; }',
+  'missingMain': 'missingMain() { throw "missing main"; }',
+  'mainHasTooManyParameters':
+      'mainHasTooManyParameters() '
+      '{ throw "main has too many parameters"; }',
+};
+
+const Map<String, String> DEFAULT_FOREIGN_HELPER_LIBRARY
+    = const <String, String>{
+  'JS': r'''
+      dynamic JS(String typeDescription, String codeTemplate,
+        [var arg0, var arg1, var arg2, var arg3, var arg4, var arg5, var arg6,
+         var arg7, var arg8, var arg9, var arg10, var arg11]) {}''',
+};
+
+const Map<String, String> DEFAULT_INTERCEPTORS_LIBRARY = const <String, String>{
+  'findIndexForNativeSubclassType':
+      'findIndexForNativeSubclassType(type) {}',
+  'getDispatchProperty': 'getDispatchProperty(o) {}',
+  'getInterceptor': 'getInterceptor(x) {}',
+  'getNativeInterceptor': 'getNativeInterceptor(x) {}',
+  'initializeDispatchProperty': 'initializeDispatchProperty(f,p,i) {}',
+  'initializeDispatchPropertyCSP': 'initializeDispatchPropertyCSP(f,p,i) {}',
+  'interceptedNames': 'var interceptedNames;',
+  'Interceptor': r'''
+      class Interceptor {
+        toString() {}
+        bool operator==(other) => identical(this, other);
+        get hashCode => throw "Interceptor.hashCode not implemented.";
+        noSuchMethod(im) { throw im; }
+      }''',
+  'JSArray': r'''
+          class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
+            JSArray();
+            factory JSArray.typed(a) => a;
+            var length;
+            operator[](index) => this[index];
+            operator[]=(index, value) { this[index] = value; }
+            add(value) { this[length + 1] = value; }
+            insert(index, value) {}
+            E get first => this[0];
+            E get last => this[0];
+            E get single => this[0];
+            E removeLast() => this[0];
+            E removeAt(index) => this[0];
+            E elementAt(index) => this[0];
+            E singleWhere(f) => this[0];
+          }''',
+  'JSBool': 'class JSBool extends Interceptor implements bool {}',
+  'JSDouble': 'class JSDouble extends JSNumber implements double {}',
+  'JSExtendableArray': 'class JSExtendableArray extends JSMutableArray {}',
+  'JSFixedArray': 'class JSFixedArray extends JSMutableArray {}',
+  'JSFunction':
+      'abstract class JSFunction extends Interceptor implements Function {}',
+  'JSIndexable': r'''
+      abstract class JSIndexable {
+        get length;
+        operator[](index);
+      }''',
+  'JSInt': r'''
+       class JSInt extends JSNumber implements int {
+         operator~() => this;
+       }''',
+  'JSMutableArray':
+      'class JSMutableArray extends JSArray implements JSMutableIndexable {}',
+  'JSMutableIndexable':
+      'abstract class JSMutableIndexable extends JSIndexable {}',
+      'JSPositiveInt': 'class JSPositiveInt extends JSInt {}',
+  'JSNull': r'''
+      class JSNull extends Interceptor {
+        bool operator==(other) => identical(null, other);
+        get hashCode => throw "JSNull.hashCode not implemented.";
+        String toString() => 'Null';
+        Type get runtimeType => null;
+        noSuchMethod(x) => super.noSuchMethod(x);
+      }''',
+  'JSNumber': r'''
+      class JSNumber extends Interceptor implements num {
+        // All these methods return a number to please type inferencing.
+        operator-() => (this is JSInt) ? 42 : 42.2;
+        operator +(other) => (this is JSInt) ? 42 : 42.2;
+        operator -(other) => (this is JSInt) ? 42 : 42.2;
+        operator ~/(other) => _tdivFast(other);
+        operator /(other) => (this is JSInt) ? 42 : 42.2;
+        operator *(other) => (this is JSInt) ? 42 : 42.2;
+        operator %(other) => (this is JSInt) ? 42 : 42.2;
+        operator <<(other) => _shlPositive(other);
+        operator >>(other) {
+          return _shrBothPositive(other) + _shrReceiverPositive(other) +
+            _shrOtherPositive(other);
+        }
+        operator |(other) => 42;
+        operator &(other) => 42;
+        operator ^(other) => 42;
+    
+        operator >(other) => true;
+        operator >=(other) => true;
+        operator <(other) => true;
+        operator <=(other) => true;
+        operator ==(other) => true;
+        get hashCode => throw "JSNumber.hashCode not implemented.";
+    
+        // We force side effects on _tdivFast to mimic the shortcomings of
+        // the effect analysis: because the `_tdivFast` implementation of
+        // the core library has calls that may not already be analyzed,
+        // the analysis will conclude that `_tdivFast` may have side
+        // effects.
+        _tdivFast(other) => new List()..length = 42;
+        _shlPositive(other) => 42;
+        _shrBothPositive(other) => 42;
+        _shrReceiverPositive(other) => 42;
+        _shrOtherPositive(other) => 42;
+    
+        abs() => (this is JSInt) ? 42 : 42.2;
+        remainder(other) => (this is JSInt) ? 42 : 42.2;
+        truncate() => 42;
+      }''',
+  'JSString': r'''
+      class JSString extends Interceptor implements String, JSIndexable {
+        var split;
+        var length;
+        operator[](index) {}
+        toString() {}
+        operator+(other) => this;
+      }''',
+  'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
+  'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
+  'mapTypeToInterceptor': 'var mapTypeToInterceptor;',
+  'ObjectInterceptor': 'class ObjectInterceptor {}',
+  'PlainJavaScriptObject': 'class PlainJavaScriptObject {}',
+  'UnknownJavaScriptObject': 'class UnknownJavaScriptObject {}',
+};
+
+const Map<String, String> DEFAULT_ISOLATE_HELPER_LIBRARY =
+    const <String, String>{
+  'startRootIsolate': 'var startRootIsolate;',
+  '_currentIsolate': 'var _currentIsolate;',
+  '_callInIsolate': 'var _callInIsolate;',
+  '_WorkerBase': 'class _WorkerBase {}',
+};
+
+const Map<String, String> DEFAULT_MIRRORS_LIBRARY = const <String, String>{
+  'Comment': 'class Comment {}',
+  'MirrorSystem': 'class MirrorSystem {}',
+  'MirrorsUsed': 'class MirrorsUsed {}',
+};
+
diff --git a/tests/compiler/dart2js_native/lru_test.dart b/tests/compiler/dart2js_native/lru_test.dart
new file mode 100644
index 0000000..f5c5200
--- /dev/null
+++ b/tests/compiler/dart2js_native/lru_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, 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:_internal" show LRUMap;
+import "../../lib/mirrors/lru_expect.dart";
+
+main() {
+  expect((shift) => new LRUMap.withShift(shift));
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index ad6a75a..c9d4411 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -28,20 +28,6 @@
 string_from_environment_default_value: Skip
 string_from_environment_test: Skip
 
-[ $compiler == dart2analyzer]
-bool_from_environment2_test/01: Fail # Issue 18755
-bool_from_environment2_test/02: Fail # Issue 18755
-bool_from_environment2_test/03: Fail # Issue 18755
-bool_from_environment2_test/04: Fail # Issue 18755
-int_from_environment3_test/01: Fail # Issue 18755
-int_from_environment3_test/02: Fail # Issue 18755
-int_from_environment3_test/03: Fail # Issue 18755
-int_from_environment3_test/04: Fail # Issue 18755
-string_from_environment3_test/01: Fail # Issue 18755
-string_from_environment3_test/02: Fail # Issue 18755
-string_from_environment3_test/03: Fail # Issue 18755
-string_from_environment3_test/04: Fail # Issue 18755
-
 [ $compiler == none ]
 unicode_test: Fail        # Bug 6706
 compare_to2_test: Fail    # Bug 4018
@@ -126,17 +112,11 @@
 int_parse_radix_test: Fail, OK # Test contains errors but doesn’t mark them as expected
 list_insert_test: Fail, OK # Test contains errors but doesn’t mark them as expected
 list_removeat_test: Fail, OK # Test contains errors but doesn’t mark them as expected
-symbol_test/01: Fail, OK # Test Issue 13730; It is static type warning if "const" instance creation argument type is not compatible with parameter type
-symbol_test/02: Fail # Issue 18755
-symbol_test/03: Fail # Issue 18755
 
 [ $compiler == dart2analyzer ]
-symbol_test/02: Fail
-symbol_test/03: Fail
 int_parse_radix_test: fail
 list_insert_test: fail
 list_removeat_test: fail
-symbol_test/01: fail # test issue 13730; It is static type warning if "const" instance creation argument type is not compatible with parameter type
 
 [ $arch == simmips ]
 int_parse_radix_test: Skip # Timeout
diff --git a/tests/corelib/format_exception_test.dart b/tests/corelib/format_exception_test.dart
new file mode 100644
index 0000000..f17bcdc
--- /dev/null
+++ b/tests/corelib/format_exception_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2011, 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 format_exception_test;
+import "package:expect/expect.dart";
+
+test(exn, message, source, position, toString) {
+  Expect.equals(message, exn.message);
+  Expect.equals(source, exn.source);
+  Expect.equals(position, exn.position);
+  Expect.equals(toString, exn.toString());
+}
+
+main() {
+  var e;
+  e = new FormatException();
+  test(e, "", null, null, "FormatException");
+  e = new FormatException("");
+  test(e, "", null, null, "FormatException");
+  e = new FormatException(null);
+  test(e, null, null, null, "FormatException");
+
+  e = new FormatException("message");
+  test(e, "message", null, null, "FormatException: message");
+
+  e = new FormatException("message", "source");
+  test(e, "message", "source", null, "FormatException: message\nsource");
+
+  e = new FormatException("message", "source" * 25);
+  test(e, "message", "source" * 25, null, "FormatException: message\n" +
+                                          "source" * 12 + "sou...");
+  e = new FormatException("message", "source" * 25);
+  test(e, "message", "source" * 25, null, "FormatException: message\n" +
+                                          "source" * 12 + "sou...");
+  e = new FormatException("message", "s1\nsource\ns2");
+  test(e, "message", "s1\nsource\ns2", null, "FormatException: message\n" +
+                                             "s1\nsource\ns2");
+
+  var o = new Object();
+  e = new FormatException("message", o, 10);
+  test(e, "message", o, 10, "FormatException: message (at position 10)");
+
+  e = new FormatException("message", "source", 3);
+  test(e, "message", "source", 3,
+       "FormatException: message (at character 4)\nsource\n   ^\n");
+
+  e = new FormatException("message", "s1\nsource\ns2", 6);
+  test(e, "message", "s1\nsource\ns2", 6,
+       "FormatException: message (at line 2, character 4)\nsource\n   ^\n");
+
+  var longline = "watermelon cantaloupe " * 8 + "watermelon";  // Length > 160.
+  var longsource = (longline + "\n") * 25;
+  var line10 = (longline.length + 1) * 9;
+  e = new FormatException("message", longsource, line10);
+  test(e, "message", longsource, line10,
+       "FormatException: message (at line 10, character 1)\n"
+       "${longline.substring(0, 75)}...\n^\n");
+
+  e = new FormatException("message", longsource, line10 - 1);
+  test(e, "message", longsource, line10 - 1,
+       "FormatException: message (at line 9, "
+       "character ${longline.length + 1})\n"
+       "...${longline.substring(longline.length - 75)}\n"
+       "${' ' * 78}^\n");
+
+  var half = longline.length ~/ 2;
+  e = new FormatException("message", longsource, line10 + half);
+  test(e, "message", longsource, line10 + half,
+       "FormatException: message (at line 10, character ${half + 1})\n"
+       "...${longline.substring(half - 36, half + 36)}...\n"
+       "${' ' * 39}^\n");
+}
diff --git a/tests/html/audiocontext_test.dart b/tests/html/audiocontext_test.dart
index 948f543..318332b 100644
--- a/tests/html/audiocontext_test.dart
+++ b/tests/html/audiocontext_test.dart
@@ -76,17 +76,20 @@
 
         oscillator.type = 'sine';
         expect(oscillator.type, equals('sine'));
-   
+
         oscillator.type = 'square';
         expect(oscillator.type, equals('square'));
-   
+
         oscillator.type = 'triangle';
         expect(oscillator.type, equals('triangle'));
 
-        expect(() => oscillator.type = 7, throws);
+        //expect(() => oscillator.type = 7, throws); Firefox does not throw, it
+        //simply ignores this value.
         expect(oscillator.type, equals('triangle'));
 
-        expect(() => oscillator.type = ['heap object not a string'], throws);
+        // Firefox does not throw when it receives invalid values; it simply
+        // ignores them.
+        //expect(() => oscillator.type = ['heap object not a string'], throws);
         expect(oscillator.type, equals('triangle'));
       }
     });
diff --git a/tests/html/html.status b/tests/html/html.status
index 4b539f5..1036688 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -8,8 +8,6 @@
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
-blob_constructor_test: Fail # Issue 19500
-transferables_test: Fail # Issue 19500
 indexeddb_1_test/functional: Skip # Issue 19512 (timing out)
 xhr_test/xhr: RuntimeError # Issue 18049
 form_data_test/functional: Skip # Issue 19726
@@ -22,12 +20,9 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie || $runtime == chrome) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
 
-[ $compiler == dart2js && $runtime == chrome ]
-custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
 audiobuffersourcenode_test: Pass, Fail, Crash # http://crbug.com/256601
 
@@ -124,8 +119,6 @@
 worker_test/functional: Fail # IE uses incorrect security context for Blob URIs.
 
 [$runtime == ie10 ]
-custom/entered_left_view_test: Skip # Issue 13551 - IE is timing out
-
 # IE10 Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
 audiobuffersourcenode_test/supported: Fail
@@ -324,10 +317,9 @@
 xsltprocessor_test/supported: Fail
 
 [ $compiler == dart2js && $runtime == drt && $unchecked ]
-audiocontext_test/functional: Fail
+audiocontext_test/functional: Pass, Fail
 
 [ $runtime == safari || $runtime == safarimobilesim ]
-worker_test: Skip # Issue 13221
 worker_api_test: Skip # Issue 13221
 webgl_1_test: Pass, Fail # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
@@ -400,18 +392,13 @@
 websql_test/supported: Fail
 
 [ $runtime == ff ]
-client_rect_test: Fail # Issue 16890
-
-[ $runtime == ff ]
 xhr_test/xhr: Pass, Fail # Issue 11602
 dart_object_local_storage_test: Skip  # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 webgl_1_test: Pass, Fail   # Issue 8219
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Firefox does not like dataUrl videos for drawImage
 
-# FireFox Feature support statuses-
+# Firefox Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
-audiobuffersourcenode_test: Pass, Fail # Issue 14602
-audiocontext_test: Pass, Fail # Issue 14602
 css_test/supportsPointConversions: Fail
 document_test/supports_cssCanvasContext: Fail
 element_types_test/supported_details: Fail
@@ -460,7 +447,6 @@
 element_offset_test/offset: Pass, Fail # Issue 13719, 13296
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-audiocontext_test: StaticWarning
 custom/document_register_basic_test: StaticWarning
 custom/element_upgrade_test: StaticWarning
 datalistelement_test: StaticWarning
diff --git a/tests/language/deferred_in_isolate_app.dart b/tests/language/deferred_in_isolate_app.dart
new file mode 100644
index 0000000..3c1f9dc
--- /dev/null
+++ b/tests/language/deferred_in_isolate_app.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2014, 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 'deferred_in_isolate_lib.dart' deferred as test;
+
+void main(args, msg) {
+  assert(args != null);
+  assert(args.length == 1);
+  assert(msg != null);
+  assert(msg.length == 1);
+
+  var expectedMsg = args[0];
+  var replyPort = msg[0];
+
+  try {
+    print("BeforeLibraryLoading");
+
+    test.loadLibrary().then((_) {
+      var obj = new test.DeferredObj(expectedMsg);
+      replyPort.send(obj.toString());
+    }).catchError((error) {
+      replyPort.send("Error from isolate:\n$error");
+    });
+  } catch (exception, stacktrace) {
+    replyPort.send("Exception from isolate:\n$exception\n$stacktrace");
+  }
+}
diff --git a/tests/language/deferred_in_isolate_lib.dart b/tests/language/deferred_in_isolate_lib.dart
new file mode 100644
index 0000000..30c66a5
--- /dev/null
+++ b/tests/language/deferred_in_isolate_lib.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, 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 deferred_in_isolate_lib;
+
+class DeferredObj {
+  DeferredObj(this._val);
+  toString() => "$_val";
+    
+  var _val;
+}
diff --git a/tests/language/deferred_in_isolate_test.dart b/tests/language/deferred_in_isolate_test.dart
new file mode 100644
index 0000000..e903d62
--- /dev/null
+++ b/tests/language/deferred_in_isolate_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, 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.
+
+// Test that deferred libraries are supported from isolates other than the root
+// isolate.
+
+import 'dart:isolate';
+
+main() {
+  try {
+    var receivePort = new RawReceivePort();
+    var expectedMsg = "Deferred Loaded.";
+
+    receivePort.handler = (msg) {
+      if (msg != expectedMsg) {
+        print("Test failed.");
+        throw msg;  // Fail the test if the message is not expected.
+      }
+      print('Test done.');
+      receivePort.close();
+    };
+
+    var stopwatch = new Stopwatch()..start();
+    Isolate.spawnUri(new Uri(path: 'deferred_in_isolate_app.dart'),
+                             [expectedMsg],
+                             [receivePort.sendPort]).then((isolate) {
+      print('Isolate spawn: ${stopwatch.elapsedMilliseconds}ms');
+    }).catchError((error) {
+      print(error);
+    });
+  } catch (exception, stackTrace) {
+    print('Test failed.');
+    print(exception);
+    print(stackTrace);
+    rethrow;
+  }
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index 49f6fb1..2d031678 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -31,6 +31,7 @@
 deferred_constraints_constants_old_syntax_test/constructor1: Fail, Ok
 deferred_constraints_constants_old_syntax_test/constructor2: Fail, Ok
 
+
 [ $compiler == dart2dart]
 deferred_load_library_wrong_args_test/none: Fail # Issue 17523
 deferred_load_inval_code_test: Fail # Issue 17523
@@ -85,10 +86,7 @@
 # problems in compile time constants.
 type_check_const_function_typedef2_test/00: Fail, OK
 
-[ $compiler == none && $runtime != none ]
-dynamic_prefix_core_test/01: RuntimeError # Issue 12478
-
-[ $compiler == dart2dart && $runtime != none && $builder_tag != new_backend ]
+[ $compiler == none ]
 dynamic_prefix_core_test/01: RuntimeError # Issue 12478
 
 [ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium|| $runtime == ContentShellOnAndroid) ]
@@ -118,6 +116,12 @@
 issue13474_test: Pass, Fail # Issue 14651.
 typed_message_test: Crash, Fail # Issue 13921, 14400
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
+main_test/01: Fail # http://dartbug.com/20028
+main_test/02: Fail # http://dartbug.com/20028
+main_test/04: Fail # http://dartbug.com/20028
+main_test/05: Fail # http://dartbug.com/20028
+main_test/21: Fail # http://dartbug.com/20028
+main_test/42: Fail # http://dartbug.com/20028
 
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 4c9dad1..2128e12 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -454,3 +454,13 @@
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
 redirecting_factory_long_test: StaticWarning
+
+# This test uses "const Symbol('_setAt')"
+vm/reflect_core_vm_test: CompileTimeError
+
+# This test is expected to have warnings because of noSuchMethod overriding.
+regress_12561_test: StaticWarning
+
+main_not_a_function_test/01: Fail # http://dartbug.com/20030
+main_test/03: Fail # http://dartbug.com/20030
+no_main_test/01: Fail # http://dartbug.com/20030
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index ca4a746..722fd39c 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -454,3 +454,13 @@
 generic_closure_test: StaticWarning
 local_function2_test: StaticWarning
 redirecting_factory_long_test: StaticWarning
+
+# This test uses "const Symbol('_setAt')"
+vm/reflect_core_vm_test: CompileTimeError
+
+# This test is expected to have warnings because of noSuchMethod overriding.
+regress_12561_test: StaticWarning
+
+main_not_a_function_test/01: Fail # http://dartbug.com/20030
+main_test/03: Fail # http://dartbug.com/20030
+no_main_test/01: Fail # http://dartbug.com/20030
diff --git a/tests/language/main_not_a_function_test.dart b/tests/language/main_not_a_function_test.dart
new file mode 100644
index 0000000..e2eec96
--- /dev/null
+++ b/tests/language/main_not_a_function_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2014, 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.
+
+/* /// 01: static type warning, runtime error
+main() {}
+*/ /// 01: continued
+
+var main; /// 01: continued
diff --git a/tests/language/main_test.dart b/tests/language/main_test.dart
new file mode 100644
index 0000000..719ba81
--- /dev/null
+++ b/tests/language/main_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2014, 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.
+
+main(
+
+a         /// 01: ok
+a, b      /// 02: ok
+a, b, c   /// 03: static type warning, runtime error
+a, b, {c} /// 04: ok
+a, b, [c] /// 05: ok
+
+[a]       /// 20: ok
+a, [b]    /// 21: ok
+[a, b]    /// 22: ok
+
+{a}       /// 41: ok
+a, {b}    /// 42: ok
+{a, b}    /// 43: ok
+[a, b, c] /// 44: ok
+{a, b, c} /// 45: ok
+
+) {
+}
diff --git a/tests/language/no_main_test.dart b/tests/language/no_main_test.dart
new file mode 100644
index 0000000..24e5b37
--- /dev/null
+++ b/tests/language/no_main_test.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, 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.
+
+/* /// 01: static type warning, runtime error
+main() {}
+*/ /// 01: continued
diff --git a/tests/language/regress_12561_test.dart b/tests/language/regress_12561_test.dart
new file mode 100644
index 0000000..21acb0e
--- /dev/null
+++ b/tests/language/regress_12561_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2014, 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:expect/expect.dart";
+
+class C {
+  noSuchMethod(int x, int y) => x + y;
+}
+
+main() {
+  Expect.throws(() => new C().foo, (e) => e is Error);
+}
+
+
diff --git a/tests/language/vm/uint32_add_test.dart b/tests/language/vm/uint32_add_test.dart
new file mode 100644
index 0000000..46723be
--- /dev/null
+++ b/tests/language/vm/uint32_add_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, 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.
+// VMOptions=--optimization_counter_threshold=10
+
+import 'package:expect/expect.dart';
+
+trunc(x) => x & 0xFFFFFFFF;
+
+f(t, x) => t(x) + 1;
+
+g(t, x) => t(x + 1);
+
+// Foo should be entirely replaced by Uint32 operations. Running with
+// --trace-integer-ir-selection should result in:
+//    CheckStackOverflow:4()
+//    v22 <- UnboxUint32:14(v2)
+//    v24 <- UnboxUint32:14(v3)
+//    v6 <- BinaryUint32Op:14(+, v22 , v24 )
+//    v26 <- UnboxUint32:22(v4)
+//    v8 <- BinaryUint32Op:22(+, v6 , v26 )
+//    v28 <- UnboxUint32:30(v5)
+//    v10 <- BinaryUint32Op:30(+, v8 , v28 )
+//    v30 <- UnboxUint32:14(v21)
+//    v19 <- BinaryUint32Op:14(&, v10 , v30 )
+//    v32 <- BoxUint32:90(v19 )
+//    Return:38(v32 )
+foo(a, b, c, i) {
+  return trunc(a + b + c + i);
+}
+
+main() {
+  for (var i = 0; i < 20000; i++) {
+    Expect.equals(0x100000000, f(trunc, 0xFFFFFFFF));
+    Expect.equals(0x0, g(trunc, 0xFFFFFFFF));
+  }
+
+  var a = 0xFFFFFFFF;
+  var b = 0xCCCCCCCC;
+  var c = 0x33333335;
+
+  for (var i = 0; i < 20000; i++) {
+    Expect.equals(i, foo(a, b, c, i));
+  }
+}
+
diff --git a/tests/language/vm/uint32_right_shift_test.dart b/tests/language/vm/uint32_right_shift_test.dart
new file mode 100644
index 0000000..6c7ae5f
--- /dev/null
+++ b/tests/language/vm/uint32_right_shift_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, 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.
+// VMOptions=--optimization_counter_threshold=10
+
+import 'package:expect/expect.dart';
+
+trunc(x) => x & 0xFFFFFFFF;
+
+foo(t, x) => t(x >> 15);
+
+main() {
+  for (var i = 0; i < 20000; i++) {
+    Expect.equals(0x00010000, foo(trunc, 0x80000000));
+  }
+  for (var i = 0; i < 20000; i++) {
+    Expect.equals(0x10000000, foo(trunc, 0x80000000000));
+  }
+}
+
diff --git a/tests/language/vm/uint32_shift_test.dart b/tests/language/vm/uint32_shift_test.dart
new file mode 100644
index 0000000..fa8cb38
--- /dev/null
+++ b/tests/language/vm/uint32_shift_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, 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.
+// VMOptions=--optimization_counter_threshold=10
+
+import 'package:expect/expect.dart';
+
+class Good {
+  use(x) { return x & 0x1; }
+}
+
+class Bad {
+  use(x) { return x & 0x100000000; }
+}
+
+f(o, x) => o.use(x << 1);
+
+main() {
+  final good = new Good();
+  final bad = new Bad();
+  for (var i = 0; i < 20000; i++) {
+    Expect.equals(0, f(good, 0x80000000));
+  }
+  Expect.equals(0x100000000, f(bad, 0x80000000));
+}
+
diff --git a/tests/lib/convert/json_test.dart b/tests/lib/convert/json_test.dart
index 4470535..0cf3048 100644
--- a/tests/lib/convert/json_test.dart
+++ b/tests/lib/convert/json_test.dart
@@ -10,7 +10,6 @@
 bool badFormat(e) => e is FormatException;
 
 void testJson(json, expected) {
-  var value = JSON.decode(json);
   compare(expected, actual, path) {
     if (expected is List) {
       Expect.isTrue(actual is List);
@@ -34,7 +33,17 @@
       Expect.equals(expected, actual, path);
     }
   }
-  compare(expected, value, "value");
+  for (var reviver in [null, (k, v) => v]) {
+    var name = (reviver == null) ? "" : "reviver:";
+    var value = JSON.decode(json, reviver: reviver);
+    compare(expected, value, "$name$value");
+    value = JSON.decode(" $json ", reviver: reviver);
+    compare(expected, value, "$name-$value-");
+    value = JSON.decode("[$json]", reviver: reviver);
+    compare([expected], value, "$name[$value]");
+    value = JSON.decode('{"x":$json}', reviver: reviver);
+    compare({"x":expected}, value, "$name{x:$value}");
+  }
 }
 
 String escape(String s) {
@@ -73,10 +82,7 @@
       for (var fraction in fractionList) {
         for (var exp in exponentList) {
           var literal = "$sign$integer$fraction$exp";
-          var parseNumber =
-              ((fraction == "" && exp == "") ? (String x) => int.parse(x)
-                                             : (String x) => double.parse(x));
-          var expectedValue = parseNumber(literal);
+          var expectedValue = num.parse(literal);
           testJson(literal, expectedValue);
         }
       }
@@ -152,11 +158,23 @@
   // Empty string.
   testJson(r'""', "");
   // Escape first.
-  testJson(r'"\"........"', "\"........");
-  // Escape last.
-  testJson(r'"........\""', "........\"");
-  // Escape middle.
-  testJson(r'"....\"...."', "....\"....");
+  var escapes = {
+    "f": "\f",
+    "b": "\b",
+    "n": "\n",
+    "r": "\r",
+    "t": "\t",
+    r"\": r"\",
+    '"': '"',
+    "/": "/",
+  };
+  escapes.forEach((esc, lit) {
+    testJson('"\\$esc........"', "$lit........");
+    // Escape last.
+    testJson('"........\\$esc"', "........$lit");
+    // Escape middle.
+    testJson('"....\\$esc...."', "....$lit....");
+  });
 
   // Does not accept single quotes.
   testThrows(r"''");
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 65a9d58..ff99e8d 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -69,6 +69,8 @@
 mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
 mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
+mirrors/local_function_is_static_test: RuntimeError # Issue 6335
+mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/10: MissingCompileTimeError # Issue 14548
@@ -115,7 +117,9 @@
 typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/int32x4_test: Fail # Safari has an optimization bug (nightlies are already fine).
 mirrors/null_test: Fail # http://dartbug.com/16831
+convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
@@ -282,7 +286,7 @@
 # Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 async/deferred/deferred_in_isolate_test: Fail
 
-[ $compiler == dart2js && $runtime != d8 ]
+[ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10 || $runtime == jsshell) ]
 async/schedule_microtask_test: Fail # Issue 9002
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
@@ -314,3 +318,9 @@
 [ $arch == simarm ]
 convert/chunked_conversion_utf88_test: Skip  # Pass, Slow Issue 12644.
 convert/utf85_test: Skip  # Pass, Slow Issue 12644.
+
+# These tests use "const Symbol('void')".
+[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
+mirrors/basic_types_in_dart_core_test: CompileTimeError
+mirrors/function_type_mirror_test: CompileTimeError
+mirrors/method_mirror_returntype_test: CompileTimeError
diff --git a/tests/lib/mirrors/library_uri_package_test.dart b/tests/lib/mirrors/library_uri_package_test.dart
index 30fcd96..6c8effc 100644
--- a/tests/lib/mirrors/library_uri_package_test.dart
+++ b/tests/lib/mirrors/library_uri_package_test.dart
@@ -20,6 +20,7 @@
 main() {
   var mirrors = currentMirrorSystem();
   test("Test package library uri", () {
-    testLibraryUri(new ArgParser(), Uri.parse('package:args/args.dart'));
+    testLibraryUri(new ArgParser(),
+        Uri.parse('package:args/src/arg_parser.dart'));
   });
 }
diff --git a/tests/lib/mirrors/local_function_is_static_test.dart b/tests/lib/mirrors/local_function_is_static_test.dart
new file mode 100644
index 0000000..a719c49
--- /dev/null
+++ b/tests/lib/mirrors/local_function_is_static_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, 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.local_function_is_static;
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+topLevel() => 1;
+topLevelLocal() => () => 2;
+class C {
+  static klass() => 3;
+  static klassLocal() => () => 4;
+  instance() => 5;
+  instanceLocal() => () => 6;
+}
+
+main() {
+  var f = topLevel;
+  Expect.equals(1, f());
+  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);
+
+  f = topLevelLocal();
+  Expect.equals(2, f());
+  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);
+
+  f = C.klass;
+  Expect.equals(3, f());
+  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);
+
+  f = C.klassLocal();
+  Expect.equals(4, f());
+  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);
+
+  f = new C().instance;
+  Expect.equals(5, f());
+  Expect.isFalse((reflect(f) as ClosureMirror).function.isStatic);
+
+  f = new C().instanceLocal();
+  Expect.equals(6, f());
+  Expect.isFalse((reflect(f) as ClosureMirror).function.isStatic);
+}
\ No newline at end of file
diff --git a/tests/lib/mirrors/lru_expect.dart b/tests/lib/mirrors/lru_expect.dart
new file mode 100644
index 0000000..a048fcb
--- /dev/null
+++ b/tests/lib/mirrors/lru_expect.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, 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:expect/expect.dart";
+
+expect(lruMapFactory) {
+  Expect.throws(() => lruMapFactory(0), (e) => e is Exception);
+
+  for (int shift = 1; shift < 5; shift++) {
+    var map = lruMapFactory(shift);
+    var capacity = (1 << shift) * 3 ~/ 4;
+    for (int value = 0; value < 100; value++) {
+      var key = "$value";
+      map[key] = value;
+      Expect.equals(value, map[key]);
+    }
+    for (int value = 0; value < 100 - capacity - 1; value++) {
+      var key = "$value";
+      Expect.equals(null, map[key]);
+    }
+    for (int value = 100 - capacity; value < 100; value++) {
+      var key = "$value";
+      Expect.equals(value, map[key]);
+    }
+  }
+}
diff --git a/tests/lib/mirrors/lru_test.dart b/tests/lib/mirrors/lru_test.dart
new file mode 100644
index 0000000..1a0c8fd
--- /dev/null
+++ b/tests/lib/mirrors/lru_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, 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:mirrors";
+import "lru_expect.dart";
+
+newLRUMapWithShift(int shift) {
+  var lib = currentMirrorSystem().libraries[Uri.parse("dart:_internal")];
+  var cls = lib.declarations[#LRUMap];
+  return cls.newInstance(#withShift, [shift]).reflectee;
+}
+
+main() {
+  expect(newLRUMapWithShift);
+}
diff --git a/tests/lib/mirrors/method_mirror_properties_test.dart b/tests/lib/mirrors/method_mirror_properties_test.dart
index 9b44145..4d45a31 100644
--- a/tests/lib/mirrors/method_mirror_properties_test.dart
+++ b/tests/lib/mirrors/method_mirror_properties_test.dart
@@ -35,11 +35,11 @@
 }
 
 checkKinds(method, kinds) {
-  Expect.equals(method.isStatic, kinds[0]);
-  Expect.equals(method.isAbstract, kinds[1]);
-  Expect.equals(method.isGetter, kinds[2]);
-  Expect.equals(method.isSetter, kinds[3]);
-  Expect.equals(method.isConstructor, kinds[4]);
+  Expect.equals(kinds[0], method.isStatic, "isStatic");
+  Expect.equals(kinds[1], method.isAbstract, "isAbstract");
+  Expect.equals(kinds[2], method.isGetter, "isGetter");
+  Expect.equals(kinds[3], method.isSetter, "isSetter");
+  Expect.equals(kinds[4], method.isConstructor, "isConstructor");
 }
 
 main() {
diff --git a/tests/lib/mirrors/removed_api_test.dart b/tests/lib/mirrors/removed_api_test.dart
index 800d4e4..6f5e6bc 100644
--- a/tests/lib/mirrors/removed_api_test.dart
+++ b/tests/lib/mirrors/removed_api_test.dart
@@ -33,5 +33,5 @@
   expectThrowsNSM(() => MirroredError);
   expectThrowsNSM(() => MirrorException);
   expectThrowsNSM(() => MirroredUncaughtExceptionError);
-  // Don't ask about MirroredCompilationError.
+  expectThrowsNSM(() => MirroredCompilationError);
 }
diff --git a/tests/lib/typed_data/float32x4_list_test.dart b/tests/lib/typed_data/float32x4_list_test.dart
index 8942186..d020709 100644
--- a/tests/lib/typed_data/float32x4_list_test.dart
+++ b/tests/lib/typed_data/float32x4_list_test.dart
@@ -132,6 +132,98 @@
   }
 }
 
+void testSpecialValues(array) {
+
+  /// Same as Expect.identical, but also works with NaNs and -0.0 for dart2js.
+  void checkEquals(expected, actual) {
+    if (expected.isNaN) {
+      Expect.isTrue(actual.isNaN);
+    } else if (expected == 0.0 && expected.isNegative) {
+      Expect.isTrue(actual == 0.0 && actual.isNegative);
+    } else {
+      Expect.equals(expected, actual);
+    }
+  }
+
+  var pairs =  [
+    [0.0, 0.0],
+    [5e-324, 0.0],
+    [2.225073858507201e-308, 0.0],
+    [2.2250738585072014e-308, 0.0],
+    [0.9999999999999999, 1.0],
+    [1.0, 1.0],
+    [1.0000000000000002, 1.0],
+    [4294967295.0, 4294967296.0],
+    [4294967296.0, 4294967296.0],
+    [4503599627370495.5, 4503599627370496.0],
+    [9007199254740992.0, 9007199254740992.0],
+    [1.7976931348623157e+308, double.INFINITY],
+    [0.49999999999999994, 0.5],
+    [4503599627370497.0, 4503599627370496.0],
+    [9007199254740991.0, 9007199254740992.0],
+    [double.INFINITY, double.INFINITY],
+    [double.NAN, double.NAN],
+  ];
+
+  var conserved = [
+    1.401298464324817e-45,
+    1.1754942106924411e-38,
+    1.1754943508222875e-38,
+    0.9999999403953552,
+    1.0000001192092896,
+    8388607.5,
+    8388608.0,
+    3.4028234663852886e+38,
+    8388609.0,
+    16777215.0,
+  ];
+
+  var minusPairs = pairs.map((pair) {
+    return [-pair[0], -pair[1]];
+  });
+  var conservedPairs = conserved.map((value) => [value, value]);
+
+  var allTests = [pairs, minusPairs, conservedPairs].expand((x) => x);
+
+  for (var pair in allTests) {
+    var input = pair[0];
+    var expected = pair[1];
+    var f;
+    f = new Float32x4(input, 2.0, 3.0, 4.0);
+    array[0] = f;
+    f = array[0];
+    checkEquals(expected, f.x);
+    Expect.equals(2.0, f.y);
+    Expect.equals(3.0, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, input, 3.0, 4.0);
+    array[1] = f;
+    f = array[1];
+    Expect.equals(1.0, f.x);
+    checkEquals(expected, f.y);
+    Expect.equals(3.0, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, 2.0, input, 4.0);
+    array[2] = f;
+    f = array[2];
+    Expect.equals(1.0, f.x);
+    Expect.equals(2.0, f.y);
+    checkEquals(expected, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, 2.0, 3.0, input);
+    array[3] = f;
+    f = array[3];
+    Expect.equals(1.0, f.x);
+    Expect.equals(2.0, f.y);
+    Expect.equals(3.0, f.z);
+    checkEquals(expected, f.w);
+  }
+}
+
+
 main() {
   var list;
 
@@ -157,5 +249,8 @@
   for (int i = 0; i < 20; i++) {
     testListZero();
   }
+  for (int i = 0; i < 20; i++) {
+    testSpecialValues(list);
+  }
   testLoadStoreDeoptDriver();
 }
diff --git a/tests/lib/typed_data/float32x4_test.dart b/tests/lib/typed_data/float32x4_test.dart
index c7df4a3..7e57538 100644
--- a/tests/lib/typed_data/float32x4_test.dart
+++ b/tests/lib/typed_data/float32x4_test.dart
@@ -395,6 +395,109 @@
   Expect.equals(4.0, f.w);
 }
 
+void testBadArguments() {
+  Expect.throws(() => new Float32x4(null, 2.0, 3.0, 4.0),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Float32x4(1.0, null, 3.0, 4.0),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, null, 4.0),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, null),
+                (e) => e is ArgumentError);
+  // Use local variable typed as "var" to avoid static warnings.
+  var str = "foo";
+  Expect.throws(() => new Float32x4(str, 2.0, 3.0, 4.0),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Float32x4(1.0, str, 3.0, 4.0),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, str, 4.0),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Float32x4(1.0, 2.0, 3.0, str),
+                (e) => e is ArgumentError || e is TypeError);
+}
+
+void testSpecialValues() {
+
+  /// Same as Expect.identical, but also works with NaNs and -0.0 for dart2js.
+  void checkEquals(expected, actual) {
+    if (expected.isNaN) {
+      Expect.isTrue(actual.isNaN);
+    } else if (expected == 0.0 && expected.isNegative) {
+      Expect.isTrue(actual == 0.0 && actual.isNegative);
+    } else {
+      Expect.equals(expected, actual);
+    }
+  }
+
+  var pairs =  [
+    [0.0, 0.0],
+    [5e-324, 0.0],
+    [2.225073858507201e-308, 0.0],
+    [2.2250738585072014e-308, 0.0],
+    [0.9999999999999999, 1.0],
+    [1.0, 1.0],
+    [1.0000000000000002, 1.0],
+    [4294967295.0, 4294967296.0],
+    [4294967296.0, 4294967296.0],
+    [4503599627370495.5, 4503599627370496.0],
+    [9007199254740992.0, 9007199254740992.0],
+    [1.7976931348623157e+308, double.INFINITY],
+    [0.49999999999999994, 0.5],
+    [4503599627370497.0, 4503599627370496.0],
+    [9007199254740991.0, 9007199254740992.0],
+    [double.INFINITY, double.INFINITY],
+    [double.NAN, double.NAN],
+  ];
+
+  var conserved = [
+    1.401298464324817e-45,
+    1.1754942106924411e-38,
+    1.1754943508222875e-38,
+    0.9999999403953552,
+    1.0000001192092896,
+    8388607.5,
+    8388608.0,
+    3.4028234663852886e+38,
+    8388609.0,
+    16777215.0,
+  ];
+
+  var minusPairs = pairs.map((pair) {
+    return [-pair[0], -pair[1]];
+  });
+  var conservedPairs = conserved.map((value) => [value, value]);
+
+  var allTests = [pairs, minusPairs, conservedPairs].expand((x) => x);
+
+  for (var pair in allTests) {
+    var input = pair[0];
+    var expected = pair[1];
+    var f;
+    f = new Float32x4(input, 2.0, 3.0, 4.0);
+    checkEquals(expected, f.x);
+    Expect.equals(2.0, f.y);
+    Expect.equals(3.0, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, input, 3.0, 4.0);
+    Expect.equals(1.0, f.x);
+    checkEquals(expected, f.y);
+    Expect.equals(3.0, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, 2.0, input, 4.0);
+    Expect.equals(1.0, f.x);
+    Expect.equals(2.0, f.y);
+    checkEquals(expected, f.z);
+    Expect.equals(4.0, f.w);
+
+    f = new Float32x4(1.0, 2.0, 3.0, input);
+    Expect.equals(1.0, f.x);
+    Expect.equals(2.0, f.y);
+    Expect.equals(3.0, f.z);
+    checkEquals(expected, f.w);
+  }
+}
 
 main() {
   for (int i = 0; i < 20; i++) {
@@ -421,5 +524,7 @@
     testSqrt();
     testReciprocal();
     testReciprocalSqrt();
+    testBadArguments();
+    testSpecialValues();
   }
 }
diff --git a/tests/lib/typed_data/int32x4_list_test.dart b/tests/lib/typed_data/int32x4_list_test.dart
index 1ee42b6..03f7a8f 100644
--- a/tests/lib/typed_data/int32x4_list_test.dart
+++ b/tests/lib/typed_data/int32x4_list_test.dart
@@ -132,6 +132,55 @@
   }
 }
 
+void testSpecialValues(array) {
+  var tests = [
+    [0x8901234567890, 0x34567890],
+    [0x89012A4567890, -1537836912],
+    [0x80000000, -2147483648],
+    [-0x80000000, -2147483648],
+    [0x7fffffff, 2147483647],
+    [-0x7fffffff, -2147483647],
+  ];
+  var int32x4;
+
+  for (var test in tests) {
+    var input = test[0];
+    var expected = test[1];
+
+    int32x4 = new Int32x4(input, 2, 3, 4);
+    array[0] = int32x4;
+    int32x4 = array[0];
+    Expect.equals(expected, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, input, 3, 4);
+    array[0] = int32x4;
+    int32x4 = array[0];
+    Expect.equals(1, int32x4.x);
+    Expect.equals(expected, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, 2, input, 4);
+    array[0] = int32x4;
+    int32x4 = array[0];
+    Expect.equals(1, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(expected, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, 2, 3, input);
+    array[0] = int32x4;
+    int32x4 = array[0];
+    Expect.equals(1, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(expected, int32x4.w);
+  }
+}
+
 main() {
   var list;
 
@@ -139,6 +188,9 @@
   for (int i = 0; i < 20; i++) {
     testLoadStore(list);
   }
+  for (int i = 0; i < 20; i++) {
+    testSpecialValues(list);
+  }
 
   Uint32List uint32List = new Uint32List(32);
   for (int i = 0; i < uint32List.length; i++) {
@@ -157,5 +209,8 @@
   for (int i = 0; i < 20; i++) {
     testListZero();
   }
+  for (int i = 0; i < 20; i++) {
+    testSpecialValues(list);
+  }
   testLoadStoreDeoptDriver();
 }
diff --git a/tests/lib/typed_data/int32x4_test.dart b/tests/lib/typed_data/int32x4_test.dart
new file mode 100644
index 0000000..d4893c7
--- /dev/null
+++ b/tests/lib/typed_data/int32x4_test.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2014, 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.
+// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10
+
+library int32x4_test;
+
+import 'package:expect/expect.dart';
+import 'dart:typed_data';
+
+void testBadArguments() {
+  Expect.throws(() => new Int32x4(null, 2, 3, 4),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Int32x4(1, null, 3, 4),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Int32x4(1, 2, null, 4),
+                (e) => e is ArgumentError);
+  Expect.throws(() => new Int32x4(1, 2, 3, null),
+                (e) => e is ArgumentError);
+  // Use a local variable typed as dynamic to avoid static warnings.
+  var str = "foo";
+  Expect.throws(() => new Int32x4(str, 2, 3, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, str, 3, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, 2, str, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, 2, 3, str),
+                (e) => e is ArgumentError || e is TypeError);
+  // Use a local variable typed as dynamic to avoid static warnings.
+  var d = 0.5;
+  Expect.throws(() => new Int32x4(d, 2, 3, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, d, 3, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, 2, d, 4),
+                (e) => e is ArgumentError || e is TypeError);
+  Expect.throws(() => new Int32x4(1, 2, 3, d),
+                (e) => e is ArgumentError || e is TypeError);
+}
+
+void testBigArguments() {
+  var tests = [
+    [0x8901234567890, 0x34567890],
+    [0x89012A4567890, -1537836912],
+    [0x80000000, -2147483648],
+    [-0x80000000, -2147483648],
+    [0x7fffffff, 2147483647],
+    [-0x7fffffff, -2147483647],
+  ];
+  var int32x4;
+
+  for (var test in tests) {
+    var input = test[0];
+    var expected = test[1];
+
+    int32x4 = new Int32x4(input, 2, 3, 4);
+    Expect.equals(expected, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, input, 3, 4);
+    Expect.equals(1, int32x4.x);
+    Expect.equals(expected, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, 2, input, 4);
+    Expect.equals(1, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(expected, int32x4.z);
+    Expect.equals(4, int32x4.w);
+
+    int32x4 = new Int32x4(1, 2, 3, input);
+    Expect.equals(1, int32x4.x);
+    Expect.equals(2, int32x4.y);
+    Expect.equals(3, int32x4.z);
+    Expect.equals(expected, int32x4.w);
+  }
+}
+
+main() {
+  for (int i = 0; i < 20; i++) {
+    testBigArguments();
+    testBadArguments();
+  }
+}
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index bba1a24..ea088c9 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/try/poi/data/empty_main.dart b/tests/try/poi/data/empty_main.dart
new file mode 100644
index 0000000..591abeb
--- /dev/null
+++ b/tests/try/poi/data/empty_main.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2014, 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.
+
+main() {}
diff --git a/tests/try/poi/data/interesting.dart b/tests/try/poi/data/interesting.dart
new file mode 100644
index 0000000..f35f53f
--- /dev/null
+++ b/tests/try/poi/data/interesting.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2014, 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.
+
+class Foo {
+  fisk() {
+  }
+  hest() {
+  }
+}
+
+main() {}
diff --git a/tests/try/poi/poi_find_test.dart b/tests/try/poi/poi_find_test.dart
new file mode 100644
index 0000000..3830020
--- /dev/null
+++ b/tests/try/poi/poi_find_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, 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.
+
+/// Test that poi.dart finds the right element.
+
+library trydart.poi_find_test;
+
+import 'dart:io' show
+    Platform;
+
+import 'dart:async' show
+    Future;
+
+import 'package:try/poi/poi.dart' as poi;
+
+import 'package:async_helper/async_helper.dart';
+
+import 'package:expect/expect.dart';
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    Element;
+
+import 'package:compiler/implementation/source_file_provider.dart' show
+    FormattingDiagnosticHandler;
+
+Future testPoi() {
+  Uri script = Platform.script.resolve('data/empty_main.dart');
+  FormattingDiagnosticHandler handler = new FormattingDiagnosticHandler();
+  handler.verbose = true;
+
+  Future future = poi.runPoi(script, 225, handler.provider, handler);
+  return future.then((Element element) {
+    Uri foundScript = element.compilationUnit.script.resourceUri;
+    Expect.stringEquals('$script', '$foundScript');
+    Expect.stringEquals('main', element.name);
+  });
+}
+
+void main() {
+  asyncTest(testPoi);
+}
diff --git a/tests/try/poi/poi_test.dart b/tests/try/poi/poi_test.dart
index 39c8cb8..166c4be 100644
--- a/tests/try/poi/poi_test.dart
+++ b/tests/try/poi/poi_test.dart
@@ -2,16 +2,38 @@
 // 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.
 
+/// Test of the main method in poi.dart. This test only ensures that poi.dart
+/// doesn't crash.
+
 library trydart.poi_test;
 
 import 'dart:io' show
     Platform;
 
+import 'dart:async' show
+    Future;
+
 import 'package:try/poi/poi.dart' as poi;
 
 import 'package:async_helper/async_helper.dart';
 
+class PoiTest {
+  final Uri script;
+  final int offset;
+
+  PoiTest(this.script, this.offset);
+
+  Future run() => poi.main(<String>[script.toFilePath(), '$offset']);
+}
+
 void main() {
-  poi.main(<String>[Platform.script.toFilePath(), '339']);
-  asyncTest(() => poi.doneFuture);
+  int position = 710;
+  List tests = [
+      // The file empty_main.dart is a regression test for crash in
+      // resolveMetadataAnnotation in dart2js.
+      new PoiTest(Platform.script.resolve('data/empty_main.dart'), 225),
+      new PoiTest(Platform.script, position),
+  ];
+
+  asyncTest(() => Future.forEach(tests, (PoiTest test) => test.run()));
 }
diff --git a/tests/try/poi/serialize_test.dart b/tests/try/poi/serialize_test.dart
new file mode 100644
index 0000000..b5af1db
--- /dev/null
+++ b/tests/try/poi/serialize_test.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2014, 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.
+
+/// Test that poi.dart can serialize a scope.
+
+library trydart.serialize_test;
+
+import 'dart:io' show
+    Platform;
+
+import 'dart:async' show
+    Future;
+
+import 'dart:convert' show
+    JSON;
+
+import 'package:try/poi/poi.dart' as poi;
+
+import 'package:async_helper/async_helper.dart';
+
+import 'package:expect/expect.dart';
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    Element;
+
+import 'package:compiler/implementation/source_file_provider.dart' show
+    FormattingDiagnosticHandler;
+
+Future testPoi() {
+  Uri script = Platform.script.resolve('data/interesting.dart');
+  FormattingDiagnosticHandler handler = new FormattingDiagnosticHandler();
+
+  int position = 241;
+  Future future = poi.runPoi(script, position, handler.provider, handler);
+  return future.then((Element element) {
+    Uri foundScript = element.compilationUnit.script.resourceUri;
+    Expect.stringEquals('$script', '$foundScript');
+    Expect.stringEquals('fisk', element.name);
+
+    Expect.stringEquals(
+        JSON.encode(expected),
+        JSON.encode(JSON.decode(poi.scopeInformation(element, position))));
+  });
+}
+
+void main() {
+  asyncTest(testPoi);
+}
+
+final expected = {
+  "name": "fisk",
+  "kind": "function",
+  "enclosing": {
+    "name": "Foo",
+    "kind": "class",
+    "members": [
+      {
+        "name": "fisk",
+        "kind": "function"
+      },
+      {
+        "name": "hest",
+        "kind": "function"
+      },
+      {
+        "name": "",
+        "kind": "generative_constructor"
+      }
+    ],
+    "enclosing": {
+      "name": "tests/try/poi/data/interesting.dart",
+      "kind": "library",
+      "members": [
+        {
+          "name": "main",
+          "kind": "function"
+        },
+        {
+          "name": "Foo",
+          "kind": "class"
+        }
+      ]
+    }
+  }
+};
diff --git a/tests/try/try.status b/tests/try/try.status
index ac5aa37..1375419 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -20,3 +20,8 @@
 
 [ $browser ]
 poi/poi_test: SkipByDesign # Uses dart:io.
+poi/poi_find_test: SkipByDesign # Uses dart:io.
+poi/serialize_test: SkipByDesign # Uses dart:io.
+
+[ $compiler == dart2js ]
+poi/*: Skip # http://dartbug.com/20031
diff --git a/tools/VERSION b/tools/VERSION
index 5c17752..e2e56d1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 6
 PATCH 0
-PRERELEASE 3
-PRERELEASE_PATCH 1
+PRERELEASE 4
+PRERELEASE_PATCH 0
diff --git a/tools/build.py b/tools/build.py
index 4dfb024..96fdeac 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -15,6 +15,7 @@
 import utils
 
 HOST_OS = utils.GuessOS()
+HOST_ARCH = utils.GuessArchitecture()
 HOST_CPUS = utils.GuessCpus()
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
@@ -120,27 +121,36 @@
   return True
 
 
-def SetTools(arch, target_os, toolchainprefix):
-  toolsOverride = None
+def GetToolchainPrefix(target_os, arch, options):
+  if options.toolchain != None:
+    return options.toolchain
 
-  # For Android, by default use the toolchain from third_party/android_tools.
-  if target_os == 'android' and toolchainprefix == None:
+  if target_os == 'android':
     android_toolchain = GetAndroidToolchainDir(HOST_OS, arch)
     if arch == 'arm':
-      toolchainprefix = os.path.join(
-          android_toolchain, 'arm-linux-androideabi')
+      return os.path.join(android_toolchain, 'arm-linux-androideabi')
     if arch == 'ia32':
-      toolchainprefix = os.path.join(
-          android_toolchain, 'i686-linux-android')
+      return os.path.join(android_toolchain, 'i686-linux-android')
+
+  # If no cross compiler is specified, only try to figure one out on Linux.
+  if not HOST_OS in ['linux']:
+    print "Unless --toolchain is used cross-building is only supported on Linux"
+    return None
 
   # For ARM Linux, by default use the Linux distribution's cross-compiler.
-  if arch == 'arm' and toolchainprefix == None:
-    # We specify the hf compiler. If this changes, we must also remove
-    # the ARM_FLOAT_ABI_HARD define in configurations_make.gypi.
-    toolchainprefix = (DEFAULT_ARM_CROSS_COMPILER_PATH +
-                       "/arm-linux-gnueabihf")
+  if arch == 'arm':
+    # To use a non-hf compiler, specify on the command line with --toolchain.
+    return (DEFAULT_ARM_CROSS_COMPILER_PATH + "/arm-linux-gnueabihf")
 
-  # TODO(zra): Find a default MIPS Linux cross-compiler?
+  # TODO(zra): Find default MIPS and ARM64 Linux cross-compilers.
+
+  return None
+
+
+def SetTools(arch, target_os, options):
+  toolsOverride = None
+
+  toolchainprefix = GetToolchainPrefix(target_os, arch, options)
 
   # Override the Android toolchain's linker to handle some complexity in the
   # linker arguments that gyp has trouble with.
@@ -357,6 +367,146 @@
     os.system(command)
 
 
+filter_xcodebuild_output = False
+def BuildOneConfig(options, target, target_os, mode, arch, override_tools=True):
+  global filter_xcodebuild_output
+  start_time = time.time()
+  os.environ['DART_BUILD_MODE'] = mode
+  build_config = utils.GetBuildConf(mode, arch, target_os)
+  if HOST_OS == 'macos':
+    filter_xcodebuild_output = True
+    project_file = 'dart.xcodeproj'
+    if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
+      project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName()
+    args = ['xcodebuild',
+            '-project',
+            project_file,
+            '-target',
+            target,
+            '-configuration',
+            build_config,
+            'SYMROOT=%s' % os.path.abspath('xcodebuild')
+            ]
+  elif HOST_OS == 'win32':
+    project_file = 'dart.sln'
+    if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
+      project_file = 'dart-%s.sln' % CurrentDirectoryBaseName()
+    # Select a platform suffix to pass to devenv.
+    if arch == 'ia32':
+      platform_suffix = 'Win32'
+    elif arch == 'x64':
+      platform_suffix = 'x64'
+    else:
+      print 'Unsupported arch for MSVC build: %s' % arch
+      return 1
+    config_name = '%s|%s' % (build_config, platform_suffix)
+    if target == 'all':
+      args = [options.devenv + os.sep + options.executable,
+              '/build',
+              config_name,
+              project_file
+             ]
+    else:
+      args = [options.devenv + os.sep + options.executable,
+              '/build',
+              config_name,
+              '/project',
+              target,
+              project_file
+             ]
+  else:
+    make = 'make'
+    if HOST_OS == 'freebsd':
+      make = 'gmake'
+      # work around lack of flock
+      os.environ['LINK'] = '$(CXX)'
+    args = [make,
+            '-j',
+            options.j,
+            'BUILDTYPE=' + build_config,
+            ]
+    if target_os != HOST_OS:
+      args += ['builddir_name=' + utils.GetBuildDir(HOST_OS, target_os)]
+    if options.verbose:
+      args += ['V=1']
+
+    args += [target]
+
+  toolsOverride = None
+  if override_tools:
+    toolsOverride = SetTools(arch, target_os, options)
+  if toolsOverride:
+    for k, v in toolsOverride.iteritems():
+      args.append(  k + "=" + v)
+      if options.verbose:
+        print k + " = " + v
+    if not os.path.isfile(toolsOverride['CC.target']):
+      if arch == 'arm':
+        print arm_cc_error
+      else:
+        print "Couldn't find compiler: %s" % toolsOverride['CC.target']
+      return 1
+
+
+  print ' '.join(args)
+  process = None
+  if filter_xcodebuild_output:
+    process = subprocess.Popen(args,
+                               stdin=None,
+                               bufsize=1, # Line buffered.
+                               stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT)
+    FilterEmptyXcodebuildSections(process)
+  else:
+    process = subprocess.Popen(args, stdin=None)
+  process.wait()
+  if process.returncode != 0:
+    NotifyBuildDone(build_config, success=False, start=start_time)
+    return 1
+  else:
+    NotifyBuildDone(build_config, success=True, start=start_time)
+
+  return 0
+
+
+def BuildCrossSdk(options, target_os, mode, arch):
+  # First build 'create_sdk' for the host. Do not override the host toolchain.
+  if BuildOneConfig(options, 'create_sdk', HOST_OS,
+                    mode, HOST_ARCH, False) != 0:
+    return 1
+
+  # Then, build the runtime for the target arch.
+  if BuildOneConfig(options, 'runtime', target_os, mode, arch) != 0:
+    return 1
+
+  # TODO(zra): verify that no platform specific details leak into the snapshots
+  # created for pub, dart2js, etc.
+
+  # Copy dart-sdk from the host build products dir to the target build
+  # products dir, and copy the dart binary for target to the sdk bin/ dir.
+  src = os.path.join(
+      utils.GetBuildRoot(HOST_OS, mode, HOST_ARCH, HOST_OS), 'dart-sdk')
+  dst = os.path.join(
+      utils.GetBuildRoot(HOST_OS, mode, arch, target_os), 'dart-sdk')
+  shutil.rmtree(dst, ignore_errors=True)
+  shutil.copytree(src, dst)
+
+  dart = os.path.join(
+      utils.GetBuildRoot(HOST_OS, mode, arch, target_os), 'dart')
+  bin = os.path.join(dst, 'bin')
+  shutil.copy(dart, bin)
+
+  # Strip the dart binary
+  toolchainprefix = GetToolchainPrefix(target_os, arch, options)
+  if toolchainprefix == None:
+    print "Couldn't figure out the cross-toolchain"
+    return 1
+  strip = toolchainprefix + '-strip'
+  subprocess.call([strip, os.path.join(bin, 'dart')])
+
+  return 0
+
+
 def Main():
   utils.ConfigureJava()
   # Parse the options.
@@ -374,107 +524,18 @@
   else:
     targets = args
 
-  filter_xcodebuild_output = False
   # Build all targets for each requested configuration.
   for target in targets:
     for target_os in options.os:
       for mode in options.mode:
         for arch in options.arch:
-          start_time = time.time()
-          os.environ['DART_BUILD_MODE'] = mode
-          build_config = utils.GetBuildConf(mode, arch, target_os)
-          if HOST_OS == 'macos':
-            filter_xcodebuild_output = True
-            project_file = 'dart.xcodeproj'
-            if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
-              project_file = 'dart-%s.xcodeproj' % CurrentDirectoryBaseName()
-            args = ['xcodebuild',
-                    '-project',
-                    project_file,
-                    '-target',
-                    target,
-                    '-configuration',
-                    build_config,
-                    'SYMROOT=%s' % os.path.abspath('xcodebuild')
-                    ]
-          elif HOST_OS == 'win32':
-            project_file = 'dart.sln'
-            if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
-              project_file = 'dart-%s.sln' % CurrentDirectoryBaseName()
-            # Select a platform suffix to pass to devenv.
-            if arch == 'ia32':
-              platform_suffix = 'Win32'
-            elif arch == 'x64':
-              platform_suffix = 'x64'
-            else:
-              print 'Unsupported arch for MSVC build: %s' % arch
+          if target in ['create_sdk'] and utils.IsCrossBuild(target_os, arch):
+            if BuildCrossSdk(options, target_os, mode, arch) != 0:
               return 1
-            config_name = '%s|%s' % (build_config, platform_suffix)
-            if target == 'all':
-              args = [options.devenv + os.sep + options.executable,
-                      '/build',
-                      config_name,
-                      project_file
-                     ]
-            else:
-              args = [options.devenv + os.sep + options.executable,
-                      '/build',
-                      config_name,
-                      '/project',
-                      target,
-                      project_file
-                     ]
           else:
-            make = 'make'
-            if HOST_OS == 'freebsd':
-              make = 'gmake'
-              # work around lack of flock
-              os.environ['LINK'] = '$(CXX)'
-            args = [make,
-                    '-j',
-                    options.j,
-                    'BUILDTYPE=' + build_config,
-                    ]
-            if target_os != HOST_OS:
-              args += ['builddir_name=' + utils.GetBuildDir(HOST_OS, target_os)]
-            if options.verbose:
-              args += ['V=1']
-
-            args += [target]
-
-          toolchainprefix = options.toolchain
-          toolsOverride = SetTools(arch, target_os, toolchainprefix)
-          if toolsOverride:
-            for k, v in toolsOverride.iteritems():
-              args.append(  k + "=" + v)
-              if options.verbose:
-                print k + " = " + v
-            if not os.path.isfile(toolsOverride['CC.target']):
-              if arch == 'arm':
-                print arm_cc_error
-              else:
-                print "Couldn't find compiler: %s" % toolsOverride['CC.target']
+            if BuildOneConfig(options, target, target_os, mode, arch) != 0:
               return 1
 
-
-          print ' '.join(args)
-          process = None
-          if filter_xcodebuild_output:
-            process = subprocess.Popen(args,
-                                       stdin=None,
-                                       bufsize=1, # Line buffered.
-                                       stdout=subprocess.PIPE,
-                                       stderr=subprocess.STDOUT)
-            FilterEmptyXcodebuildSections(process)
-          else:
-            process = subprocess.Popen(args, stdin=None)
-          process.wait()
-          if process.returncode != 0:
-            NotifyBuildDone(build_config, success=False, start=start_time)
-            return 1
-          else:
-            NotifyBuildDone(build_config, success=True, start=start_time)
-
   return 0
 
 
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 4ac8679..620e572 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -226,6 +226,9 @@
            join(RESOURCE),
            ignore=ignore_patterns('.svn'))
 
+  copytree(join(SNAPSHOT, 'core_stubs'),
+           join(RESOURCE, 'dart', 'core_stubs'))
+
   # Copy in 7zip for Windows.
   if HOST_OS == 'win32':
     copytree(join(HOME, 'third_party', '7zip'),
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index cfb832b..3afce21 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -33,6 +33,11 @@
 };
 
 [Supplemental]
+interface FileReader {
+  [Suppressed] readonly attribute Object result;
+};
+
+[Supplemental]
 interface Node {
   [Custom] Node cloneNode([Default=Undefined] optional boolean deep);
   [Suppressed] readonly attribute Element nextElementSibling;
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index 3fd5cc6..b1cb0a1 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -427,6 +427,8 @@
   "@Experimental()",
 ]
 
+_web_audio_annotations = _webgl_annotations
+
 _webkit_experimental_annotations = [
   "@SupportedBrowser(SupportedBrowser.CHROME)",
   "@SupportedBrowser(SupportedBrowser.SAFARI)",
@@ -450,6 +452,8 @@
     "@SupportedBrowser(SupportedBrowser.OPERA)",
     "@SupportedBrowser(SupportedBrowser.SAFARI)",
   ],
+  'AudioBufferSourceNode': _web_audio_annotations,
+  'AudioContext': _web_audio_annotations,
   'DOMFileSystem': _file_system_annotations,
   'DOMFileSystemSync': _file_system_annotations,
   'WebKitPoint': _webkit_experimental_annotations,
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 7600399..950c9ae 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -113,6 +113,7 @@
     'ChannelSplitterNode': 'ChannelSplitterNode,AudioChannelSplitter',
 
     'ClientRect': 'ClientRect,DOMRect',
+    'ClientRectList': 'ClientRectList,DOMRectList',
 
     'CSSStyleDeclaration':
         #                    IE                   Firefox
diff --git a/tools/dom/templates/html/impl/impl_FileReader.darttemplate b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
index 5895c2a..182f1d8 100644
--- a/tools/dom/templates/html/impl/impl_FileReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
@@ -7,17 +7,19 @@
 @DocsEditable()
 $(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
 
-$if DART2JS
   @DomName('FileReader.result')
   @DocsEditable()
   Object get result {
+$if DART2JS
     var res = JS('Null|String|NativeByteBuffer', '#.result', this);
+$else
+    var res = _blink.BlinkFileReader.$result_Getter(this);
+$endif
     if (res is ByteBuffer) {
       return new Uint8List.view(res);
     }
     return res;
   }
-$endif
 
 $!MEMBERS
 }
diff --git a/tools/list_pkg_directories.py b/tools/list_pkg_directories.py
index f1b69f1..d64604b 100644
--- a/tools/list_pkg_directories.py
+++ b/tools/list_pkg_directories.py
@@ -8,16 +8,29 @@
 argument to this script which have a lib subdirectory.
 
 Usage:
-  python tools/list_pkg_directories.py directory_to_list
+  python tools/list_pkg_directories.py OPTIONS DIRECTORY
 '''
 
+import optparse
 import os
 import sys
 
+def get_options():
+  result = optparse.OptionParser()
+  result.add_option("--exclude",
+      help='A comma-separated list of directory names to exclude.')
+  return result.parse_args()
+
 def main(argv):
-  directory = argv[1]
-  paths = map(lambda x: x + '/lib', filter(lambda x: os.path.isdir(
-      os.path.join(directory, x)), os.listdir(directory)))
+  (options, args) = get_options()
+  directory = args[0]
+  exclude = options.exclude.split(',') if options.exclude else []
+
+  paths = [
+    path + '/lib' for path in os.listdir(directory)
+    if path not in exclude and os.path.isdir(os.path.join(directory, path))
+  ]
+
   for lib in filter(lambda x: os.path.exists(os.path.join(directory, x)),
       paths):
     print '%s/%s' % (directory, lib)
diff --git a/tools/remove_html_imports.py b/tools/remove_html_imports.py
new file mode 100644
index 0000000..49a87c4
--- /dev/null
+++ b/tools/remove_html_imports.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+# Copyright (c) 2014, 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.
+
+'''Tool for removing dart:html and related imports from a library.
+
+Copy SOURCE to TARGET, removing any lines that import dart:html.
+
+Usage:
+  python tools/remove_html_imports.py SOURCE TARGET
+'''
+
+import os
+import re
+import shutil
+import sys
+
+HTML_IMPORT = re.compile(r'''^import ["']dart:(html|html_common|indexed_db'''
+                         r'''|js|svg|web_(audio|gl|sql))["'];$''',
+                         flags=re.MULTILINE)
+
+def main(argv):
+  source = argv[1]
+  target = argv[2]
+  shutil.rmtree(target)
+  shutil.copytree(source, target, ignore=shutil.ignore_patterns('.svn'))
+
+  for root, subFolders, files in os.walk(target):
+    for path in files:
+      if not path.endswith('.dart'): next
+      with open(os.path.join(root, path), 'r+') as f:
+        contents = f.read()
+        f.seek(0)
+        f.truncate()
+        f.write(HTML_IMPORT.sub(r'// import "dart:\1";', contents))
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))
diff --git a/tools/utils.py b/tools/utils.py
index f8fe68c..e2d917d 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -242,6 +242,11 @@
 def GetArchFamily(arch):
   return ARCH_FAMILY[arch]
 
+def IsCrossBuild(target_os, arch):
+  host_arch = ARCH_GUESS
+  return ((GetArchFamily(host_arch) != GetArchFamily(arch)) or
+          (target_os != GuessOS()))
+
 def GetBuildConf(mode, arch, conf_os=None):
   if conf_os == 'android':
     return '%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper())
@@ -260,7 +265,7 @@
 def GetBuildRoot(host_os, mode=None, arch=None, target_os=None):
   build_root = GetBuildDir(host_os, target_os)
   if mode:
-    build_root = os.path.join(build_root, GetBuildConf(mode, arch))
+    build_root = os.path.join(build_root, GetBuildConf(mode, arch, target_os))
   return build_root
 
 def GetBaseDir():
diff --git a/tools/utils/elisp/dart-mode.el b/tools/utils/elisp/dart-mode.el
deleted file mode 100644
index 3b4f7e1..0000000
--- a/tools/utils/elisp/dart-mode.el
+++ /dev/null
@@ -1,169 +0,0 @@
-;;; dart-mode.el --- a Dart mode for emacs based upon CC mode.
-
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2 of the License, or
-;; (at your option) any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-;;
-;; You should have received a copy of the GNU General Public License
-;; along with this program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; This is a basic Dart mode based on Martin Stjernholm's GPL'd
-;; derived-mode-ex.el template.  It uses cc-mode and falls back on
-;; Java for basic rules.
-;;
-;; Note: The interface used in this file requires CC Mode 5.30 or
-;; later.
-
-;;; Code:
-
-(require 'cc-mode)
-(require 'compile)
-
-;; These are only required at compile time to get the sources for the
-;; language constants.  (The cc-fonts require and the font-lock
-;; related constants could additionally be put inside an
-;; (eval-after-load "font-lock" ...) but then some trickery is
-;; necessary to get them compiled.)
-(eval-when-compile
-  (require 'cc-langs)
-  (require 'cc-fonts))
-
-(eval-and-compile
-  ;; Make our mode known to the language constant system.  Use Java
-  ;; mode as the fallback for the constants we don't change here.
-  ;; This needs to be done also at compile time since the language
-  ;; constants are evaluated then.
-  (c-add-language 'dart-mode 'java-mode))
-
-;; Dart has no boolean but a string and a vector type.
-(c-lang-defconst c-primitive-type-kwds
-  dart (append '("bool" "var")
-             (delete "boolean"
-                     ;; Use append to not be destructive on the
-                     ;; return value below.
-                     (append
-                      ;; Due to the fallback to Java, we need not give
-                      ;; a language to `c-lang-const'.
-                      (c-lang-const c-primitive-type-kwds)
-                      nil))))
-
-;; Recognize member init lists after colons in Dart.
-(c-lang-defconst c-nonlabel-token-key
-  dart (concat "\\s\(\\|" (c-lang-const c-nonlabel-token-key)))
-
-;; No cpp in this language, but there's still a "#include" directive to
-;; fontify.  (The definitions for the extra keywords above are enough
-;; to incorporate them into the fontification regexps for types and
-;; keywords, so no additional font-lock patterns are required.)
-(c-lang-defconst c-cpp-matchers
-  dart (cons
-      ;; Use the eval form for `font-lock-keywords' to be able to use
-      ;; the `c-preprocessor-face-name' variable that maps to a
-      ;; suitable face depending on the (X)Emacs version.
-      '(eval . (list "^\\s *\\(#include\\)\\>\\(.*\\)"
-                     (list 1 c-preprocessor-face-name)
-                     '(2 font-lock-string-face)))
-      ;; There are some other things in `c-cpp-matchers' besides the
-      ;; preprocessor support, so include it.
-      (c-lang-const c-cpp-matchers)))
-
-(defcustom dart-font-lock-extra-types nil
-  "*List of extra types (aside from the type keywords) to recognize in Dart mode.
-Each list item should be a regexp matching a single identifier.")
-
-(defconst dart-font-lock-keywords-1 (c-lang-const c-matchers-1 dart)
-  "Minimal highlighting for Dart mode.")
-
-(defconst dart-font-lock-keywords-2 (c-lang-const c-matchers-2 dart)
-  "Fast normal highlighting for Dart mode.")
-
-(defconst dart-font-lock-keywords-3 (c-lang-const c-matchers-3 dart)
-  "Accurate normal highlighting for Dart mode.")
-
-(defvar dart-font-lock-keywords dart-font-lock-keywords-3
-  "Default expressions to highlight in Dart mode.")
-
-(defvar dart-mode-syntax-table nil
-  "Syntax table used in dart-mode buffers.")
-(or dart-mode-syntax-table
-    (setq dart-mode-syntax-table
-          (funcall (c-lang-const c-make-mode-syntax-table dart))))
-
-(defvar dart-mode-abbrev-table nil
-  "Abbreviation table used in dart-mode buffers.")
-(c-define-abbrev-table 'dart-mode-abbrev-table
-  ;; Keywords that if they occur first on a line might alter the
-  ;; syntactic context, and which therefore should trig reindentation
-  ;; when they are completed.
-  '(("else" "else" c-electric-continued-statement 0)
-    ("while" "while" c-electric-continued-statement 0)
-    ("catch" "catch" c-electric-continued-statement 0)
-    ("finally" "finally" c-electric-continued-statement 0)))
-
-(defvar dart-mode-map (let ((map (c-make-inherited-keymap)))
-                      ;; Add bindings which are only useful for Dart
-                      map)
-  "Keymap used in dart-mode buffers.")
-
-(easy-menu-define dart-menu dart-mode-map "Dart Mode Commands"
-                  ;; Can use `dart' as the language for `c-mode-menu'
-                  ;; since its definition covers any language.  In
-                  ;; this case the language is used to adapt to the
-                  ;; nonexistence of a cpp pass and thus removing some
-                  ;; irrelevant menu alternatives.
-                  (cons "Dart" (c-lang-const c-mode-menu dart)))
-
-;;;###autoload
-(add-to-list 'auto-mode-alist '("\\.dart\\'" . dart-mode))
-
-;;;###autoload
-(defun dart-mode ()
-  "Major mode for editing Dart code.
-This is a simple example of a separate mode derived from CC Mode to
-support a language with syntax similar to C/C++/ObjC/Java/IDL/Pike.
-
-The hook `c-mode-common-hook' is run with no args at mode
-initialization, then `dart-mode-hook'.
-
-Key bindings:
-\\{dart-mode-map}"
-  (interactive)
-  (kill-all-local-variables)
-  (c-initialize-cc-mode t)
-  (set-syntax-table dart-mode-syntax-table)
-  (setq major-mode 'dart-mode
-        mode-name "Dart"
-        local-abbrev-table dart-mode-abbrev-table
-        abbrev-mode t)
-  (use-local-map dart-mode-map)
-  ;; `c-init-language-vars' is a macro that is expanded at compile
-  ;; time to a large `setq' with all the language variables and their
-  ;; customized values for our language.
-  (c-init-language-vars dart-mode)
-  ;; `c-common-init' initializes most of the components of a CC Mode
-  ;; buffer, including setup of the mode menu, font-lock, etc.
-  ;; There's also a lower level routine `c-basic-common-init' that
-  ;; only makes the necessary initialization to get the syntactic
-  ;; analysis and similar things working.
-  (c-common-init 'dart-mode)
-  (easy-menu-add dart-menu)
-  (run-hooks 'c-mode-common-hook)
-  (run-hooks 'dart-mode-hook)
-  (c-update-modeline))
-
-(add-to-list 'compilation-error-regexp-alist 'dart)
-(add-to-list 'compilation-error-regexp-alist-alist '(dart "Function: '[^']*' url: 'file://\\([^']*\\)' line:\\([0-9]*\\) col:\\([0-9]*\\)" 1 2 3))
-
-(provide 'dart-mode)
-
-;;; dart-mode.el ends here
diff --git a/tools/utils/textmate/Dart.tmbundle/Preferences/Comments.tmPreferences b/tools/utils/textmate/Dart.tmbundle/Preferences/Comments.tmPreferences
deleted file mode 100644
index 3a59794..0000000
--- a/tools/utils/textmate/Dart.tmbundle/Preferences/Comments.tmPreferences
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>name</key>
-	<string>Comments</string>
-	<key>scope</key>
-	<string>dart.source</string>
-	<key>settings</key>
-	<dict>
-		<key>shellVariables</key>
-		<array>
-			<dict>
-				<key>name</key>
-				<string>TM_COMMENT_START</string>
-				<key>value</key>
-				<string>// </string>
-			</dict>
-			<dict>
-				<key>name</key>
-				<string>TM_COMMENT_START_2</string>
-				<key>value</key>
-				<string>/*</string>
-			</dict>
-			<dict>
-				<key>name</key>
-				<string>TM_COMMENT_END_2</string>
-				<key>value</key>
-				<string>*/</string>
-			</dict>
-		</array>
-	</dict>
-	<key>uuid</key>
-	<string>A6CB02E3-15E3-4CDB-B63D-FCC95A26370C</string>
-</dict>
-</plist>
diff --git a/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.textmate b/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.textmate
deleted file mode 100644
index adfc7fc..0000000
--- a/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.textmate
+++ /dev/null
@@ -1,184 +0,0 @@
-{	scopeName = 'source.dart';
-	fileTypes = ( 'dart' );
-	foldingStartMarker = '\{\s*$';
-	foldingStopMarker = '^\s*\}';
-	patterns = (
-		{	name = 'meta.preprocessor.script.dart';
-			match = '^(#!.*)$';
-		},
-		{	name = 'meta.declaration.dart';
-			begin = '#\b(library|import|source|resource)\b';
-			end = ';';
-			beginCaptures = { 0 = { name = 'keyword.other.import.dart'; }; };
-			endCaptures = { 0 = { name = 'punctuation.terminator.dart'; }; };
-			patterns = (
-				{	include = '#strings'; },
-				{	match = '\b(prefix)\s*:';
-					captures = { 1 = { name = 'keyword.other.import.dart'; }; };
-				},
-			);
-		},
-		{	include = '#comments'; },
-		{	include = '#constants-and-special-vars'; },
-		{	include = '#keywords'; },
-		{	include = '#strings'; },
-	);
-	repository = {
-		comments = {
-			patterns = (
-				{	name = 'comment.block.empty.dart';
-					match = '/\*\*/';
-					captures = { 0 = { name = 'punctuation.definition.comment.dart'; }; };
-				},
-				{	include = 'text.html.javadoc'; },
-				{	include = '#comments-inline'; },
-			);
-		};
-		comments-inline = {
-			patterns = (
-				{	name = 'comment.block.dart';
-					begin = '/\*';
-					end = '\*/';
-				},
-				{	match = '((//).*)$';
-					captures = { 1 = { name = 'comment.line.double-slash.dart'; }; };
-				},
-			);
-		};
-		constants-and-special-vars = {
-			patterns = (
-				{	name = 'constant.language.dart';
-					match = '\b(true|false|null)\b';
-				},
-				{	name = 'variable.language.dart';
-					match = '\b(this|super)\b';
-				},
-				{	name = 'constant.numeric.dart';
-					match = '\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b';
-				},
-			);
-		};
-		keywords = {
-			patterns = (
-				{	name = 'keyword.cast.dart';
-					match = '\bas\b';
-				},
-				{	name = 'keyword.control.catch-exception.dart';
-					match = '\b(try|catch|finally|throw)\b';
-				},
-				{	name = 'keyword.control.ternary.dart';
-					match = '\?|:';
-				},
-				{	name = 'keyword.control.dart';
-					match = '\b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b';
-				},
-				{	name = 'keyword.control.new.dart';
-					match = '\b(new)\b';
-				},
-				{	name = 'keyword.declaration.dart';
-					match = '\b(abstract|class|extends|external|factory|implements|interface|get|native|operator|set|typedef)\b';
-				},
-				{	name = 'keyword.operator.dart';
-					match = '\b(is\!?)\b';
-				},
-				{	name = 'keyword.operator.bitwise.dart';
-					match = '(<<|>>>?|~|\^|\||&)';
-				},
-				{	name = 'keyword.operator.assignment.bitwise.dart';
-					match = '((&|\^|\||<<|>>>?)=)';
-				},
-				{	name = 'keyword.operator.comparison.dart';
-					match = '(===?|!==?|<=?|>=?)';
-				},
-				{	name = 'keyword.operator.assignment.arithmetic.dart';
-					match = '(([+*/%-]|\~)=)';
-				},
-				{	name = 'keyword.operator.assignment.dart';
-					match = '(=)';
-				},
-				{	name = 'keyword.operator.increment-decrement.dart';
-					match = '(\-\-|\+\+)';
-				},
-				{	name = 'keyword.operator.arithmetic.dart';
-					match = '(\-|\+|\*|\/|\~\/|%)';
-				},
-				{	name = 'keyword.operator.logical.dart';
-					match = '(!|&&|\|\|)';
-				},
-				{	name = 'punctuation.terminator.dart';
-					match = ';';
-				},
-				{	name = 'storage.modifier.dart';
-					match = '\b(static|final|const)\b';
-				},
-				{	name = 'storage.type.primitive.dart';
-					match = '\b(?:void|bool|num|int|double|dynamic|var|String)\b';
-				},
-			);
-		};
-		string-interp = {
-			patterns = (
-				{	match = '\$((\w+)|\{(\w+)\})';
-					captures = {
-						2 = { name = 'variable.parameter.dart'; };
-						3 = { name = 'variable.parameter.dart'; };
-					};
-				},
-				{	name = 'constant.character.escape.dart';
-					match = '\\.';
-				},
-			);
-		};
-		strings = {
-			patterns = (
-				{	name = 'string.interpolated.triple.dart';
-					begin = '(?<!@)"""';
-					end = '"""(?!")';
-					patterns = ( { include = '#string-interp'; } );
-				},
-				{	name = 'string.quoted.triple.dart';
-					begin = '@"""';
-					end = '"""(?!")';
-				},
-				{	name = 'string.interpolated.double.dart';
-					begin = '(?<!\\|@)"';
-					end = '"';
-					patterns = (
-						{	name = 'invalid.string.newline';
-							match = '\n';
-						},
-						{	include = '#string-interp'; },
-					);
-				},
-				{	name = 'string.quoted.double.dart';
-					begin = '@"';
-					end = '"';
-					patterns = (
-						{	name = 'invalid.string.newline';
-							match = '\n';
-						},
-					);
-				},
-				{	name = 'string.interpolated.single.dart';
-					begin = "(?<!\|@)'";
-					end = "'";
-					patterns = (
-						{	name = 'invalid.string.newline';
-							match = '\n';
-						},
-						{	include = '#string-interp'; },
-					);
-				},
-				{	name = 'string.quoted.single.dart';
-					begin = "@'";
-					end = "'";
-					patterns = (
-						{	name = 'invalid.string.newline';
-							match = '\n';
-						},
-					);
-				},
-			);
-		};
-	};
-}
diff --git a/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.tmLanguage b/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.tmLanguage
deleted file mode 100644
index 61727e2..0000000
--- a/tools/utils/textmate/Dart.tmbundle/Syntaxes/Dart.tmLanguage
+++ /dev/null
@@ -1,417 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>fileTypes</key>
-	<array>
-		<string>dart</string>
-	</array>
-	<key>foldingStartMarker</key>
-	<string>\{\s*$</string>
-	<key>foldingStopMarker</key>
-	<string>^\s*\}</string>
-	<key>name</key>
-	<string>Dart</string>
-	<key>patterns</key>
-	<array>
-		<dict>
-			<key>match</key>
-			<string>^(#!.*)$</string>
-			<key>name</key>
-			<string>meta.preprocessor.script.dart</string>
-		</dict>
-		<dict>
-			<key>begin</key>
-			<string>#\b(library|import|source|resource)\b</string>
-			<key>beginCaptures</key>
-			<dict>
-				<key>0</key>
-				<dict>
-					<key>name</key>
-					<string>keyword.other.import.dart</string>
-				</dict>
-			</dict>
-			<key>end</key>
-			<string>;</string>
-			<key>endCaptures</key>
-			<dict>
-				<key>0</key>
-				<dict>
-					<key>name</key>
-					<string>punctuation.terminator.dart</string>
-				</dict>
-			</dict>
-			<key>name</key>
-			<string>meta.declaration.dart</string>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>include</key>
-					<string>#strings</string>
-				</dict>
-				<dict>
-					<key>captures</key>
-					<dict>
-						<key>1</key>
-						<dict>
-							<key>name</key>
-							<string>keyword.other.import.dart</string>
-						</dict>
-					</dict>
-					<key>match</key>
-					<string>\b(prefix)\s*:</string>
-				</dict>
-			</array>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#comments</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#constants-and-special-vars</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#keywords</string>
-		</dict>
-		<dict>
-			<key>include</key>
-			<string>#strings</string>
-		</dict>
-	</array>
-	<key>repository</key>
-	<dict>
-		<key>comments</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>captures</key>
-					<dict>
-						<key>0</key>
-						<dict>
-							<key>name</key>
-							<string>punctuation.definition.comment.dart</string>
-						</dict>
-					</dict>
-					<key>match</key>
-					<string>/\*\*/</string>
-					<key>name</key>
-					<string>comment.block.empty.dart</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>text.html.javadoc</string>
-				</dict>
-				<dict>
-					<key>include</key>
-					<string>#comments-inline</string>
-				</dict>
-			</array>
-		</dict>
-		<key>comments-inline</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>begin</key>
-					<string>/\*</string>
-					<key>end</key>
-					<string>\*/</string>
-					<key>name</key>
-					<string>comment.block.dart</string>
-				</dict>
-				<dict>
-					<key>captures</key>
-					<dict>
-						<key>1</key>
-						<dict>
-							<key>name</key>
-							<string>comment.line.double-slash.dart</string>
-						</dict>
-					</dict>
-					<key>match</key>
-					<string>((//).*)$</string>
-				</dict>
-			</array>
-		</dict>
-		<key>constants-and-special-vars</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>match</key>
-					<string>\b(true|false|null)\b</string>
-					<key>name</key>
-					<string>constant.language.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(this|super)\b</string>
-					<key>name</key>
-					<string>variable.language.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b</string>
-					<key>name</key>
-					<string>constant.numeric.dart</string>
-				</dict>
-			</array>
-		</dict>
-		<key>keywords</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>match</key>
-					<string>\bas\b</string>
-					<key>name</key>
-					<string>keyword.cast.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(try|catch|finally|throw)\b</string>
-					<key>name</key>
-					<string>keyword.control.catch-exception.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\?|:</string>
-					<key>name</key>
-					<string>keyword.control.ternary.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(break|case|continue|default|do|else|for|if|in|return|switch|while)\b</string>
-					<key>name</key>
-					<string>keyword.control.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(new)\b</string>
-					<key>name</key>
-					<string>keyword.control.new.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(abstract|class|extends|external|factory|implements|interface|get|native|operator|set|typedef)\b</string>
-					<key>name</key>
-					<string>keyword.declaration.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(is\!?)\b</string>
-					<key>name</key>
-					<string>keyword.operator.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(&lt;&lt;|&gt;&gt;&gt;?|~|\^|\||&amp;)</string>
-					<key>name</key>
-					<string>keyword.operator.bitwise.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>((&amp;|\^|\||&lt;&lt;|&gt;&gt;&gt;?)=)</string>
-					<key>name</key>
-					<string>keyword.operator.assignment.bitwise.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(===?|!==?|&lt;=?|&gt;=?)</string>
-					<key>name</key>
-					<string>keyword.operator.comparison.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(([+*/%-]|\~)=)</string>
-					<key>name</key>
-					<string>keyword.operator.assignment.arithmetic.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(=)</string>
-					<key>name</key>
-					<string>keyword.operator.assignment.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(\-\-|\+\+)</string>
-					<key>name</key>
-					<string>keyword.operator.increment-decrement.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(\-|\+|\*|\/|\~\/|%)</string>
-					<key>name</key>
-					<string>keyword.operator.arithmetic.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>(!|&amp;&amp;|\|\|)</string>
-					<key>name</key>
-					<string>keyword.operator.logical.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>;</string>
-					<key>name</key>
-					<string>punctuation.terminator.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(static|final|const)\b</string>
-					<key>name</key>
-					<string>storage.modifier.dart</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\b(?:void|bool|num|int|double|dynamic|var|String)\b</string>
-					<key>name</key>
-					<string>storage.type.primitive.dart</string>
-				</dict>
-			</array>
-		</dict>
-		<key>string-interp</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>captures</key>
-					<dict>
-						<key>2</key>
-						<dict>
-							<key>name</key>
-							<string>variable.parameter.dart</string>
-						</dict>
-						<key>3</key>
-						<dict>
-							<key>name</key>
-							<string>variable.parameter.dart</string>
-						</dict>
-					</dict>
-					<key>match</key>
-					<string>\$((\w+)|\{(\w+)\})</string>
-				</dict>
-				<dict>
-					<key>match</key>
-					<string>\\.</string>
-					<key>name</key>
-					<string>constant.character.escape.dart</string>
-				</dict>
-			</array>
-		</dict>
-		<key>strings</key>
-		<dict>
-			<key>patterns</key>
-			<array>
-				<dict>
-					<key>begin</key>
-					<string>(?&lt;!@)"""</string>
-					<key>end</key>
-					<string>"""(?!")</string>
-					<key>name</key>
-					<string>string.interpolated.triple.dart</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>include</key>
-							<string>#string-interp</string>
-						</dict>
-					</array>
-				</dict>
-				<dict>
-					<key>begin</key>
-					<string>@"""</string>
-					<key>end</key>
-					<string>"""(?!")</string>
-					<key>name</key>
-					<string>string.quoted.triple.dart</string>
-				</dict>
-				<dict>
-					<key>begin</key>
-					<string>(?&lt;!\\|@)"</string>
-					<key>end</key>
-					<string>"</string>
-					<key>name</key>
-					<string>string.interpolated.double.dart</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>match</key>
-							<string>\n</string>
-							<key>name</key>
-							<string>invalid.string.newline</string>
-						</dict>
-						<dict>
-							<key>include</key>
-							<string>#string-interp</string>
-						</dict>
-					</array>
-				</dict>
-				<dict>
-					<key>begin</key>
-					<string>@"</string>
-					<key>end</key>
-					<string>"</string>
-					<key>name</key>
-					<string>string.quoted.double.dart</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>match</key>
-							<string>\n</string>
-							<key>name</key>
-							<string>invalid.string.newline</string>
-						</dict>
-					</array>
-				</dict>
-				<dict>
-					<key>begin</key>
-					<string>(?&lt;!\|@)'</string>
-					<key>end</key>
-					<string>'</string>
-					<key>name</key>
-					<string>string.interpolated.single.dart</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>match</key>
-							<string>\n</string>
-							<key>name</key>
-							<string>invalid.string.newline</string>
-						</dict>
-						<dict>
-							<key>include</key>
-							<string>#string-interp</string>
-						</dict>
-					</array>
-				</dict>
-				<dict>
-					<key>begin</key>
-					<string>@'</string>
-					<key>end</key>
-					<string>'</string>
-					<key>name</key>
-					<string>string.quoted.single.dart</string>
-					<key>patterns</key>
-					<array>
-						<dict>
-							<key>match</key>
-							<string>\n</string>
-							<key>name</key>
-							<string>invalid.string.newline</string>
-						</dict>
-					</array>
-				</dict>
-			</array>
-		</dict>
-	</dict>
-	<key>scopeName</key>
-	<string>source.dart</string>
-	<key>uuid</key>
-	<string>958518BC-799F-477A-99F9-5B28EBF230F6</string>
-</dict>
-</plist>
diff --git a/tools/utils/textmate/Dart.tmbundle/info.plist b/tools/utils/textmate/Dart.tmbundle/info.plist
deleted file mode 100644
index c06ce04..0000000
--- a/tools/utils/textmate/Dart.tmbundle/info.plist
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>name</key>
-	<string>Dart</string>
-	<key>uuid</key>
-	<string>BB2AD6E4-D76D-41C6-B9A2-62DD2461F7F0</string>
-</dict>
-</plist>
diff --git a/tools/utils/textmate/README b/tools/utils/textmate/README
deleted file mode 100644
index 96be5f8..0000000
--- a/tools/utils/textmate/README
+++ /dev/null
@@ -1,20 +0,0 @@
-This bundle provides rules to TextMate that describe minimal rules for display of the dart source code. At this point the dart bundle provides:
-  - syntax highlighting of keywords
-  - syntax highlighting of strings
-  - Preferences for comments so that you can use CMD-/ to (de)comment source lines.
-
-The bundle identifies dart source by the file extension (.dart).
-
-INSTALLATION
-============
-From the command line. From the root of the dart repo, type:
-open tools/utils/Dart.tmbundle
-
--OR-
-From TextMate:
-Open (File->Open...) the Dart.tmbundle file from tools/utils/textmate
-
--OR-
-For use with Sublime Text:
-Copy Dart.tmbundle to the sublime packages directory (on OSX: 
-~/Library/Application Support/Sublime Text 2/Packages).
diff --git a/tools/utils/vim/syntax/dart.vim b/tools/utils/vim/syntax/dart.vim
deleted file mode 100644
index 669db58..0000000
--- a/tools/utils/vim/syntax/dart.vim
+++ /dev/null
@@ -1,128 +0,0 @@
-" Vim syntax file " Language: Dart
-" 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.
-
-" Quit when a syntax file was already loaded
-if !exists("main_syntax")
-  if version < 600
-    syntax clear
-  elseif exists("b:current_syntax")
-    finish
-  endif
-  " we define it here so that included files can test for it
-  let main_syntax='dart'
-  syn region dartFold start="{" end="}" transparent fold
-endif
-
-" Ensure long multiline strings are highlighted.
-syn sync fromstart
-
-" keyword definitions
-syn keyword dartConditional    if else switch
-syn keyword dartRepeat         do while for
-syn keyword dartBoolean        true false
-syn keyword dartConstant       null
-syn keyword dartTypedef        this super class typedef
-syn keyword dartOperator       new is in factory const
-syn match   dartOperator       "+=\=\|-=\=\|*=\=\|/=\=\|%=\=\|\~/=\=\|<<=\=\|>>=\=\|[<>]=\=\|===\=\|\!==\=\|&=\=\|\^=\=\||=\=\|||\|&&\|\[\]=\=\|=>\|!\|\~"
-syn keyword dartType           void var final bool int double num dynamic
-syn keyword dartCommonInterfaces String Object Math RegExp Date
-syn keyword dartInterfaces       Collection Comparable Completer Duration Function Future HashMap HashSet Iterable Iterator LinkedHashMap List Map Match Options Pattern Queue Set Stopwatch StringBuffer TimeZone
-syn keyword dartInterfaces_DEPRECATED       Dynamic
-syn keyword dartErrors         AssertionError TypeError FallThroughError
-syn keyword dartStatement      return
-syn keyword dartStorageClass   static abstract
-syn keyword dartExceptions     throw try catch finally
-syn keyword dartExceptions     Error FormatException Exception ExpectException FutureAlreadyCompleteException FutureNotCompleteException ArgumentError IllegalJSRegExpException IntegerDivisionByZeroException NoSuchMethodError NullThrownError OutOfMemoryError RangeError StackOverflowException StateError UnimplementedError UnsupportedError
-syn keyword dartExceptions_DEPRECATED     BadNumberFormatException
-syn keyword dartAssert         assert
-syn keyword dartClassDecl      extends implements interface
-" TODO(antonm): check if labels on break and continue are supported.
-syn keyword dartBranch         break continue nextgroup=dartUserLabelRef skipwhite
-syn keyword dartKeyword        get set operator call equals negate external
-syn match   dartUserLabelRef   "\k\+" contained
-syn match   dartVarArg         "\.\.\."
-
-" TODO(antonm): consider conditional highlighting of corelib classes.
-
-syn region  dartLabelRegion   transparent matchgroup=dartLabel start="\<case\>" matchgroup=NONE end=":"
-syn keyword dartLabel         default
-
-" Comments
-syn keyword dartTodo          contained TODO FIXME XXX
-syn region  dartComment       start="/\*"  end="\*/" contains=dartTodo,dartDocLink,@Spell
-syn match   dartLineComment   "//.*" contains=dartTodo,@Spell
-syn match   dartLineDocComment "///.*" contains=dartTodo,dartDocLink,@Spell
-syn region  dartDocLink       contained start=+\[+ end=+\]+
-
-" Strings
-syn region  dartString        start=+\z(["']\)+ end=+\z1+ contains=@Spell,dartInterpolation,dartSpecialChar
-syn region  dartRawString_DEPRECATED     start=+@\z(["']\)+ end=+\z1+ contains=@Spell
-syn region  dartRawString     start=+r\z(["']\)+ end=+\z1+ contains=@Spell
-syn region  dartMultilineString     start=+\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@Spell,dartInterpolation,dartSpecialChar
-syn region  dartRawMultilineString     start=+r\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@Spell
-syn match   dartInterpolation contained "\$\(\w\+\|{[^}]\+}\)"
-syn match   dartSpecialChar   contained "\\\(u\x\{4\}\|u{\x\+}\|x\x\x\|x{\x\+}\|.\)"
-
-" Numbers
-syn match dartNumber         "\<\d\+\(\.\d\+\)\=\>"
-
-syn match dartInclude_DEPRECATED        "^#\(import\|include\|source\|library\)(\(\"[^\"]\+\"\|'[^']\+'\));"
-syn match dartInclude        "^\(import\|include\|source\|library\)\s"
-
-" The default highlighting.
-command! -nargs=+ HiLink hi def link <args>
-HiLink dartVarArg          Function
-HiLink dartBranch          Conditional
-HiLink dartUserLabelRef    dartUserLabel
-HiLink dartLabel           Label
-HiLink dartUserLabel       Label
-HiLink dartConditional     Conditional
-HiLink dartRepeat          Repeat
-HiLink dartExceptions      Exception
-HiLink dartExceptions_DEPRECATED      Todo
-HiLink dartAssert          Statement
-HiLink dartStorageClass    StorageClass
-HiLink dartClassDecl       dartStorageClass
-HiLink dartBoolean         Boolean
-HiLink dartString          String
-HiLink dartRawString_DEPRECATED       Todo
-HiLink dartRawString       String
-HiLink dartMultilineString String
-HiLink dartRawMultilineString String
-HiLink dartNumber          Number
-HiLink dartStatement       Statement
-HiLink dartOperator        Operator
-HiLink dartComment         Comment
-HiLink dartLineComment     Comment
-HiLink dartLineDocComment  Comment
-HiLink dartConstant        Constant
-HiLink dartTypedef         Typedef
-HiLink dartTodo            Todo
-HiLink dartKeyword         Keyword
-HiLink dartType            Type
-HiLink dartInterpolation   PreProc
-HiLink dartDocLink         SpecialComment
-HiLink dartSpecialChar     SpecialChar
-HiLink dartInclude_DEPRECATED         Todo
-HiLink dartInclude         Include
-HiLink dartErrors          Error
-HiLink dartCommonInterfaces Type
-HiLink dartInterfaces       Type
-HiLink dartInterfaces_DEPRECATED       Todo
-delcommand HiLink
-
-let b:current_syntax = "dart"
-
-if main_syntax == 'dart'
-  unlet main_syntax
-endif
-
-let b:spell_options="contained"
-
-" Enable automatic indentation (2 spaces)
-set expandtab
-set shiftwidth=2
-set softtabstop=2
-set cindent
diff --git a/utils/pub/pub.gyp b/utils/pub/pub.gyp
index 9bc9ad2..bb1d429 100644
--- a/utils/pub/pub.gyp
+++ b/utils/pub/pub.gyp
@@ -9,7 +9,7 @@
       'type': 'none',
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
-        '../../pkg/pkg.gyp:pkg_packages',
+        '../../pkg/pkg.gyp:pub_packages',
         '../../pkg/pkg_files.gyp:pkg_files_stamp',
         '../../utils/compiler/compiler.gyp:dart2js_files_stamp',
         'pub_files_stamp'
@@ -29,13 +29,41 @@
           ],
           'action': [
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
-            '--package-root=<(PRODUCT_DIR)/packages/',
+            '--package-root=<(PRODUCT_DIR)/pub_packages/',
             '--snapshot=<(SHARED_INTERMEDIATE_DIR)/pub.dart.snapshot',
             '../../sdk/lib/_internal/pub/bin/pub.dart',
           ],
         },
       ],
     },
+    {
+      'target_name': 'core_stubs',
+      'type': 'none',
+      'dependencies': [
+        '../../runtime/dart-runtime.gyp:dart',
+        '../../pkg/pkg.gyp:pkg_packages',
+        '../../pkg/pkg_files.gyp:pkg_files_stamp'
+      ],
+      'actions': [
+        {
+          'action_name': 'generate_core_stubs',
+          'inputs': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '../../sdk/lib/_internal/libraries.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/pkg_files.stamp',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/core_stubs/dart_io.dart',
+          ],
+          'action': [
+            '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)dart<(EXECUTABLE_SUFFIX)',
+            '--package-root=<(PRODUCT_DIR)/packages/',
+            '../../pkg/stub_core_library/bin/stub_core_library.dart',
+            '<(SHARED_INTERMEDIATE_DIR)/core_stubs',
+          ],
+        }
+      ]
+    },
     # Other targets depend on pub files, but have to many inputs, which causes
     # issues on some platforms.
     # This target lists all the files in sdk/lib/_internal/pub,