Version 1.3.0-dev.5.0

svn merge -r 33684:34105 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@34106 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index 9079b82..fe96224 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -22,14 +22,14 @@
   if (options.shouldBatch) {
     BatchRunner.runAsBatch(args, (List<String> args) {
       CommandLineOptions options = CommandLineOptions.parse(args);
-      _runAnalyzer(options);
+      return _runAnalyzer(options, false);
     });
   } else {
     _runAnalyzer(options);
   }
 }
 
-void _runAnalyzer(CommandLineOptions options) {
+_runAnalyzer(CommandLineOptions options, [bool async = true]) {
   int startTime = JavaSystem.currentTimeMillis();
   if (!options.machineFormat) {
     stdout.writeln("Analyzing ${options.sourceFiles}...");
@@ -41,17 +41,21 @@
   if (!new File(sourcePath).existsSync()) {
     print('File not found: $sourcePath');
     exitCode = ErrorSeverity.ERROR.ordinal;
-    return;
+    return ErrorSeverity.ERROR;
   }
   // check that file is Dart file
   if (!AnalysisEngine.isDartFileName(sourcePath)) {
     print('$sourcePath is not a Dart file');
     exitCode = ErrorSeverity.ERROR.ordinal;
-    return;
+    return ErrorSeverity.ERROR;
   }
   // do analyze
   AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
-  analyzer.analyze();
+  if (async) {
+    return analyzer.analyzeAsync();
+  } else {
+    return analyzer.analyzeSync();
+  }
 }
 
 typedef ErrorSeverity BatchRunnerHandler(List<String> args);
@@ -89,8 +93,6 @@
         args.addAll(lineArgs);
         args.remove('-b');
         args.remove('--batch');
-        // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
-        args.remove('-batch');
       }
       // analyze single set of arguments
       try {
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 38942e3..fc9cfa1 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -52,7 +52,8 @@
 ///
 /// If [name] is passed, it's used in error messages as the name of the code
 /// being parsed.
-CompilationUnit parseCompilationUnit(String contents, {String name}) {
+CompilationUnit parseCompilationUnit(String contents,
+    {String name, bool suppressErrors: false}) {
   if (name == null) name = '<unknown source>';
   var source = new StringSource(contents, name);
   var errorCollector = new _ErrorCollector();
@@ -63,7 +64,7 @@
   var unit = parser.parseCompilationUnit(token);
   unit.lineInfo = new LineInfo(scanner.lineStarts);
 
-  if (errorCollector.hasErrors) throw errorCollector.group;
+  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
 
   return unit;
 }
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 69685d2..efc97a1 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -10,15 +10,18 @@
 
 import 'package:path/path.dart' as pathos;
 
-import 'generated/java_io.dart';
+import 'generated/ast.dart';
 import 'generated/engine.dart';
+import 'generated/element.dart';
 import 'generated/error.dart';
-import 'generated/source_io.dart';
+import 'generated/java_io.dart';
 import 'generated/sdk.dart';
 import 'generated/sdk_io.dart';
-import 'generated/element.dart';
+import 'generated/source_io.dart';
 import '../options.dart';
 
+import 'dart:collection';
+
 import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
 import 'package:analyzer/src/error_formatter.dart';
 
@@ -38,6 +41,7 @@
   ContentCache contentCache = new ContentCache();
   SourceFactory sourceFactory;
   AnalysisContext context;
+  Source librarySource;
 
   /// All [Source]s references by the analyzed library.
   final Set<Source> sources = new Set<Source>();
@@ -45,6 +49,9 @@
   /// All [AnalysisErrorInfo]s in the analyzed library.
   final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
 
+  /// [HashMap] between sources and analysis error infos.
+  final HashMap<Source, AnalysisErrorInfo> sourceErrorsMap = new HashMap<Source, AnalysisErrorInfo>();
+
   AnalyzerImpl(this.sourcePath, this.options, this.startTime) {
     if (sdk == null) {
       sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
@@ -52,9 +59,27 @@
   }
 
   /**
-   * Treats the [sourcePath] as the top level library and analyzes it.
+   * Treats the [sourcePath] as the top level library and analyzes it using a
+   * synchronous algorithm over the analysis engine.
    */
-  void analyze() {
+  ErrorSeverity analyzeSync() {
+    setupForAnalysis();
+    return _analyzeSync();
+  }
+
+  /**
+   * Treats the [sourcePath] as the top level library and analyzes it using a
+   * asynchronous algorithm over the analysis engine.
+   */
+  void analyzeAsync() {
+    setupForAnalysis();
+    _analyzeAsync();
+  }
+
+  /**
+   * Setup local fields such as the analysis context for analysis.
+   */
+  void setupForAnalysis() {
     sources.clear();
     errorInfos.clear();
     if (sourcePath == null) {
@@ -62,34 +87,68 @@
     }
     JavaFile sourceFile = new JavaFile(sourcePath);
     UriKind uriKind = getUriKind(sourceFile);
-    Source librarySource = new FileBasedSource.con2(sourceFile, uriKind);
+    librarySource = new FileBasedSource.con2(sourceFile, uriKind);
 
     // prepare context
     prepareAnalysisContext(sourceFile, librarySource);
-
-    // async perform all tasks in context
-   _analyze();
   }
 
-  void _analyze() {
+  /// The sync version of analysis
+  ErrorSeverity _analyzeSync() {
+    // don't try to analyzer parts
+    var unit = context.parseCompilationUnit(librarySource);
+    var hasLibraryDirective = false;
+    var hasPartOfDirective = false;
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) hasLibraryDirective = true;
+      if (directive is PartOfDirective) hasPartOfDirective = true;
+    }
+    if (hasPartOfDirective && !hasLibraryDirective) {
+      print("Only libraries can be analyzed.");
+      print("$sourcePath is a part and can not be analyzed.");
+      return ErrorSeverity.ERROR;
+    }
+    // resolve library
+    var libraryElement = context.computeLibraryElement(librarySource);
+    // prepare source and errors
+    prepareSources(libraryElement);
+    prepareErrors();
+
+    // print errors and performance numbers
+    _printErrorsAndPerf();
+
+    // compute max severity and set exitCode
+    ErrorSeverity status = maxErrorSeverity;
+    if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
+      status = ErrorSeverity.ERROR;
+    }
+    return status;
+  }
+
+  /// The async version of the analysis
+  void _analyzeAsync() {
     new Future(context.performAnalysisTask).then((AnalysisResult result) {
       List<ChangeNotice> notices = result.changeNotices;
-      // TODO(jwren) change 'notices != null' to 'result.hasMoreWork()' after
-      // next dart translation is landed for the analyzer
-      if (notices != null) {
+      if (result.hasMoreWork) {
         // There is more work, record the set of sources, and then call self
         // again to perform next task
         for (ChangeNotice notice in notices) {
           sources.add(notice.source);
+          sourceErrorsMap[notice.source] = notice;
         }
-        return _analyze();
+        return _analyzeAsync();
       }
       //
       // There are not any more tasks, set error code and print performance
       // numbers.
       //
       // prepare errors
-      prepareErrors();
+      sourceErrorsMap.forEach((k,v) {
+        errorInfos.add(sourceErrorsMap[k]);
+      });
+
+      // print errors and performance numbers
+      _printErrorsAndPerf();
 
       // compute max severity and set exitCode
       ErrorSeverity status = maxErrorSeverity;
@@ -97,38 +156,48 @@
         status = ErrorSeverity.ERROR;
       }
       exitCode = status.ordinal;
-
-      // print errors
-      ErrorFormatter formatter = new ErrorFormatter(stdout, options);
-      formatter.formatErrors(errorInfos);
-
-      // print performance numbers
-      if (options.perf) {
-        int totalTime = JavaSystem.currentTimeMillis() - startTime;
-        int ioTime = PerformanceStatistics.io.result;
-        int scanTime = PerformanceStatistics.scan.result;
-        int parseTime = PerformanceStatistics.parse.result;
-        int resolveTime = PerformanceStatistics.resolve.result;
-        int errorsTime = PerformanceStatistics.errors.result;
-        int hintsTime = PerformanceStatistics.hints.result;
-        int angularTime = PerformanceStatistics.angular.result;
-        stdout.writeln("io:$ioTime");
-        stdout.writeln("scan:$scanTime");
-        stdout.writeln("parse:$parseTime");
-        stdout.writeln("resolve:$resolveTime");
-        stdout.writeln("errors:$errorsTime");
-        stdout.writeln("hints:$hintsTime");
-        stdout.writeln("angular:$angularTime");
-        stdout.writeln("other:${totalTime
-             - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
-             + angularTime)}");
-        stdout.writeln("total:$totalTime");
-      }
     }).catchError((ex, st) {
       AnalysisEngine.instance.logger.logError("${ex}\n${st}");
     });
   }
 
+  _printErrorsAndPerf() {
+    // The following is a hack. We currently print out to stderr to ensure that
+    // when in batch mode we print to stderr, this is because the prints from
+    // batch are made to stderr. The reason that options.shouldBatch isn't used
+    // is because when the argument flags are constructed in BatchRunner and
+    // passed in from batch mode which removes the batch flag to prevent the
+    // "cannot have the batch flag and source file" error message.
+    IOSink sink = options.machineFormat ? stderr : stdout;
+
+    // print errors
+    ErrorFormatter formatter = new ErrorFormatter(sink, options);
+    formatter.formatErrors(errorInfos);
+
+    // print performance numbers
+    if (options.perf) {
+      int totalTime = JavaSystem.currentTimeMillis() - startTime;
+      int ioTime = PerformanceStatistics.io.result;
+      int scanTime = PerformanceStatistics.scan.result;
+      int parseTime = PerformanceStatistics.parse.result;
+      int resolveTime = PerformanceStatistics.resolve.result;
+      int errorsTime = PerformanceStatistics.errors.result;
+      int hintsTime = PerformanceStatistics.hints.result;
+      int angularTime = PerformanceStatistics.angular.result;
+      stdout.writeln("io:$ioTime");
+      stdout.writeln("scan:$scanTime");
+      stdout.writeln("parse:$parseTime");
+      stdout.writeln("resolve:$resolveTime");
+      stdout.writeln("errors:$errorsTime");
+      stdout.writeln("hints:$hintsTime");
+      stdout.writeln("angular:$angularTime");
+      stdout.writeln("other:${totalTime
+          - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
+          + angularTime)}");
+      stdout.writeln("total:$totalTime");
+   }
+  }
+
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
   ErrorSeverity get maxErrorSeverity {
     var status = ErrorSeverity.NONE;
@@ -213,6 +282,13 @@
     }
   }
 
+  /// Fills [sources].
+  void prepareSources(LibraryElement library) {
+    var units = new Set<CompilationUnitElement>();
+    var libraries = new Set<LibraryElement>();
+    addLibrarySources(library, libraries, units);
+  }
+
   /// Fills [errorInfos] using [sources].
   void prepareErrors() {
     for (Source source in sources) {
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 58ce80b..ce52c18 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -270,8 +270,10 @@
    * @param arguments the arguments to the constructor being invoked, or `null` if this
    *          annotation is not the invocation of a constructor
    */
-  Annotation(this.atSign, Identifier name, this.period, SimpleIdentifier constructorName, ArgumentList arguments) {
+  Annotation(Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments) {
+    this.atSign = atSign;
     this._name = becomeParentOf(name);
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._arguments = becomeParentOf(arguments);
   }
@@ -402,7 +404,8 @@
    * @param question the token representing the question mark
    * @param identifier the identifier representing the argument being tested
    */
-  ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
+  ArgumentDefinitionTest(Token question, SimpleIdentifier identifier) {
+    this.question = question;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -772,8 +775,12 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  AssertStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, this.semicolon) {
+  AssertStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
+    this.semicolon = semicolon;
   }
 
   @override
@@ -852,8 +859,9 @@
    * @param operator the assignment operator being applied
    * @param rightHandSide the expression used to compute the right hand side
    */
-  AssignmentExpression(Expression leftHandSide, this.operator, Expression rightHandSide) {
+  AssignmentExpression(Expression leftHandSide, Token operator, Expression rightHandSide) {
     this._leftHandSide = becomeParentOf(leftHandSide);
+    this.operator = operator;
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
 
@@ -1498,8 +1506,9 @@
    * @param operator the binary operator being applied
    * @param rightOperand the expression used to compute the right operand
    */
-  BinaryExpression(Expression leftOperand, this.operator, Expression rightOperand) {
+  BinaryExpression(Expression leftOperand, Token operator, Expression rightOperand) {
     this._leftOperand = becomeParentOf(leftOperand);
+    this.operator = operator;
     this._rightOperand = becomeParentOf(rightOperand);
   }
 
@@ -1683,9 +1692,11 @@
    * @param statements the statements contained in the block
    * @param rightBracket the right curly bracket
    */
-  Block(this.leftBracket, List<Statement> statements, this.rightBracket) {
+  Block(Token leftBracket, List<Statement> statements, Token rightBracket) {
     this._statements = new NodeList<Statement>(this);
+    this.leftBracket = leftBracket;
     this._statements.addAll(statements);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -1790,7 +1801,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  BooleanLiteral(this.literal, this.value);
+  BooleanLiteral(Token literal, bool value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
@@ -1840,8 +1854,10 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  BreakStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+  BreakStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+    this.keyword = keyword;
     this._label = becomeParentOf(label);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -2032,10 +2048,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the catch block
    */
-  CatchClause(this.onKeyword, TypeName exceptionType, this.catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, this.comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
+  CatchClause(Token onKeyword, TypeName exceptionType, Token catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, Token comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
+    this.onKeyword = onKeyword;
     this.exceptionType = becomeParentOf(exceptionType);
+    this.catchKeyword = catchKeyword;
     this._leftParenthesis = leftParenthesis;
     this._exceptionParameter = becomeParentOf(exceptionParameter);
+    this.comma = comma;
     this._stackTraceParameter = becomeParentOf(stackTraceParameter);
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
@@ -2232,14 +2251,18 @@
    * @param members the members defined by the class
    * @param rightBracket the right curly bracket
    */
-  ClassDeclaration(Comment comment, List<Annotation> metadata, this.abstractKeyword, this.classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, this.leftBracket, List<ClassMember> members, this.rightBracket) : super(comment, metadata) {
+  ClassDeclaration(Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket) : super(comment, metadata) {
     this._members = new NodeList<ClassMember>(this);
+    this.abstractKeyword = abstractKeyword;
+    this.classKeyword = classKeyword;
     this._name = becomeParentOf(name);
     this.typeParameters = becomeParentOf(typeParameters);
     this._extendsClause = becomeParentOf(extendsClause);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
+    this.leftBracket = leftBracket;
     this._members.addAll(members);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -2486,9 +2509,11 @@
    * @param implementsClause the implements clause for this class
    * @param semicolon the semicolon terminating the declaration
    */
-  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, this.equals, this.abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
+  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
     this._name = becomeParentOf(name);
     this._typeParameters = becomeParentOf(typeParameters);
+    this.equals = equals;
+    this.abstractKeyword = abstractKeyword;
     this._superclass = becomeParentOf(superclass);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
@@ -2614,7 +2639,9 @@
    * @param keyword the keyword specifying what kind of processing is to be done on the imported
    *          names
    */
-  Combinator(this.keyword);
+  Combinator(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   Token get beginToken => keyword;
@@ -2677,7 +2704,7 @@
   /**
    * The tokens representing the comment.
    */
-  final List<Token> tokens;
+  List<Token> tokens;
 
   /**
    * The type of the comment.
@@ -2697,8 +2724,9 @@
    * @param type the type of the comment
    * @param references the references embedded within the documentation comment
    */
-  Comment(this.tokens, CommentType type, List<CommentReference> references) {
+  Comment(List<Token> tokens, CommentType type, List<CommentReference> references) {
     this._references = new NodeList<CommentReference>(this);
+    this.tokens = tokens;
     this._type = type;
     this._references.addAll(references);
   }
@@ -2797,7 +2825,8 @@
    * @param newKeyword the token representing the 'new' keyword
    * @param identifier the identifier being referenced
    */
-  CommentReference(this.newKeyword, Identifier identifier) {
+  CommentReference(Token newKeyword, Identifier identifier) {
+    this.newKeyword = newKeyword;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -2860,7 +2889,7 @@
   /**
    * The first token in the token stream that was parsed to form this compilation unit.
    */
-  final Token beginToken;
+  Token beginToken;
 
   /**
    * The script tag at the beginning of the compilation unit, or `null` if there is no script
@@ -2882,7 +2911,7 @@
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  final Token endToken;
+  Token endToken;
 
   /**
    * The element associated with this compilation unit, or `null` if the AST structure has not
@@ -2904,12 +2933,14 @@
    * @param declarations the declarations contained in this compilation unit
    * @param endToken the last token in the token stream
    */
-  CompilationUnit(this.beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, this.endToken) {
+  CompilationUnit(Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken) {
     this._directives = new NodeList<Directive>(this);
     this._declarations = new NodeList<CompilationUnitMember>(this);
+    this.beginToken = beginToken;
     this._scriptTag = becomeParentOf(scriptTag);
     this._directives.addAll(directives);
     this._declarations.addAll(declarations);
+    this.endToken = endToken;
   }
 
   @override
@@ -3071,9 +3102,11 @@
    * @param elseExpression the expression that is executed if the condition evaluates to
    *          `false`
    */
-  ConditionalExpression(Expression condition, this.question, Expression thenExpression, this.colon, Expression elseExpression) {
+  ConditionalExpression(Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression) {
     this._condition = becomeParentOf(condition);
+    this.question = question;
     this._thenExpression = becomeParentOf(thenExpression);
+    this.colon = colon;
     this._elseExpression = becomeParentOf(elseExpression);
   }
 
@@ -3257,11 +3290,16 @@
    *          redirected
    * @param body the body of the constructor
    */
-  ConstructorDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.constKeyword, this.factoryKeyword, Identifier returnType, this.period, SimpleIdentifier name, FormalParameterList parameters, this.separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
+  ConstructorDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
     this._initializers = new NodeList<ConstructorInitializer>(this);
+    this.externalKeyword = externalKeyword;
+    this.constKeyword = constKeyword;
+    this.factoryKeyword = factoryKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.period = period;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
+    this.separator = separator;
     this._initializers.addAll(initializers);
     this._redirectedConstructor = becomeParentOf(redirectedConstructor);
     this._body = becomeParentOf(body);
@@ -3458,8 +3496,11 @@
    * @param equals the token for the equal sign between the field name and the expression
    * @param expression the expression computing the value to which the field will be initialized
    */
-  ConstructorFieldInitializer(this.keyword, this.period, SimpleIdentifier fieldName, this.equals, Expression expression) {
+  ConstructorFieldInitializer(Token keyword, Token period, SimpleIdentifier fieldName, Token equals, Expression expression) {
+    this.keyword = keyword;
+    this.period = period;
     this._fieldName = becomeParentOf(fieldName);
+    this.equals = equals;
     this._expression = becomeParentOf(expression);
   }
 
@@ -3570,8 +3611,9 @@
    * @param period the token for the period before the constructor name
    * @param name the name of the constructor
    */
-  ConstructorName(TypeName type, this.period, SimpleIdentifier name) {
+  ConstructorName(TypeName type, Token period, SimpleIdentifier name) {
     this._type = becomeParentOf(type);
+    this.period = period;
     this._name = becomeParentOf(name);
   }
 
@@ -3679,8 +3721,10 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ContinueStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+  ContinueStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+    this.keyword = keyword;
     this._label = becomeParentOf(label);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -3772,7 +3816,8 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  DeclaredIdentifier(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+  DeclaredIdentifier(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
     this._identifier = becomeParentOf(identifier);
   }
@@ -3894,8 +3939,10 @@
    * @param separator the token separating the parameter from the default value
    * @param defaultValue the expression computing the default value for the parameter
    */
-  DefaultFormalParameter(NormalFormalParameter parameter, this.kind, this.separator, Expression defaultValue) {
+  DefaultFormalParameter(NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue) {
     this._parameter = becomeParentOf(parameter);
+    this.kind = kind;
+    this.separator = separator;
     this._defaultValue = becomeParentOf(defaultValue);
   }
 
@@ -4072,11 +4119,14 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  DoStatement(this.doKeyword, Statement body, this.whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, this.semicolon) {
+  DoStatement(Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+    this.doKeyword = doKeyword;
     this._body = becomeParentOf(body);
+    this.whileKeyword = whileKeyword;
     this._leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
     this._rightParenthesis = rightParenthesis;
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4188,7 +4238,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  DoubleLiteral(this.literal, this.value);
+  DoubleLiteral(Token literal, double value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
@@ -4224,7 +4277,9 @@
    *
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  EmptyFunctionBody(this.semicolon);
+  EmptyFunctionBody(Token semicolon) {
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
@@ -4259,7 +4314,9 @@
    *
    * @param semicolon the semicolon terminating the statement
    */
-  EmptyStatement(this.semicolon);
+  EmptyStatement(Token semicolon) {
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
@@ -4517,8 +4574,10 @@
    * @param expression the expression representing the body of the function
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionFunctionBody(this.functionDefinition, Expression expression, this.semicolon) {
+  ExpressionFunctionBody(Token functionDefinition, Expression expression, Token semicolon) {
+    this.functionDefinition = functionDefinition;
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4583,8 +4642,9 @@
    * @param expression the expression that comprises the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionStatement(Expression expression, this.semicolon) {
+  ExpressionStatement(Expression expression, Token semicolon) {
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4652,7 +4712,8 @@
    * @param keyword the token representing the 'extends' keyword
    * @param superclass the name of the class that is being extended
    */
-  ExtendsClause(this.keyword, TypeName superclass) {
+  ExtendsClause(Token keyword, TypeName superclass) {
+    this.keyword = keyword;
     this._superclass = becomeParentOf(superclass);
   }
 
@@ -4721,8 +4782,10 @@
    * @param fieldList the fields being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  FieldDeclaration(Comment comment, List<Annotation> metadata, this.staticKeyword, VariableDeclarationList fieldList, this.semicolon) : super(comment, metadata) {
+  FieldDeclaration(Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon) : super(comment, metadata) {
+    this.staticKeyword = staticKeyword;
     this._fieldList = becomeParentOf(fieldList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4822,8 +4885,11 @@
    * @param parameters the parameters of the function-typed parameter, or `null` if this is
    *          not a function-typed field formal parameter
    */
-  FieldFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, this.thisToken, this.period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+  FieldFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, Token thisToken, Token period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
+    this.thisToken = thisToken;
+    this.period = period;
     this._parameters = becomeParentOf(parameters);
   }
 
@@ -4954,9 +5020,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con1(this.forKeyword, this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+  ForEachStatement.con1(Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._loopVariable = becomeParentOf(loopVariable);
+    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -4970,9 +5040,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con2(this.forKeyword, this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+  ForEachStatement.con2(Token forKeyword, Token leftParenthesis, SimpleIdentifier identifier, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._identifier = becomeParentOf(identifier);
+    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5144,12 +5218,17 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForStatement(this.forKeyword, this.leftParenthesis, VariableDeclarationList variableList, Expression initialization, this.leftSeparator, Expression condition, this.rightSeparator, List<Expression> updaters, this.rightParenthesis, Statement body) {
+  ForStatement(Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body) {
     this._updaters = new NodeList<Expression>(this);
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._variableList = becomeParentOf(variableList);
     this._initialization = becomeParentOf(initialization);
+    this.leftSeparator = leftSeparator;
     this._condition = becomeParentOf(condition);
+    this.rightSeparator = rightSeparator;
     this._updaters.addAll(updaters);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5548,8 +5627,10 @@
    * @param name the name of the function
    * @param functionExpression the function expression being wrapped
    */
-  FunctionDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, TypeName returnType, this.propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+  FunctionDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+    this.externalKeyword = externalKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.propertyKeyword = propertyKeyword;
     this._name = becomeParentOf(name);
     this._functionExpression = becomeParentOf(functionExpression);
   }
@@ -6331,9 +6412,13 @@
    * @param elseKeyword the token representing the 'else' keyword
    * @param elseStatement the statement that is executed if the condition evaluates to `false`
    */
-  IfStatement(this.ifKeyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement thenStatement, this.elseKeyword, Statement elseStatement) {
+  IfStatement(Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement) {
+    this.ifKeyword = ifKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
     this._thenStatement = becomeParentOf(thenStatement);
+    this.elseKeyword = elseKeyword;
     this._elseStatement = becomeParentOf(elseStatement);
   }
 
@@ -6437,8 +6522,9 @@
    * @param keyword the token representing the 'implements' keyword
    * @param interfaces the interfaces that are being implemented
    */
-  ImplementsClause(this.keyword, List<TypeName> interfaces) {
+  ImplementsClause(Token keyword, List<TypeName> interfaces) {
     this._interfaces = new NodeList<TypeName>(this);
+    this.keyword = keyword;
     this._interfaces.addAll(interfaces);
   }
 
@@ -6587,7 +6673,8 @@
    * @param combinators the combinators used to control how names are imported
    * @param semicolon the semicolon terminating the directive
    */
-  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, this.asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+    this.asToken = asToken;
     this._prefix = becomeParentOf(prefix);
   }
 
@@ -6711,7 +6798,8 @@
    * @param index the expression used to compute the index
    * @param rightBracket the right square bracket
    */
-  IndexExpression.forCascade(this.period, Token leftBracket, Expression index, Token rightBracket) {
+  IndexExpression.forCascade(Token period, Token leftBracket, Expression index, Token rightBracket) {
+    this.period = period;
     this._leftBracket = leftBracket;
     this._index = becomeParentOf(index);
     this._rightBracket = rightBracket;
@@ -7020,7 +7108,8 @@
    * @param constructorName the name of the constructor to be invoked
    * @param argumentList the list of arguments to the constructor
    */
-  InstanceCreationExpression(this.keyword, ConstructorName constructorName, ArgumentList argumentList) {
+  InstanceCreationExpression(Token keyword, ConstructorName constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
     this.constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -7100,7 +7189,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  IntegerLiteral(this.literal, this.value);
+  IntegerLiteral(Token literal, int value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
@@ -7163,8 +7255,10 @@
    * @param expression the expression to be evaluated for the value to be converted into a string
    * @param rightBracket the right curly bracket
    */
-  InterpolationExpression(this.leftBracket, Expression expression, this.rightBracket) {
+  InterpolationExpression(Token leftBracket, Expression expression, Token rightBracket) {
+    this.leftBracket = leftBracket;
     this._expression = becomeParentOf(expression);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -7318,8 +7412,10 @@
    * @param notOperator the not operator, or `null` if the sense of the test is not negated
    * @param type the name of the type being tested for
    */
-  IsExpression(Expression expression, this.isOperator, this.notOperator, TypeName type) {
+  IsExpression(Expression expression, Token isOperator, Token notOperator, TypeName type) {
     this._expression = becomeParentOf(expression);
+    this.isOperator = isOperator;
+    this.notOperator = notOperator;
     this._type = becomeParentOf(type);
   }
 
@@ -7400,8 +7496,9 @@
    * @param label the label being applied
    * @param colon the colon that separates the label from whatever follows
    */
-  Label(SimpleIdentifier label, this.colon) {
+  Label(SimpleIdentifier label, Token colon) {
     this._label = becomeParentOf(label);
+    this.colon = colon;
   }
 
   @override
@@ -7544,8 +7641,10 @@
    * @param name the name of the library being defined
    * @param semicolon the semicolon terminating the directive
    */
-  LibraryDirective(Comment comment, List<Annotation> metadata, this.libraryToken, LibraryIdentifier name, this.semicolon) : super(comment, metadata) {
+  LibraryDirective(Comment comment, List<Annotation> metadata, Token libraryToken, LibraryIdentifier name, Token semicolon) : super(comment, metadata) {
+    this.libraryToken = libraryToken;
     this._name = becomeParentOf(name);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -7920,8 +8019,9 @@
    * @param separator the colon that separates the key from the value
    * @param value the expression computing the value that will be associated with the key
    */
-  MapLiteralEntry(Expression key, this.separator, Expression value) {
+  MapLiteralEntry(Expression key, Token separator, Expression value) {
     this._key = becomeParentOf(key);
+    this.separator = separator;
     this._value = becomeParentOf(value);
   }
 
@@ -8050,8 +8150,12 @@
    *          declares a getter
    * @param body the body of the method
    */
-  MethodDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.modifierKeyword, TypeName returnType, this.propertyKeyword, this.operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+  MethodDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+    this.externalKeyword = externalKeyword;
+    this.modifierKeyword = modifierKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.propertyKeyword = propertyKeyword;
+    this.operatorKeyword = operatorKeyword;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
@@ -8241,8 +8345,9 @@
    * @param methodName the name of the method being invoked
    * @param argumentList the list of arguments to the method
    */
-  MethodInvocation(Expression target, this.period, SimpleIdentifier methodName, ArgumentList argumentList) {
+  MethodInvocation(Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList) {
     this._target = becomeParentOf(target);
+    this.period = period;
     this._methodName = becomeParentOf(methodName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -8490,9 +8595,11 @@
    * @param combinators the combinators used to control which names are imported or exported
    * @param semicolon the semicolon terminating the directive
    */
-  NamespaceDirective(Comment comment, List<Annotation> metadata, this.keyword, StringLiteral libraryUri, List<Combinator> combinators, this.semicolon) : super(comment, metadata, libraryUri) {
+  NamespaceDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super(comment, metadata, libraryUri) {
     this._combinators = new NodeList<Combinator>(this);
+    this.keyword = keyword;
     this._combinators.addAll(combinators);
+    this.semicolon = semicolon;
   }
 
   /**
@@ -8538,7 +8645,10 @@
    * @param keyword the token representing the 'native' keyword
    * @param name the name of the native object that implements the class.
    */
-  NativeClause(this.keyword, this.name);
+  NativeClause(Token keyword, StringLiteral name) {
+    this.keyword = keyword;
+    this.name = name;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitNativeClause(this);
@@ -8568,7 +8678,7 @@
   /**
    * The token representing 'native' that marks the start of the function body.
    */
-  final Token nativeToken;
+  Token nativeToken;
 
   /**
    * The string literal, after the 'native' token.
@@ -8578,7 +8688,7 @@
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
-  final Token semicolon;
+  Token semicolon;
 
   /**
    * Initialize a newly created function body consisting of the 'native' token, a string literal,
@@ -8588,8 +8698,10 @@
    * @param stringLiteral the string literal
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  NativeFunctionBody(this.nativeToken, StringLiteral stringLiteral, this.semicolon) {
+  NativeFunctionBody(Token nativeToken, StringLiteral stringLiteral, Token semicolon) {
+    this.nativeToken = nativeToken;
     this._stringLiteral = becomeParentOf(stringLiteral);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -8915,7 +9027,10 @@
    * @param partUri the URI of the part being included
    * @param semicolon the semicolon terminating the directive
    */
-  PartDirective(Comment comment, List<Annotation> metadata, this.partToken, StringLiteral partUri, this.semicolon) : super(comment, metadata, partUri);
+  PartDirective(Comment comment, List<Annotation> metadata, Token partToken, StringLiteral partUri, Token semicolon) : super(comment, metadata, partUri) {
+    this.partToken = partToken;
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitPartDirective(this);
@@ -8972,8 +9087,11 @@
    * @param libraryName the name of the library that the containing compilation unit is part of
    * @param semicolon the semicolon terminating the directive
    */
-  PartOfDirective(Comment comment, List<Annotation> metadata, this.partToken, this.ofToken, LibraryIdentifier libraryName, this.semicolon) : super(comment, metadata) {
+  PartOfDirective(Comment comment, List<Annotation> metadata, Token partToken, Token ofToken, LibraryIdentifier libraryName, Token semicolon) : super(comment, metadata) {
+    this.partToken = partToken;
+    this.ofToken = ofToken;
     this._libraryName = becomeParentOf(libraryName);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -9050,8 +9168,9 @@
    * @param operand the expression computing the operand for the operator
    * @param operator the postfix operator being applied to the operand
    */
-  PostfixExpression(Expression operand, this.operator) {
+  PostfixExpression(Expression operand, Token operator) {
     this._operand = becomeParentOf(operand);
+    this.operator = operator;
   }
 
   @override
@@ -9225,7 +9344,8 @@
    * @param operator the prefix operator being applied to the operand
    * @param operand the expression computing the operand for the operator
    */
-  PrefixExpression(this.operator, Expression operand) {
+  PrefixExpression(Token operator, Expression operand) {
+    this.operator = operator;
     this._operand = becomeParentOf(operand);
   }
 
@@ -9394,8 +9514,9 @@
    * @param period the period used to separate the prefix from the identifier
    * @param identifier the prefix associated with the library in which the identifier is defined
    */
-  PrefixedIdentifier(SimpleIdentifier prefix, this.period, SimpleIdentifier identifier) {
+  PrefixedIdentifier(SimpleIdentifier prefix, Token period, SimpleIdentifier identifier) {
     this._prefix = becomeParentOf(prefix);
+    this.period = period;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -9513,8 +9634,9 @@
    * @param operator the property access operator
    * @param propertyName the name of the property being accessed
    */
-  PropertyAccess(Expression target, this.operator, SimpleIdentifier propertyName) {
+  PropertyAccess(Expression target, Token operator, SimpleIdentifier propertyName) {
     this._target = becomeParentOf(target);
+    this.operator = operator;
     this._propertyName = becomeParentOf(propertyName);
   }
 
@@ -9659,7 +9781,9 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  RedirectingConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+  RedirectingConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -9732,7 +9856,9 @@
    *
    * @param keyword the token representing the 'rethrow' keyword
    */
-  RethrowExpression(this.keyword);
+  RethrowExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
@@ -9783,8 +9909,10 @@
    * @param expression the expression computing the value to be returned
    * @param semicolon the semicolon terminating the statement
    */
-  ReturnStatement(this.keyword, Expression expression, this.semicolon) {
+  ReturnStatement(Token keyword, Expression expression, Token semicolon) {
+    this.keyword = keyword;
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -9839,7 +9967,9 @@
    *
    * @param scriptTag the token representing this script tag
    */
-  ScriptTag(this.scriptTag);
+  ScriptTag(Token scriptTag) {
+    this.scriptTag = scriptTag;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitScriptTag(this);
@@ -9930,7 +10060,8 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  SimpleFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+  SimpleFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
   }
 
@@ -10024,7 +10155,9 @@
    *
    * @param token the token representing the identifier
    */
-  SimpleIdentifier(this.token);
+  SimpleIdentifier(Token token) {
+    this.token = token;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
@@ -10299,7 +10432,8 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  SimpleStringLiteral(this.literal, String value) {
+  SimpleStringLiteral(Token literal, String value) {
+    this.literal = literal;
     this._value = StringUtilities.intern(value);
   }
 
@@ -10556,7 +10690,9 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  SuperConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+  SuperConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -10629,7 +10765,9 @@
    *
    * @param keyword the token representing the keyword
    */
-  SuperExpression(this.keyword);
+  SuperExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
@@ -10770,10 +10908,12 @@
    * @param colon the colon separating the keyword or the expression from the statements
    * @param statements the statements that will be executed if this switch member is selected
    */
-  SwitchMember(List<Label> labels, this.keyword, this.colon, List<Statement> statements) {
+  SwitchMember(List<Label> labels, Token keyword, Token colon, List<Statement> statements) {
     this._labels = new NodeList<Label>(this);
     this._statements = new NodeList<Statement>(this);
     this._labels.addAll(labels);
+    this.keyword = keyword;
+    this.colon = colon;
     this._statements.addAll(statements);
   }
 
@@ -10863,10 +11003,15 @@
    * @param members the switch members that can be selected by the expression
    * @param rightBracket the right curly bracket
    */
-  SwitchStatement(this.keyword, this.leftParenthesis, Expression expression, this.rightParenthesis, this.leftBracket, List<SwitchMember> members, this.rightBracket) {
+  SwitchStatement(Token keyword, Token leftParenthesis, Expression expression, Token rightParenthesis, Token leftBracket, List<SwitchMember> members, Token rightBracket) {
     this._members = new NodeList<SwitchMember>(this);
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._expression = becomeParentOf(expression);
+    this.rightParenthesis = rightParenthesis;
+    this.leftBracket = leftBracket;
     this._members.addAll(members);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -10926,7 +11071,7 @@
   /**
    * The components of the literal.
    */
-  final List<Token> components;
+  List<Token> components;
 
   /**
    * Initialize a newly created symbol literal.
@@ -10934,7 +11079,10 @@
    * @param poundSign the token introducing the literal
    * @param components the components of the literal
    */
-  SymbolLiteral(this.poundSign, this.components);
+  SymbolLiteral(Token poundSign, List<Token> components) {
+    this.poundSign = poundSign;
+    this.components = components;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
@@ -10969,7 +11117,9 @@
    *
    * @param keyword the token representing the keyword
    */
-  ThisExpression(this.keyword);
+  ThisExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitThisExpression(this);
@@ -11013,7 +11163,8 @@
    * @param keyword the token representing the 'throw' keyword
    * @param expression the expression computing the exception to be thrown
    */
-  ThrowExpression(this.keyword, Expression expression) {
+  ThrowExpression(Token keyword, Expression expression) {
+    this.keyword = keyword;
     this._expression = becomeParentOf(expression);
   }
 
@@ -11085,8 +11236,9 @@
    * @param variableList the top-level variables being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
+  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon) : super(comment, metadata) {
     this._variableList = becomeParentOf(variableList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -11172,10 +11324,12 @@
    * @param finallyKeyword the token representing the 'finally' keyword
    * @param finallyBlock the finally block contained in the try statement
    */
-  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
+  TryStatement(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock) {
     this._catchClauses = new NodeList<CatchClause>(this);
+    this.tryKeyword = tryKeyword;
     this._body = becomeParentOf(body);
     this._catchClauses.addAll(catchClauses);
+    this.finallyKeyword = finallyKeyword;
     this._finallyBlock = becomeParentOf(finallyBlock);
   }
 
@@ -11276,7 +11430,10 @@
    * @param keyword the token representing the 'typedef' keyword
    * @param semicolon the semicolon terminating the declaration
    */
-  TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
+  TypeAlias(Comment comment, List<Annotation> metadata, Token keyword, Token semicolon) : super(comment, metadata) {
+    this.keyword = keyword;
+    this.semicolon = semicolon;
+  }
 
   @override
   Token get endToken => semicolon;
@@ -11316,9 +11473,11 @@
    * @param arguments the type arguments associated with the type
    * @param rightBracket the right bracket
    */
-  TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
+  TypeArgumentList(Token leftBracket, List<TypeName> arguments, Token rightBracket) {
     this._arguments = new NodeList<TypeName>(this);
+    this.leftBracket = leftBracket;
     this._arguments.addAll(arguments);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11472,8 +11631,9 @@
    * @param keyword the token representing the 'extends' keyword
    * @param bound the name of the upper bound for legal arguments
    */
-  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
+  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound) : super(comment, metadata) {
     this._name = becomeParentOf(name);
+    this.keyword = keyword;
     this._bound = becomeParentOf(bound);
   }
 
@@ -11547,7 +11707,7 @@
   /**
    * The left angle bracket.
    */
-  final Token leftBracket;
+  Token leftBracket;
 
   /**
    * The type parameters in the list.
@@ -11557,7 +11717,7 @@
   /**
    * The right angle bracket.
    */
-  final Token rightBracket;
+  Token rightBracket;
 
   /**
    * Initialize a newly created list of type parameters.
@@ -11566,9 +11726,11 @@
    * @param typeParameters the type parameters in the list
    * @param rightBracket the right angle bracket
    */
-  TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
+  TypeParameterList(Token leftBracket, List<TypeParameter> typeParameters, Token rightBracket) {
     this._typeParameters = new NodeList<TypeParameter>(this);
+    this.leftBracket = leftBracket;
     this._typeParameters.addAll(typeParameters);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11622,7 +11784,8 @@
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    */
-  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
+  TypedLiteral(Token constKeyword, TypeArgumentList typeArguments) {
+    this.constKeyword = constKeyword;
     this.typeArguments = becomeParentOf(typeArguments);
   }
 
@@ -11739,8 +11902,9 @@
    * @param equals the equal sign separating the variable name from the initial value
    * @param initializer the expression used to compute the initial value for the variable
    */
-  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
+  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer) : super(comment, metadata) {
     this._name = becomeParentOf(name);
+    this.equals = equals;
     this._initializer = becomeParentOf(initializer);
   }
 
@@ -11883,8 +12047,9 @@
    * @param type the type of the variables being declared
    * @param variables a list containing the individual variables being declared
    */
-  VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
+  VariableDeclarationList(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
     this._variables = new NodeList<VariableDeclaration>(this);
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
     this._variables.addAll(variables);
   }
@@ -11977,8 +12142,9 @@
    * @param variableList the fields being declared
    * @param semicolon the semicolon terminating the statement
    */
-  VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
+  VariableDeclarationStatement(VariableDeclarationList variableList, Token semicolon) {
     this._variableList = becomeParentOf(variableList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -12055,8 +12221,11 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
+  WhileStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body) {
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 77901f8..a63eda8 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -206,7 +206,7 @@
   /**
    * The value of the expression.
    */
-  final DartObject value;
+  DartObject value;
 
   /**
    * The errors that should be reported for the expression(s) that were evaluated.
@@ -220,7 +220,8 @@
    * @param value the value of the expression
    * @param errors the errors that should be reported for the expression(s) that were evaluated
    */
-  EvaluationResult(this.value, List<AnalysisError> errors) {
+  EvaluationResult(DartObject value, List<AnalysisError> errors) {
+    this.value = value;
     this._errors = errors;
   }
 
@@ -1126,12 +1127,12 @@
   /**
    * The node against which the error should be reported.
    */
-  final AstNode node;
+  AstNode node;
 
   /**
    * The error code for the error to be generated.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * Initialize a newly created data holder to represent the error with the given code reported
@@ -1140,7 +1141,10 @@
    * @param node the node against which the error should be reported
    * @param errorCode the error code for the error to be generated
    */
-  ErrorResult_ErrorData(this.node, this.errorCode);
+  ErrorResult_ErrorData(AstNode node, ErrorCode errorCode) {
+    this.node = node;
+    this.errorCode = errorCode;
+  }
 }
 
 /**
@@ -1341,14 +1345,16 @@
   /**
    * The value of the expression.
    */
-  final DartObjectImpl value;
+  DartObjectImpl value;
 
   /**
    * Initialize a newly created result to represent the given value.
    *
    * @param value the value of the expression
    */
-  ValidResult(this.value);
+  ValidResult(DartObjectImpl value) {
+    this.value = value;
+  }
 
   @override
   EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
@@ -1786,7 +1792,7 @@
   /**
    * The value of this instance.
    */
-  final bool value;
+  bool value = false;
 
   /**
    * An instance representing the boolean value 'false'.
@@ -1816,7 +1822,9 @@
    *
    * @param value the value of this instance
    */
-  BoolState(this.value);
+  BoolState(bool value) {
+    this.value = value;
+  }
 
   @override
   BoolState convertToBool() => this;
@@ -1907,7 +1915,7 @@
   /**
    * The run-time type of this object.
    */
-  final InterfaceType type;
+  InterfaceType type;
 
   /**
    * The state of the object.
@@ -1920,7 +1928,8 @@
    * @param type the run-time type of this object
    * @param state the state of the object
    */
-  DartObjectImpl(this.type, InstanceState state) {
+  DartObjectImpl(InterfaceType type, InstanceState state) {
+    this.type = type;
     this._state = state;
   }
 
@@ -2356,7 +2365,7 @@
   /**
    * The value of this instance.
    */
-  final double value;
+  double value = 0.0;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -2368,7 +2377,9 @@
    *
    * @param value the value of this instance
    */
-  DoubleState(this.value);
+  DoubleState(double value) {
+    this.value = value;
+  }
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -2844,14 +2855,16 @@
   /**
    * The error code associated with the exception.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * Initialize a newly created exception to have the given error code.
    *
    * @param errorCode the error code associated with the exception
    */
-  EvaluationException(this.errorCode);
+  EvaluationException(ErrorCode errorCode) {
+    this.errorCode = errorCode;
+  }
 }
 
 /**
@@ -3387,7 +3400,7 @@
   /**
    * The value of this instance.
    */
-  final int value;
+  int value = 0;
 
   /**
    * A state that can be used to represent an int whose value is not known.
@@ -3399,7 +3412,9 @@
    *
    * @param value the value of this instance
    */
-  IntState(this.value);
+  IntState(int value) {
+    this.value = value;
+  }
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -4171,7 +4186,7 @@
   /**
    * The value of this instance.
    */
-  final String value;
+  String value;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -4183,7 +4198,9 @@
    *
    * @param value the value of this instance
    */
-  StringState(this.value);
+  StringState(String value) {
+    this.value = value;
+  }
 
   @override
   StringState concatenate(InstanceState rightOperand) {
@@ -4250,14 +4267,16 @@
   /**
    * The value of this instance.
    */
-  final String value;
+  String value;
 
   /**
    * Initialize a newly created state to represent the given value.
    *
    * @param value the value of this instance
    */
-  SymbolState(this.value);
+  SymbolState(String value) {
+    this.value = value;
+  }
 
   @override
   StringState convertToString() {
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9f273be..4cd44d6 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -603,6 +603,8 @@
    * This method is expensive, because resolved AST might be evicted from cache, so parsing and
    * resolving will be performed.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @return the resolved [AstNode], maybe `null` if [Element] is synthetic or
    *         isn't contained in a compilation unit, such as a [LibraryElement].
    */
@@ -847,14 +849,16 @@
   /**
    * The name displayed in the UI for this kind of element.
    */
-  final String displayName;
+  String displayName;
 
   /**
    * Initialize a newly created element kind to have the given display name.
    *
    * @param displayName the name displayed in the UI for this kind of element
    */
-  ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
+  ElementKind(String name, int ordinal, String displayName) : super(name, ordinal) {
+    this.displayName = displayName;
+  }
 }
 
 /**
@@ -1750,7 +1754,7 @@
   int get uriEnd;
 
   /**
-   * Return the offset of the URU in the file, or `-1` if this element is synthetic.
+   * Return the offset of the URI in the file, or `-1` if this element is synthetic.
    *
    * @return the offset of the URI
    */
@@ -2563,13 +2567,13 @@
    * The element based on propagated type information, or `null` if the AST structure has not
    * been resolved or if this identifier could not be resolved.
    */
-  final ExecutableElement propagatedElement;
+  ExecutableElement propagatedElement;
 
   /**
    * The element associated with this identifier based on static type information, or `null`
    * if the AST structure has not been resolved or if this identifier could not be resolved.
    */
-  final ExecutableElement staticElement;
+  ExecutableElement staticElement;
 
   /**
    * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
@@ -2577,7 +2581,10 @@
    * @param staticElement the static element
    * @param propagatedElement the propagated element
    */
-  AuxiliaryElements(this.staticElement, this.propagatedElement);
+  AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagatedElement) {
+    this.staticElement = staticElement;
+    this.propagatedElement = propagatedElement;
+  }
 }
 
 /**
@@ -3661,7 +3668,7 @@
   /**
    * The element representing the field, variable, or constructor being used as an annotation.
    */
-  final Element element;
+  Element element;
 
   /**
    * An empty array of annotations.
@@ -3695,7 +3702,9 @@
    * @param element the element representing the field, variable, or constructor being used as an
    *          annotation
    */
-  ElementAnnotationImpl(this.element);
+  ElementAnnotationImpl(Element element) {
+    this.element = element;
+  }
 
   @override
   bool get isDeprecated {
@@ -3796,8 +3805,9 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ElementImpl(String name, this.nameOffset) {
+  ElementImpl(String name, int nameOffset) {
     this._name = StringUtilities.intern(name);
+    this.nameOffset = nameOffset;
   }
 
   @override
@@ -4945,7 +4955,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The scripts contained in or referenced from script tags in the HTML file.
@@ -4969,7 +4979,9 @@
    * @param context the analysis context in which the HTML file is defined
    * @param name the name of this element
    */
-  HtmlElementImpl(this.context, String name) : super(name, -1);
+  HtmlElementImpl(AnalysisContext context, String name) : super(name, -1) {
+    this.context = context;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
@@ -5205,7 +5217,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The compilation unit that defines this library.
@@ -5244,7 +5256,9 @@
    * @param context the analysis context in which the library is defined
    * @param name the name of this element
    */
-  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
+  LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.forNode(name) {
+    this.context = context;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
@@ -5869,7 +5883,7 @@
   /**
    * The analysis context in which the multiply defined elements are defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The name of the conflicting elements.
@@ -5879,7 +5893,7 @@
   /**
    * A list containing all of the elements that conflict.
    */
-  final List<Element> conflictingElements;
+  List<Element> conflictingElements;
 
   /**
    * Initialize a newly created element to represent a list of conflicting elements.
@@ -5887,8 +5901,10 @@
    * @param context the analysis context in which the multiply defined elements are defined
    * @param conflictingElements the elements that conflict
    */
-  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
+  MultiplyDefinedElementImpl(AnalysisContext context, List<Element> conflictingElements) {
+    this.context = context;
     _name = conflictingElements[0].name;
+    this.conflictingElements = conflictingElements;
   }
 
   @override
@@ -6595,7 +6611,7 @@
  */
 abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
   /**
-   * The offset of the URU in the file, may be `-1` if synthetic.
+   * The offset of the URI in the file, may be `-1` if synthetic.
    */
   int uriOffset = -1;
 
@@ -6752,16 +6768,19 @@
  * Information about Angular application.
  */
 class AngularApplication {
-  final Source entryPoint;
+  Source entryPoint;
 
   Set<Source> _librarySources;
 
-  final List<AngularElement> elements;
+  List<AngularElement> elements;
 
-  final List<Source> elementSources;
+  List<Source> elementSources;
 
-  AngularApplication(this.entryPoint, Set<Source> librarySources, this.elements, this.elementSources) {
+  AngularApplication(Source entryPoint, Set<Source> librarySources, List<AngularElement> elements, List<Source> elementSources) {
+    this.entryPoint = entryPoint;
     this._librarySources = librarySources;
+    this.elements = elements;
+    this.elementSources = elementSources;
   }
 
   /**
@@ -7111,7 +7130,7 @@
   /**
    * The type of the property
    */
-  final DartType type;
+  DartType type;
 
   /**
    * Initialize a newly created Angular scope property to have the given name.
@@ -7120,7 +7139,9 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
+  AngularScopePropertyElementImpl(String name, int nameOffset, DartType type) : super(name, nameOffset) {
+    this.type = type;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
@@ -7172,12 +7193,12 @@
   /**
    * The HTML template URI.
    */
-  final String templateUri;
+  String templateUri;
 
   /**
    * The offset of the [templateUri] in the [getSource].
    */
-  final int templateUriOffset;
+  int templateUriOffset = 0;
 
   /**
    * The HTML template source.
@@ -7187,7 +7208,10 @@
   /**
    * Initialize a newly created Angular view.
    */
-  AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
+  AngularViewElementImpl(String templateUri, int templateUriOffset) : super(null, -1) {
+    this.templateUri = templateUri;
+    this.templateUriOffset = templateUriOffset;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
@@ -7223,11 +7247,14 @@
  * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
  */
 class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  final String tagName;
+  String tagName;
 
-  final String attributeName;
+  String attributeName;
 
-  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
+  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super(null, -1) {
+    this.tagName = tagName;
+    this.attributeName = attributeName;
+  }
 
   @override
   bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
@@ -9501,7 +9528,7 @@
   /**
    * The name of this type, or `null` if the type does not have a name.
    */
-  final String name;
+  String name;
 
   /**
    * An empty array of types.
@@ -9514,8 +9541,9 @@
    * @param element the element representing the declaration of the type
    * @param name the name of the type
    */
-  TypeImpl(Element element, this.name) {
+  TypeImpl(Element element, String name) {
     this._element = element;
+    this.name = name;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 9fa7af5..be82258 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -212,6 +212,8 @@
    * have a documentation comment associated with it. This can be a long-running operation if the
    * information needed to access the comment is not cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param element the element whose documentation comment is to be returned
    * @return the element's documentation comment
    * @throws AnalysisException if the documentation comment could not be determined because the
@@ -224,7 +226,7 @@
    * are not already known then the source will be analyzed in order to determine the errors
    * associated with it.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose errors are to be returned
    * @return all of the errors associated with the given source
@@ -241,7 +243,7 @@
    * libraries that are defined in it (via script tags) that also need to have a model built for
    * them.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source defining the HTML file whose element model is to be returned
    * @return the element model corresponding to the HTML file defined by the given source
@@ -255,7 +257,7 @@
    * Return the kind of the given source, computing it's kind if it is not already known. Return
    * [SourceKind#UNKNOWN] if the source is not contained in this context.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose kind is to be returned
    * @return the kind of the given source
@@ -269,6 +271,8 @@
    * for a library can long-running, depending on the size of the library and the number of
    * libraries that are imported into it that also need to have a model built for them.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param source the source defining the library whose element model is to be returned
    * @return the element model corresponding to the library defined by the given source
    * @throws AnalysisException if the element model could not be determined because the analysis
@@ -283,7 +287,7 @@
    * known it will be created. The line information is used to map offsets from the beginning of the
    * source to line and column pairs.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose line information is to be returned
    * @return the line information for the given source
@@ -603,7 +607,7 @@
    * Parse a single source to produce an AST structure. The resulting AST structure may or may not
    * be resolved, and may have a slightly different structure depending upon whether it is resolved.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source to be parsed
    * @return the AST structure representing the content of the source
@@ -616,7 +620,7 @@
    * may not be resolved, and may have a slightly different structure depending upon whether it is
    * resolved.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the HTML source to be parsed
    * @return the parse result (not `null`)
@@ -855,17 +859,17 @@
   /**
    * The number of milliseconds required to determine which task was to be performed.
    */
-  final int getTime;
+  int getTime = 0;
 
   /**
    * The name of the class of the task that was performed.
    */
-  final String taskClassName;
+  String taskClassName;
 
   /**
    * The number of milliseconds required to perform the task.
    */
-  final int performTime;
+  int performTime = 0;
 
   /**
    * Initialize a newly created analysis result to have the given values.
@@ -875,8 +879,11 @@
    * @param taskClassName the name of the class of the task that was performed
    * @param performTime the number of milliseconds required to perform the task
    */
-  AnalysisResult(List<ChangeNotice> notices, this.getTime, this.taskClassName, this.performTime) {
+  AnalysisResult(List<ChangeNotice> notices, int getTime, String taskClassName, int performTime) {
     this._notices = notices;
+    this.getTime = getTime;
+    this.taskClassName = taskClassName;
+    this.performTime = performTime;
   }
 
   /**
@@ -1377,11 +1384,6 @@
   static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
 
   /**
-   * The data descriptor representing the errors reported during the resolution of directives.
-   */
-  static final DataDescriptor<List<AnalysisError>> DIRECTIVE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.DIRECTIVE_ERRORS");
-
-  /**
    * The data descriptor representing the library element for the library. This data is only
    * available for Dart files that are the defining compilation unit of a library.
    */
@@ -1528,6 +1530,15 @@
   bool hasInvalidData(DataDescriptor descriptor);
 
   /**
+   * Return `true` if this entry has an AST structure that can be resolved (even if it needs
+   * to be copied).
+   *
+   * @return `true` if the method [DartEntryImpl#getResolvableCompilationUnit] will
+   *         return a non-`null` result
+   */
+  bool get hasResolvableCompilationUnit;
+
+  /**
    * Return `true` if this data is safe to use in refactoring.
    */
   bool get isRefactoringSafe;
@@ -1630,17 +1641,6 @@
   List<Source> _includedParts = Source.EMPTY_ARRAY;
 
   /**
-   * The state of the cached directive errors.
-   */
-  CacheState _directiveErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while resolving the directives, or an empty array if the errors are not
-   * currently cached.
-   */
-  List<AnalysisError> _directiveErrors = AnalysisError.NO_ERRORS;
-
-  /**
    * The list of libraries that contain this compilation unit. The list will be empty if there are
    * no known libraries that contain this compilation unit.
    */
@@ -1737,7 +1737,6 @@
     List<AnalysisError> errors = new List<AnalysisError>();
     ListUtilities.addAll(errors, _scanErrors);
     ListUtilities.addAll(errors, _parseErrors);
-    ListUtilities.addAll(errors, _directiveErrors);
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       ListUtilities.addAll(errors, state._resolutionErrors);
@@ -1822,9 +1821,7 @@
 
   @override
   CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return _directiveErrorsState;
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       return _elementState;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return _exportedLibrariesState;
@@ -1886,8 +1883,6 @@
       return _angularErrors;
     } else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
       return new List.from(_containingLibraries);
-    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return _directiveErrors;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       return _element;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -1955,9 +1950,7 @@
 
   @override
   bool hasInvalidData(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return identical(_directiveErrorsState, CacheState.INVALID);
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       return identical(_elementState, CacheState.INVALID);
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return identical(_exportedLibrariesState, CacheState.INVALID);
@@ -2001,6 +1994,22 @@
   }
 
   @override
+  bool get hasResolvableCompilationUnit {
+    if (identical(_parsedUnitState, CacheState.VALID)) {
+      return true;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+        return true;
+      }
+      state = state._nextState;
+    }
+    ;
+    return false;
+  }
+
+  @override
   void invalidateAllInformation() {
     super.invalidateAllInformation();
     _scanErrors = AnalysisError.NO_ERRORS;
@@ -2014,6 +2023,12 @@
     _parsedUnit = null;
     _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.INVALID;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.INVALID;
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.INVALID;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.INVALID;
     _discardCachedResolutionInformation();
   }
 
@@ -2056,59 +2071,6 @@
   }
 
   /**
-   * Record that an error occurred while attempting to resolve the directives in the source
-   * represented by this entry.
-   */
-  void recordDependencyError() {
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.ERROR;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.ERROR;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.ERROR;
-    _directiveErrors = AnalysisError.NO_ERRORS;
-    _directiveErrorsState = CacheState.ERROR;
-  }
-
-  /**
-   * Record that the information related to resolving dependencies for the associated source is
-   * about to be computed by the current thread.
-   */
-  void recordDependencyInProcess() {
-    if (_exportedLibrariesState != CacheState.VALID) {
-      _exportedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_importedLibrariesState != CacheState.VALID) {
-      _importedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_includedPartsState != CacheState.VALID) {
-      _includedPartsState = CacheState.IN_PROCESS;
-    }
-    if (_directiveErrorsState != CacheState.VALID) {
-      _directiveErrorsState = CacheState.IN_PROCESS;
-    }
-  }
-
-  /**
-   * Record that an in-process dependency resolution has stopped without recording results because
-   * the results were invalidated before they could be recorded.
-   */
-  void recordDependencyNotInProcess() {
-    if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
-      _exportedLibrariesState = CacheState.INVALID;
-    }
-    if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
-      _importedLibrariesState = CacheState.INVALID;
-    }
-    if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
-      _includedPartsState = CacheState.INVALID;
-    }
-    if (identical(_directiveErrorsState, CacheState.IN_PROCESS)) {
-      _directiveErrorsState = CacheState.INVALID;
-    }
-  }
-
-  /**
    * Record that an error occurred while attempting to scan or parse the entry represented by this
    * entry. This will set the state of all information, including any resolution-based information,
    * as being in error.
@@ -2121,7 +2083,12 @@
     _parsedUnit = null;
     _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.ERROR;
-    recordDependencyError();
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.ERROR;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.ERROR;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.ERROR;
     recordResolutionError();
   }
 
@@ -2139,6 +2106,15 @@
     if (_parsedUnitState != CacheState.VALID) {
       _parsedUnitState = CacheState.IN_PROCESS;
     }
+    if (_exportedLibrariesState != CacheState.VALID) {
+      _exportedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_importedLibrariesState != CacheState.VALID) {
+      _importedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_includedPartsState != CacheState.VALID) {
+      _includedPartsState = CacheState.IN_PROCESS;
+    }
   }
 
   /**
@@ -2158,6 +2134,15 @@
     if (identical(_parsedUnitState, CacheState.IN_PROCESS)) {
       _parsedUnitState = CacheState.INVALID;
     }
+    if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
+      _exportedLibrariesState = CacheState.INVALID;
+    }
+    if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
+      _importedLibrariesState = CacheState.INVALID;
+    }
+    if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
+      _includedPartsState = CacheState.INVALID;
+    }
   }
 
   /**
@@ -2295,10 +2280,7 @@
 
   @override
   void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      _directiveErrors = updatedValue(state, _directiveErrors, null);
-      _directiveErrorsState = state;
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
       _elementState = state;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -2375,9 +2357,6 @@
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
       _angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      _directiveErrors = value as List<AnalysisError>;
-      _directiveErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = value as LibraryElement;
       _elementState = CacheState.VALID;
@@ -2467,8 +2446,6 @@
     _exportedLibraries = other._exportedLibraries;
     _importedLibrariesState = other._importedLibrariesState;
     _importedLibraries = other._importedLibraries;
-    _directiveErrorsState = other._directiveErrorsState;
-    _directiveErrors = other._directiveErrors;
     _containingLibraries = new List<Source>.from(other._containingLibraries);
     _resolutionState.copyFrom(other._resolutionState);
     _elementState = other._elementState;
@@ -2482,7 +2459,7 @@
   }
 
   @override
-  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_directiveErrorsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
+  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
 
   @override
   void writeOn(JavaStringBuilder builder) {
@@ -2506,8 +2483,6 @@
     builder.append(_importedLibrariesState);
     builder.append("; includedParts = ");
     builder.append(_includedPartsState);
-    builder.append("; directiveErrors = ");
-    builder.append(_directiveErrorsState);
     builder.append("; element = ");
     builder.append(_elementState);
     builder.append("; publicNamespace = ");
@@ -2526,14 +2501,6 @@
   void _discardCachedResolutionInformation() {
     _element = null;
     _elementState = CacheState.INVALID;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.INVALID;
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.INVALID;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.INVALID;
-    _directiveErrors = AnalysisError.NO_ERRORS;
-    _directiveErrorsState = CacheState.INVALID;
     _bitmask = 0;
     _clientServerState = CacheState.INVALID;
     _launchableState = CacheState.INVALID;
@@ -3668,7 +3635,7 @@
 }
 
 class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
-  final String name;
+  String name;
 
   int _errorCount = 0;
 
@@ -3680,7 +3647,9 @@
 
   int _validCount = 0;
 
-  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
+  AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
+    this.name = name;
+  }
 
   @override
   bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
@@ -3965,13 +3934,13 @@
   }
 
   @override
-  List<Source> computeExportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  List<Source> computeExportedLibraries(Source source) => _getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
   @override
   HtmlElement computeHtmlElement(Source source) => _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
 
   @override
-  List<Source> computeImportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  List<Source> computeImportedLibraries(Source source) => _getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
   @override
   SourceKind computeKindOf(Source source) {
@@ -4019,7 +3988,7 @@
       throw new AnalysisException.con2("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", dartEntry.exception);
     }
     _cache.put(source, dartCopy);
-    return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
+    return new ResolvableCompilationUnit.con1(dartCopy.modificationTime, unit);
   }
 
   @override
@@ -4292,35 +4261,6 @@
   }
 
   @override
-  Namespace getPublicNamespace2(Source source) {
-    // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
-    // API of the interface.
-    DartEntry dartEntry = _getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return null;
-    }
-    Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
-    if (namespace == null) {
-      LibraryElement library = computeLibraryElement(source);
-      if (library == null) {
-        return null;
-      }
-      NamespaceBuilder builder = new NamespaceBuilder();
-      namespace = builder.createPublicNamespaceForLibrary(library);
-      dartEntry = _getReadableDartEntry(source);
-      if (dartEntry == null) {
-        throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
-      }
-      if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
-        DartEntryImpl dartCopy = _getReadableDartEntry(source).writableCopy;
-        dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
-        _cache.put(source, dartCopy);
-      }
-    }
-    return namespace;
-  }
-
-  @override
   List<Source> get refactoringUnsafeSources {
     List<Source> sources = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
@@ -4869,42 +4809,6 @@
   }
 
   /**
-   * Given a source for a Dart file, return a cache entry in which the state of the data represented
-   * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
-   * method assumes that the data can be produced by resolving the directives in the source if they
-   * are not already cached.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment
-   *
-   * @param source the source representing the Dart file
-   * @param dartEntry the cache entry associated with the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @return a cache entry containing the required data
-   * @throws AnalysisException if data could not be returned because the source could not be
-   *           resolved
-   */
-  DartEntry _cacheDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    //
-    // Check to see whether we already have the information being requested.
-    //
-    CacheState state = dartEntry.getState(descriptor);
-    while (state != CacheState.ERROR && state != CacheState.VALID) {
-      //
-      // If not, compute the information. Unless the modification date of the source continues to
-      // change, this loop will eventually terminate.
-      //
-      dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
-      CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-      if (unit == null) {
-        throw new AnalysisException.con2("Could not cache Dart dependency data: no parse unit", dartEntry.exception);
-      }
-      dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, unit).perform(_resultRecorder) as DartEntry;
-      state = dartEntry.getState(descriptor);
-    }
-    return dartEntry;
-  }
-
-  /**
    * Given a source for a Dart file and the library that contains it, return a cache entry in which
    * the state of the data represented by the given descriptor is either [CacheState#VALID] or
    * [CacheState#ERROR]. This method assumes that the data can be produced by generating hints
@@ -4963,7 +4867,7 @@
       // change, this loop will eventually terminate.
       //
       dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
-      dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM)).perform(_resultRecorder) as DartEntry;
+      dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM), dartEntry.getValue(SourceEntry.LINE_INFO)).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
     return dartEntry;
@@ -5045,6 +4949,8 @@
    * [CacheState#ERROR]. This method assumes that the data can be produced by verifying the
    * source in the given library if the data is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param unitSource the source representing the Dart file
    * @param librarySource the source representing the library containing the Dart file
    * @param dartEntry the cache entry associated with the Dart file
@@ -5197,7 +5103,7 @@
     SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
     sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS);
     _cache.put(source, sourceCopy);
-    return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false, null);
+    return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false);
   }
 
   /**
@@ -5209,7 +5115,7 @@
    * @return task data representing the created task
    */
   AnalysisContextImpl_TaskData _createParseDartTask(Source source, DartEntry dartEntry) {
-    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID) {
+    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
       return _createScanDartTask(source, dartEntry);
     }
     Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
@@ -5217,7 +5123,7 @@
     dartCopy.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
     dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream), false, null);
+    return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream, dartEntry.getValue(SourceEntry.LINE_INFO)), false);
   }
 
   /**
@@ -5237,26 +5143,45 @@
     htmlCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
     htmlCopy.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, htmlCopy);
-    return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false, null);
+    return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false);
   }
 
   /**
-   * Create a [ResolveDartDependenciesTask] for the given source, marking the exported
-   * libraries as being in-process.
+   * Create a [ResolveAngularComponentTemplateTask] for the given source, marking the angular
+   * errors as being in-process.
    *
-   * @param source the source whose content is to be used to resolve dependencies
-   * @param dartEntry the entry for the source
+   * @param source the source whose content is to be resolved
+   * @param htmlEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData _createResolveDartDependenciesTask(Source source, DartEntry dartEntry) {
-    CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-    if (unit == null) {
-      return _createParseDartTask(source, dartEntry);
+  AnalysisContextImpl_TaskData _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+      return _createResolveHtmlTask(source, htmlEntry);
     }
-    DartEntryImpl dartCopy = dartEntry.writableCopy;
-    dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.IN_PROCESS);
-    _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ResolveDartDependenciesTask(this, source, dartCopy.modificationTime, unit), false, null);
+    AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
+    AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
+    HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+    htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
+    _cache.put(source, htmlCopy);
+    return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false);
+  }
+
+  /**
+   * Create a [ResolveAngularEntryHtmlTask] for the given source, marking the angular entry as
+   * being in-process.
+   *
+   * @param source the source whose content is to be resolved
+   * @param htmlEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+      return _createResolveHtmlTask(source, htmlEntry);
+    }
+    HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+    htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
+    _cache.put(source, htmlCopy);
+    return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false);
   }
 
   /**
@@ -5274,7 +5199,7 @@
     HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
     htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS);
     _cache.put(source, htmlCopy);
-    return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false, null);
+    return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false);
   }
 
   /**
@@ -5294,7 +5219,7 @@
     dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
     dartCopy.setState(DartEntry.SCAN_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false, null);
+    return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false);
   }
 
   /**
@@ -5349,47 +5274,6 @@
   }
 
   /**
-   * Given a source for a Dart file, return the data represented by the given descriptor that is
-   * associated with that source. This method assumes that the data can be produced by resolving the
-   * directives in the source if they are not already cached.
-   *
-   * @param source the source representing the Dart file
-   * @param dartEntry the cache entry associated with the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @return the requested data about the given source
-   * @throws AnalysisException if data could not be returned because the source could not be parsed
-   */
-  Object _getDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = _cacheDartDependencyData(source, dartEntry, descriptor);
-    return dartEntry.getValue(descriptor);
-  }
-
-  /**
-   * Given a source for a Dart file, return the data represented by the given descriptor that is
-   * associated with that source, or the given default value if the source is not a Dart file. This
-   * method assumes that the data can be produced by resolving the directives in the source if they
-   * are not already cached.
-   *
-   * @param source the source representing the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @param defaultValue the value to be returned if the source is not a Dart file
-   * @return the requested data about the given source
-   * @throws AnalysisException if data could not be returned because the source could not be parsed
-   */
-  Object _getDartDependencyData2(Source source, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = _getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return defaultValue;
-    }
-    try {
-      return _getDartDependencyData(source, dartEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
-      return defaultValue;
-    }
-  }
-
-  /**
    * Given a source for a Dart file and the library that contains it, return the data represented by
    * the given descriptor that is associated with that source. This method assumes that the data can
    * be produced by generating hints for the library if it is not already cached.
@@ -5558,6 +5442,8 @@
    * the given descriptor that is associated with that source. This method assumes that the data can
    * be produced by verifying the source within the given library if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param unitSource the source representing the Dart file
    * @param librarySource the source representing the library containing the Dart file
    * @param dartEntry the entry representing the Dart file
@@ -5669,7 +5555,7 @@
     // Look for a priority source that needs to be analyzed.
     //
     for (Source source in _priorityOrder) {
-      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, true, hintsEnabled, sdkErrorsEnabled);
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
@@ -5680,18 +5566,23 @@
     //
     // Look for a non-priority source that needs to be analyzed.
     //
-    Source source = _workManager.nextSource;
-    while (source != null) {
-      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, false, hintsEnabled, sdkErrorsEnabled);
+    List<Source> sourcesToRemove = new List<Source>();
+    WorkManager_WorkIterator sources = _workManager.iterator();
+    while (sources.hasNext) {
+      Source source = sources.next();
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
       } else if (taskData.isBlocked) {
         hasBlockedTask = true;
       } else {
-        _workManager.remove(source);
+        sourcesToRemove.add(source);
       }
-      source = _workManager.nextSource;
+    }
+    int count = sourcesToRemove.length;
+    for (int i = 0; i < count; i++) {
+      _workManager.remove(sourcesToRemove[i]);
     }
     //      //
     //      // Look for a non-priority source that needs to be analyzed and was missed by the loop above.
@@ -5706,6 +5597,7 @@
     //        }
     //      }
     if (hasBlockedTask) {
+      // All of the analysis work is blocked waiting for an asynchronous task to complete.
       return WaitForAsyncTask.instance;
     }
     return null;
@@ -5728,7 +5620,7 @@
    */
   AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
     if (sourceEntry == null) {
-      return new AnalysisContextImpl_TaskData(null, false, null);
+      return new AnalysisContextImpl_TaskData(null, false);
     }
     CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
     if (identical(contentState, CacheState.INVALID)) {
@@ -5736,7 +5628,10 @@
     } else if (identical(contentState, CacheState.IN_PROCESS)) {
       // We are already in the process of getting the content. There's nothing else we can do with
       // this source until that's complete.
-      return new AnalysisContextImpl_TaskData(null, true, null);
+      return new AnalysisContextImpl_TaskData(null, true);
+    } else if (identical(contentState, CacheState.ERROR)) {
+      // We have done all of the analysis we can for this source because we cannot get its content.
+      return new AnalysisContextImpl_TaskData(null, false);
     }
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
@@ -5754,10 +5649,6 @@
           return _createParseDartTask(source, dartEntry);
         }
       }
-      CacheState exportState = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
-      if (identical(exportState, CacheState.INVALID) || (isPriority && identical(exportState, CacheState.FLUSHED))) {
-        return _createResolveDartDependenciesTask(source, dartEntry);
-      }
       List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
       for (Source librarySource in librariesContaining) {
         SourceEntry libraryEntry = _cache.get(librarySource);
@@ -5767,7 +5658,7 @@
             DartEntryImpl libraryCopy = libraryEntry.writableCopy;
             libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
             _cache.put(librarySource, libraryCopy);
-            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
           }
           CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
           if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
@@ -5782,7 +5673,7 @@
             dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS);
             _cache.put(source, dartCopy);
             //return new ResolveDartUnitTask(this, source, libraryElement);
-            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
           }
           if (sdkErrorsEnabled || !source.isInSystemLibrary) {
             CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
@@ -5792,7 +5683,7 @@
                 DartEntryImpl dartCopy = dartEntry.writableCopy;
                 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
                 _cache.put(source, dartCopy);
-                return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false, null);
+                return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false);
               }
             }
             if (hintsEnabled) {
@@ -5803,7 +5694,7 @@
                   DartEntryImpl dartCopy = dartEntry.writableCopy;
                   dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS);
                   _cache.put(source, dartCopy);
-                  return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false, null);
+                  return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false);
                 }
               }
             }
@@ -5826,50 +5717,23 @@
       if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
         return _createResolveHtmlTask(source, htmlEntry);
       }
+      //
       // Angular support
+      //
       if (_options.analyzeAngular) {
-        // try to resolve as an Angular entry point
+        // Try to resolve the HTML as an Angular entry point.
         CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
         if (identical(angularEntryState, CacheState.INVALID)) {
-          if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return _createResolveHtmlTask(source, htmlEntry);
-          }
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
-          _cache.put(source, htmlCopy);
-          return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false, null);
+          return _createResolveAngularEntryHtmlTask(source, htmlEntry);
         }
-        // try to resolve as an Angular application part
+        // Try to resolve the HTML as an Angular application part.
         CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
         if (identical(angularErrorsState, CacheState.INVALID)) {
-          if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return _createResolveHtmlTask(source, htmlEntry);
-          }
-          AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
-          // try to resolve as an Angular template
-          AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
-          _cache.put(source, htmlCopy);
-          return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false, null);
+          return _createResolveAngularComponentTemplateTask(source, htmlEntry);
         }
       }
     }
-    return new AnalysisContextImpl_TaskData(null, false, null);
-  }
-
-  AnalysisContextImpl_TaskData _getNextNondependentAnalysisTask(Source source, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
-    AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
-    if (taskData.task != null || taskData.isBlocked) {
-      return taskData;
-    }
-    while (taskData.dependentSource != null) {
-      taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
-      if (taskData.task != null || taskData.isBlocked) {
-        return taskData;
-      }
-    }
-    return new AnalysisContextImpl_TaskData(null, false, null);
+    return new AnalysisContextImpl_TaskData(null, false);
   }
 
   /**
@@ -6594,6 +6458,7 @@
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
+      _removeFromParts(source, dartEntry);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
         if (task.hasPartOfDirective && !task.hasLibraryDirective) {
@@ -6605,8 +6470,21 @@
           dartCopy.containingLibrary = source;
           _workManager.add(source, SourcePriority.LIBRARY);
         }
+        List<Source> newParts = task.includedSources;
+        for (int i = 0; i < newParts.length; i++) {
+          Source partSource = newParts[i];
+          DartEntry partEntry = _getReadableDartEntry(partSource);
+          if (partEntry != null && partEntry != dartEntry) {
+            DartEntryImpl partCopy = partEntry.writableCopy;
+            partCopy.addContainingLibrary(source);
+            _cache.put(partSource, partCopy);
+          }
+        }
         dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
         dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors);
+        dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
+        dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
+        dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
         _cache.storedAst(source);
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
@@ -6908,95 +6786,6 @@
   }
 
   /**
-   * Record the results produced by performing a [ResolveDartDependenciesTask]. If the results
-   * were computed from data that is now out-of-date, then the results will not be recorded.
-   *
-   * @param task the task that was performed
-   * @return an entry containing the computed results
-   * @throws AnalysisException if the results could not be recorded
-   */
-  DartEntry _recordResolveDartDependenciesTaskResults(ResolveDartDependenciesTask task) {
-    Source source = task.source;
-    AnalysisException thrownException = task.exception;
-    DartEntry dartEntry = null;
-    SourceEntry sourceEntry = _cache.get(source);
-    if (sourceEntry == null) {
-      throw new ObsoleteSourceAnalysisException(source);
-    } else if (sourceEntry is! DartEntry) {
-      // This shouldn't be possible because we should never have performed the task if the source
-      // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve Dart dependencies in a non-Dart file: ${source.fullName}");
-    }
-    dartEntry = sourceEntry as DartEntry;
-    int sourceTime = getModificationStamp(source);
-    int resultTime = task.modificationTime;
-    if (sourceTime == resultTime) {
-      if (dartEntry.modificationTime != sourceTime) {
-        // The source has changed without the context being notified. Simulate notification.
-        _sourceChanged(source);
-        dartEntry = _getReadableDartEntry(source);
-        if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
-        }
-      }
-      _removeFromParts(source, dartEntry);
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      if (thrownException == null) {
-        List<Source> newParts = task.includedSources;
-        for (int i = 0; i < newParts.length; i++) {
-          Source partSource = newParts[i];
-          DartEntry partEntry = _getReadableDartEntry(partSource);
-          if (partEntry != null && partEntry != dartEntry) {
-            DartEntryImpl partCopy = partEntry.writableCopy;
-            partCopy.addContainingLibrary(source);
-            _cache.put(partSource, partCopy);
-          }
-        }
-        dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
-        dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
-        dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
-        dartCopy.setValue(DartEntry.DIRECTIVE_ERRORS, task.errors);
-      } else {
-        dartCopy.recordDependencyError();
-      }
-      dartCopy.exception = thrownException;
-      _cache.put(source, dartCopy);
-      dartEntry = dartCopy;
-    } else {
-      _logInformation2("Dependency resolution results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      if (thrownException == null || resultTime >= 0) {
-        //
-        // The analysis was performed on out-of-date sources. Mark the cache so that the sources
-        // will be re-analyzed using the up-to-date sources.
-        //
-        //          dartCopy.recordDependencyNotInProcess();
-        _removeFromParts(source, dartEntry);
-        dartCopy.invalidateAllInformation();
-        dartCopy.modificationTime = sourceTime;
-        _cache.removedAst(source);
-        _workManager.add(source, SourcePriority.UNKNOWN);
-      } else {
-        //
-        // We could not determine whether the sources were up-to-date or out-of-date. Mark the
-        // cache so that we won't attempt to re-analyze the sources until there's a good chance
-        // that we'll be able to do so without error.
-        //
-        dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.ERROR);
-        dartCopy.setState(DartEntry.IMPORTED_LIBRARIES, CacheState.ERROR);
-        dartCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.ERROR);
-      }
-      dartCopy.exception = thrownException;
-      _cache.put(source, dartCopy);
-      dartEntry = dartCopy;
-    }
-    if (thrownException != null) {
-      throw thrownException;
-    }
-    return dartEntry;
-  }
-
-  /**
    * Record the results produced by performing a [ResolveDartUnitTask]. If the results were
    * computed from data that is now out-of-date, then the results will not be recorded.
    *
@@ -7479,9 +7268,6 @@
   HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
 
   @override
-  DartEntry visitResolveDartDependenciesTask(ResolveDartDependenciesTask task) => AnalysisContextImpl_this._recordResolveDartDependenciesTaskResults(task);
-
-  @override
   DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
 
   @override
@@ -7533,7 +7319,7 @@
   /**
    * The task that is to be performed.
    */
-  final AnalysisTask task;
+  AnalysisTask task;
 
   /**
    * A flag indicating whether the associated source is blocked waiting for its contents to be
@@ -7542,20 +7328,14 @@
   bool _blocked = false;
 
   /**
-   * The source that needs to be analyzed before further progress can be made on the associated
-   * source.
-   */
-  final Source dependentSource;
-
-  /**
    * Initialize a newly created data holder.
    *
    * @param task the task that is to be performed
    * @param blocked `true` if the associated source is blocked waiting for its contents to
    *          be loaded
-   * @param dependentSource t
    */
-  AnalysisContextImpl_TaskData(this.task, bool blocked, this.dependentSource) {
+  AnalysisContextImpl_TaskData(AnalysisTask task, bool blocked) {
+    this.task = task;
     this._blocked = blocked;
   }
 
@@ -7577,12 +7357,12 @@
   /**
    * The analysis errors associated with a source, or `null` if there are no errors.
    */
-  final List<AnalysisError> errors;
+  List<AnalysisError> errors;
 
   /**
    * The line information associated with the errors, or `null` if there are no errors.
    */
-  final LineInfo lineInfo;
+  LineInfo lineInfo;
 
   /**
    * Initialize an newly created error info with the errors and line information
@@ -7590,7 +7370,10 @@
    * @param errors the errors as a result of analysis
    * @param lineinfo the line info for the errors
    */
-  AnalysisErrorInfoImpl(this.errors, this.lineInfo);
+  AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) {
+    this.errors = errors;
+    this.lineInfo = lineInfo;
+  }
 }
 
 /**
@@ -7686,7 +7469,7 @@
   /**
    * The source for which the result is being reported.
    */
-  final Source source;
+  Source source;
 
   /**
    * The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
@@ -7721,7 +7504,9 @@
    *
    * @param source the source for which the change is being reported
    */
-  ChangeNoticeImpl(this.source);
+  ChangeNoticeImpl(Source source) {
+    this.source = source;
+  }
 
   @override
   List<AnalysisError> get errors => _errors;
@@ -7930,15 +7715,6 @@
   }
 
   @override
-  Namespace getPublicNamespace2(Source source) {
-    if (source.isInSystemLibrary) {
-      return _sdkAnalysisContext.getPublicNamespace2(source);
-    } else {
-      return super.getPublicNamespace2(source);
-    }
-  }
-
-  @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
@@ -8183,13 +7959,13 @@
     return cache;
   }
 
-  final Source librarySource;
+  Source librarySource;
 
-  final Source source;
+  Source source;
 
-  final String oldContents;
+  String oldContents;
 
-  final CompilationUnit resolvedUnit;
+  CompilationUnit resolvedUnit;
 
   String _newContents;
 
@@ -8199,7 +7975,11 @@
 
   int _newLength = 0;
 
-  IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, this.oldContents, String newContents, int offset, int oldLength, int newLength) {
+  IncrementalAnalysisCache(Source librarySource, Source source, CompilationUnit resolvedUnit, String oldContents, String newContents, int offset, int oldLength, int newLength) {
+    this.librarySource = librarySource;
+    this.source = source;
+    this.resolvedUnit = resolvedUnit;
+    this.oldContents = oldContents;
     this._newContents = newContents;
     this._offset = offset;
     this._oldLength = oldLength;
@@ -8679,9 +8459,6 @@
   Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
 
   @override
-  Namespace getPublicNamespace2(Source source) => _basis.getPublicNamespace2(source);
-
-  @override
   List<Source> get refactoringUnsafeSources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getRefactoringUnsafeSources");
     _checkThread(instrumentation);
@@ -9027,16 +8804,6 @@
   Namespace getPublicNamespace(LibraryElement library);
 
   /**
-   * Return a namespace containing mappings for all of the public names defined by the library
-   * defined by the given source.
-   *
-   * @param source the source defining the library whose public namespace is to be returned
-   * @return the public namespace corresponding to the library defined by the given source
-   * @throws AnalysisException if the public namespace could not be computed
-   */
-  Namespace getPublicNamespace2(Source source);
-
-  /**
    * Returns a statistics about this context.
    */
   AnalysisContentStatistics get statistics;
@@ -9298,12 +9065,28 @@
  */
 class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
   /**
+   * The source of the compilation unit.
+   */
+  Source _source;
+
+  /**
    * Initialize a newly created holder to hold the given values.
    *
    * @param modificationTime the modification time of the source from which the AST was created
    * @param unit the AST that was created from the source
    */
-  ResolvableCompilationUnit(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   * @param source the source of the compilation unit
+   */
+  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, Source source) : super(modificationTime, unit) {
+    this._source = source;
+  }
 
   /**
    * Return the AST that was created from the source.
@@ -9311,6 +9094,13 @@
    * @return the AST that was created from the source
    */
   CompilationUnit get compilationUnit => data;
+
+  /**
+   * Return the source of the compilation unit.
+   *
+   * @return the source of the compilation unit
+   */
+  Source get source => _source;
 }
 
 /**
@@ -9337,7 +9127,7 @@
 
 /**
  * The enumerated type `Priority` defines the priority levels used to return sources in an
- * optimal order.
+ * optimal order. A smaller ordinal value equates to a higher priority.
  */
 class SourcePriority extends Enum<SourcePriority> {
   /**
@@ -9353,22 +9143,21 @@
   static final SourcePriority LIBRARY = new SourcePriority('LIBRARY', 1);
 
   /**
-   * Used for a Dart source that is known to be a part but whose library has not yet been
-   * resolved.
-   */
-  static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 2);
-
-  /**
    * Used for a Dart source whose kind is unknown.
    */
-  static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 3);
+  static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 2);
+
+  /**
+   * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
+   */
+  static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 3);
 
   /**
    * Used for an HTML source.
    */
   static final SourcePriority HTML = new SourcePriority('HTML', 4);
 
-  static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, NORMAL_PART, UNKNOWN, HTML];
+  static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
 
   SourcePriority(String name, int ordinal) : super(name, ordinal);
 }
@@ -9381,12 +9170,12 @@
   /**
    * The modification time of the source from which the data was created.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The data that was created from the source.
    */
-  final E data;
+  E data;
 
   /**
    * Initialize a newly created holder to hold the given values.
@@ -9394,7 +9183,10 @@
    * @param modificationTime the modification time of the source from which the data was created
    * @param unit the data that was created from the source
    */
-  TimestampedData(this.modificationTime, this.data);
+  TimestampedData(int modificationTime, E data) {
+    this.modificationTime = modificationTime;
+    this.data = data;
+  }
 }
 
 /**
@@ -9420,14 +9212,14 @@
 
   /**
    * Record that the given source needs to be analyzed. The priority level is used to control when
-   * the source will be analyzed with respect to other sources.
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. If it was previously added with the same priority then it's
+   * position in the queue is unchanged.
    *
    * @param source the source that needs to be analyzed
    * @param priority the priority level of the source
    */
   void add(Source source, SourcePriority priority) {
-    // TODO(brianwilkerson) Optimize the order of the libraries so that libraries that depend on
-    // other libraries get analyzed after the other libraries.
     int queueCount = _workQueues.length;
     int ordinal = priority.ordinal;
     for (int i = 0; i < queueCount; i++) {
@@ -9443,22 +9235,42 @@
   }
 
   /**
-   * Return the next source for which some analysis work needs to be done.
+   * Record that the given source needs to be analyzed. The priority level is used to control when
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. In either case, it will be analyzed before other sources of the
+   * same priority.
    *
-   * @return the next source for which some analysis work needs to be done
+   * @param source the source that needs to be analyzed
+   * @param priority the priority level of the source
    */
-  Source get nextSource {
+  void addFirst(Source source, SourcePriority priority) {
     int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
     for (int i = 0; i < queueCount; i++) {
       List<Source> queue = _workQueues[i];
-      if (!queue.isEmpty) {
-        return queue[0];
+      if (i == ordinal) {
+        queue.remove(source);
+        queue.insert(0, source);
+      } else {
+        queue.remove(source);
       }
     }
-    return null;
   }
 
   /**
+   * Return an iterator that can be used to access the sources to be analyzed in the order in which
+   * they should be analyzed.
+   *
+   * <b>Note:</b> As with other iterators, no sources can be added or removed from this work manager
+   * while the iterator is being used. Unlike some implementations, however, the iterator will not
+   * detect when this requirement has been violated; it might work correctly, it might return the
+   * wrong source, or it might throw an exception.
+   *
+   * @return an iterator that can be used to access the next source to be analyzed
+   */
+  WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
+
+  /**
    * Record that the given source is fully analyzed.
    *
    * @param source the source that is fully analyzed
@@ -9472,20 +9284,85 @@
 }
 
 /**
+ * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
+ * work manager in the order in which they are to be analyzed.
+ */
+class WorkManager_WorkIterator {
+  final WorkManager WorkManager_this;
+
+  /**
+   * The index of the work queue through which we are currently iterating.
+   */
+  int _queueIndex = 0;
+
+  /**
+   * The index of the next element of the work queue to be returned.
+   */
+  int _index = -1;
+
+  /**
+   * Initialize a newly created iterator to be ready to return the first element in the iteration.
+   */
+  WorkManager_WorkIterator(this.WorkManager_this) {
+    _advance();
+  }
+
+  /**
+   * Return `true` if there is another [Source] available for processing.
+   *
+   * @return `true` if there is another [Source] available for processing
+   */
+  bool get hasNext => _queueIndex < WorkManager_this._workQueues.length;
+
+  /**
+   * Return the next [Source] available for processing and advance so that the returned
+   * source will not be returned again.
+   *
+   * @return the next [Source] available for processing
+   */
+  Source next() {
+    if (!hasNext) {
+      throw new NoSuchElementException();
+    }
+    Source source = WorkManager_this._workQueues[_queueIndex][_index];
+    _advance();
+    return source;
+  }
+
+  /**
+   * Increment the [index] and [queueIndex] so that they are either indicating the
+   * next source to be returned or are indicating that there are no more sources to be returned.
+   */
+  void _advance() {
+    _index++;
+    if (_index >= WorkManager_this._workQueues[_queueIndex].length) {
+      _index = 0;
+      _queueIndex++;
+      while (_queueIndex < WorkManager_this._workQueues.length && WorkManager_this._workQueues[_queueIndex].isEmpty) {
+        _queueIndex++;
+      }
+    }
+  }
+}
+
+/**
  * An [Expression] with optional [AngularFilterNode]s.
  */
 class AngularExpression {
   /**
    * The [Expression] to apply filters to.
    */
-  final Expression expression;
+  Expression expression;
 
   /**
    * The filters to apply.
    */
-  final List<AngularFilterNode> filters;
+  List<AngularFilterNode> filters;
 
-  AngularExpression(this.expression, this.filters);
+  AngularExpression(Expression expression, List<AngularFilterNode> filters) {
+    this.expression = expression;
+    this.filters = filters;
+  }
 
   /**
    * Return the offset of the character immediately following the last character of this node's
@@ -9539,19 +9416,22 @@
   /**
    * The [TokenType#COLON] token.
    */
-  final Token token;
+  Token token;
 
   /**
    * The argument expression.
    */
-  final Expression expression;
+  Expression expression;
 
   /**
    * The optional sub-[Expression]s.
    */
   List<Expression> subExpressions = Expression.EMPTY_ARRAY;
 
-  AngularFilterArgument(this.token, this.expression);
+  AngularFilterArgument(Token token, Expression expression) {
+    this.token = token;
+    this.expression = expression;
+  }
 }
 
 /**
@@ -9561,19 +9441,23 @@
   /**
    * The [TokenType#BAR] token.
    */
-  final Token token;
+  Token token;
 
   /**
    * The name of the filter.
    */
-  final SimpleIdentifier name;
+  SimpleIdentifier name;
 
   /**
    * The arguments for this filter.
    */
-  final List<AngularFilterArgument> arguments;
+  List<AngularFilterArgument> arguments;
 
-  AngularFilterNode(this.token, this.name, this.arguments);
+  AngularFilterNode(Token token, SimpleIdentifier name, List<AngularFilterArgument> arguments) {
+    this.token = token;
+    this.name = name;
+    this.arguments = arguments;
+  }
 }
 
 /**
@@ -10379,9 +10263,11 @@
   /**
    * The expression that is enclosed between the delimiters.
    */
-  final AngularExpression expression;
+  AngularExpression expression;
 
-  AngularXmlExpression(this.expression);
+  AngularXmlExpression(AngularExpression expression) {
+    this.expression = expression;
+  }
 
   @override
   ht.XmlExpression_Reference getReference(int offset) {
@@ -10714,7 +10600,7 @@
   /**
    * The context in which the task is to be performed.
    */
-  final InternalAnalysisContext context;
+  InternalAnalysisContext context;
 
   /**
    * The exception that was thrown while performing this task, or `null` if the task completed
@@ -10727,7 +10613,9 @@
    *
    * @param context the context in which the task is to be performed
    */
-  AnalysisTask(this.context);
+  AnalysisTask(InternalAnalysisContext context) {
+    this.context = context;
+  }
 
   /**
    * Use the given visitor to visit this task.
@@ -10876,15 +10764,6 @@
   E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
 
   /**
-   * Visit a [ResolveDartDependenciesTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveDartDependenciesTask(ResolveDartDependenciesTask task);
-
-  /**
    * Visit a [ResolveDartLibraryTask].
    *
    * @param task the task to be visited
@@ -10929,12 +10808,12 @@
   /**
    * The source for which errors and warnings are to be produced.
    */
-  final Source source;
+  Source source;
 
   /**
    * The element model for the library containing the source.
    */
-  final LibraryElement libraryElement;
+  LibraryElement libraryElement;
 
   /**
    * The time at which the contents of the source were last modified.
@@ -10953,7 +10832,10 @@
    * @param source the source for which errors and warnings are to be produced
    * @param libraryElement the element model for the library containing the source
    */
-  GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.libraryElement) : super(context);
+  GenerateDartErrorsTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+    this.source = source;
+    this.libraryElement = libraryElement;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
@@ -11012,7 +10894,7 @@
   /**
    * The element model for the library being analyzed.
    */
-  final LibraryElement libraryElement;
+  LibraryElement libraryElement;
 
   /**
    * A table mapping the sources that were analyzed to the hints that were generated for the
@@ -11026,7 +10908,9 @@
    * @param context the context in which the task is to be performed
    * @param libraryElement the element model for the library being analyzed
    */
-  GenerateDartHintsTask(InternalAnalysisContext context, this.libraryElement) : super(context);
+  GenerateDartHintsTask(InternalAnalysisContext context, LibraryElement libraryElement) : super(context) {
+    this.libraryElement = libraryElement;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
@@ -11112,7 +10996,7 @@
   /**
    * The source to be read.
    */
-  final Source source;
+  Source source;
 
   /**
    * A flag indicating whether this task is complete.
@@ -11136,10 +11020,11 @@
    * @param source the source to be parsed
    * @param contentData the time-stamped contents of the source
    */
-  GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
+  GetContentTask(InternalAnalysisContext context, Source source) : super(context) {
     if (source == null) {
       throw new IllegalArgumentException("Cannot get contents of null source");
     }
+    this.source = source;
   }
 
   @override
@@ -11195,7 +11080,7 @@
   /**
    * The information used to perform incremental analysis.
    */
-  final IncrementalAnalysisCache cache;
+  IncrementalAnalysisCache cache;
 
   /**
    * The compilation unit that was produced by incrementally updating the existing unit.
@@ -11208,7 +11093,9 @@
    * @param context the context in which the task is to be performed
    * @param cache the incremental analysis cache used to perform the analysis
    */
-  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
+  IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
+    this.cache = cache;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
@@ -11287,12 +11174,12 @@
   /**
    * The source to be parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The head of the token stream used for parsing.
@@ -11300,14 +11187,19 @@
   Token _tokenStream;
 
   /**
+   * The line information associated with the source.
+   */
+  LineInfo _lineInfo;
+
+  /**
    * The compilation unit that was produced by parsing the source.
    */
   CompilationUnit _unit;
 
   /**
-   * The errors that were produced by scanning and parsing the source.
+   * A flag indicating whether the source contains a 'library' directive.
    */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+  bool _containsLibraryDirective = false;
 
   /**
    * A flag indicating whether the source contains a 'part of' directive.
@@ -11315,9 +11207,29 @@
   bool _containsPartOfDirective = false;
 
   /**
-   * A flag indicating whether the source contains a 'library' directive.
+   * A set containing the sources referenced by 'export' directives.
    */
-  bool _containsLibraryDirective = false;
+  Set<Source> _exportedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'import' directives.
+   */
+  Set<Source> _importedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'part' directives.
+   */
+  Set<Source> _includedSources = new Set<Source>();
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -11326,9 +11238,13 @@
    * @param source the source to be parsed
    * @param modificationTime the time at which the contents of the source were last modified
    * @param tokenStream the head of the token stream used for parsing
+   * @param lineInfo the line information associated with the source
    */
-  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, Token tokenStream) : super(context) {
+  ParseDartTask(InternalAnalysisContext context, Source source, int modificationTime, Token tokenStream, LineInfo lineInfo) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._tokenStream = tokenStream;
+    this._lineInfo = lineInfo;
   }
 
   @override
@@ -11351,6 +11267,30 @@
   List<AnalysisError> get errors => _errors;
 
   /**
+   * Return an array containing the sources referenced by 'export' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'export' directives
+   */
+  List<Source> get exportedSources => _toArray(_exportedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'import' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'import' directives
+   */
+  List<Source> get importedSources => _toArray(_importedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'part' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'part' directives
+   */
+  List<Source> get includedSources => _toArray(_includedSources);
+
+  /**
    * Return `true` if the source contains a 'library' directive, or `false` if the task
    * has not yet been performed or if an exception occurred.
    *
@@ -11376,29 +11316,93 @@
 
   @override
   void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    InternalAnalysisContext context = this.context;
     //
     // Then parse the token stream.
     //
     TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
     try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
       Parser parser = new Parser(source, errorListener);
       parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
       _unit = parser.parseCompilationUnit(_tokenStream);
+      _unit.lineInfo = _lineInfo;
       _errors = errorListener.getErrorsForSource(source);
       for (Directive directive in _unit.directives) {
-        if (directive is LibraryDirective) {
+        if (directive is ExportDirective) {
+          Source exportSource = _resolveSource(source, directive, errorListener);
+          if (exportSource != null) {
+            _exportedSources.add(exportSource);
+          }
+        } else if (directive is ImportDirective) {
+          Source importSource = _resolveSource(source, directive, errorListener);
+          if (importSource != null) {
+            _importedSources.add(importSource);
+          }
+        } else if (directive is LibraryDirective) {
           _containsLibraryDirective = true;
+        } else if (directive is PartDirective) {
+          Source partSource = _resolveSource(source, directive, errorListener);
+          if (partSource != null) {
+            _includedSources.add(partSource);
+          }
         } else if (directive is PartOfDirective) {
           _containsPartOfDirective = true;
         }
       }
-      _unit.lineInfo = context.getLineInfo(source);
     } finally {
       timeCounterParse.stop();
     }
   }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
+   * @return the result of resolving the URI against the URI of the library
+   */
+  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    if (uriLiteral is StringInterpolation) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
+      return null;
+    }
+    String uriContent = uriLiteral.stringValue.trim();
+    directive.uriContent = uriContent;
+    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+      return null;
+    }
+    try {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      parseUriWithException(encodedUriContent);
+      AnalysisContext analysisContext = context;
+      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      if (!analysisContext.exists(source)) {
+        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+      }
+      directive.source = source;
+      return source;
+    } on URISyntaxException catch (exception) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+    }
+    return null;
+  }
+
+  /**
+   * Efficiently convert the given set of sources to an array.
+   *
+   * @param sources the set to be converted
+   * @return an array containing all of the sources in the given set
+   */
+  List<Source> _toArray(Set<Source> sources) {
+    int size = sources.length;
+    if (size == 0) {
+      return Source.EMPTY_ARRAY;
+    }
+    return new List.from(sources);
+  }
 }
 
 /**
@@ -11408,12 +11412,12 @@
   /**
    * The source to be parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The contents of the source.
@@ -11458,7 +11462,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+  ParseHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._content = content;
   }
 
@@ -11572,12 +11578,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -11614,7 +11620,9 @@
    * @param component the component that uses this HTML template, not `null`
    * @param application the Angular application to resolve in context of
    */
-  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
     this._component = component;
     this._application = application;
@@ -11665,12 +11673,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -11705,7 +11713,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
   }
 
@@ -11769,198 +11779,18 @@
 }
 
 /**
- * Instances of the class `ResolveDartDependenciesTask` resolve the import, export, and part
- * directives in a single source.
- */
-class ResolveDartDependenciesTask extends AnalysisTask {
-  /**
-   * The source containing the directives to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The compilation unit used to resolve the dependencies.
-   */
-  CompilationUnit _unit;
-
-  /**
-   * A set containing the sources referenced by 'export' directives.
-   */
-  Set<Source> _exportedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'import' directives.
-   */
-  Set<Source> _importedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'part' directives.
-   */
-  Set<Source> _includedSources = new Set<Source>();
-
-  /**
-   * The errors that were produced by resolving the directives.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
-   */
-  static String _DART_EXT_SCHEME = "dart-ext:";
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be parsed
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param unit the compilation unit used to resolve the dependencies
-   */
-  ResolveDartDependenciesTask(InternalAnalysisContext context, this.source, this.modificationTime, CompilationUnit unit) : super(context) {
-    this._unit = unit;
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartDependenciesTask(this);
-
-  /**
-   * Return the errors that were produced by resolving the directives, or an empty array if the task
-   * has not yet been performed or if an exception occurred.
-   *
-   * @return the errors that were produced by resolving the directives.
-   */
-  List<AnalysisError> get errors => _errors;
-
-  /**
-   * Return an array containing the sources referenced by 'export' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'export' directives
-   */
-  List<Source> get exportedSources => _toArray(_exportedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'import' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'import' directives
-   */
-  List<Source> get importedSources => _toArray(_importedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'part' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'part' directives
-   */
-  List<Source> get includedSources => _toArray(_includedSources);
-
-  @override
-  String get taskDescription {
-    if (source == null) {
-      return "resolve dart dependencies null source";
-    }
-    return "resolve dart dependencies ${source.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
-    try {
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      for (Directive directive in _unit.directives) {
-        if (directive is ExportDirective) {
-          Source exportSource = _resolveSource(source, directive, errorListener);
-          if (exportSource != null) {
-            _exportedSources.add(exportSource);
-          }
-        } else if (directive is ImportDirective) {
-          Source importSource = _resolveSource(source, directive, errorListener);
-          if (importSource != null) {
-            _importedSources.add(importSource);
-          }
-        } else if (directive is PartDirective) {
-          Source partSource = _resolveSource(source, directive, errorListener);
-          if (partSource != null) {
-            _includedSources.add(partSource);
-          }
-        }
-      }
-      _errors = errorListener.errors;
-    } finally {
-      timeCounterParse.stop();
-    }
-  }
-
-  /**
-   * Return the result of resolving the URI of the given URI-based directive against the URI of the
-   * given library, or `null` if the URI is not valid.
-   *
-   * @param librarySource the source representing the library containing the directive
-   * @param directive the directive which URI should be resolved
-   * @param errorListener the error listener to which errors should be reported
-   * @return the result of resolving the URI against the URI of the library
-   */
-  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
-    StringLiteral uriLiteral = directive.uri;
-    if (uriLiteral is StringInterpolation) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
-      return null;
-    }
-    String uriContent = uriLiteral.stringValue.trim();
-    directive.uriContent = uriContent;
-    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
-      return null;
-    }
-    try {
-      String encodedUriContent = Uri.encodeFull(uriContent);
-      parseUriWithException(encodedUriContent);
-      AnalysisContext analysisContext = context;
-      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
-      if (!analysisContext.exists(source)) {
-        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
-      }
-      directive.source = source;
-      return source;
-    } on URISyntaxException catch (exception) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
-    }
-    return null;
-  }
-
-  /**
-   * Efficiently convert the given set of sources to an array.
-   *
-   * @param sources the set to be converted
-   * @return an array containing all of the sources in the given set
-   */
-  List<Source> _toArray(Set<Source> sources) {
-    int size = sources.length;
-    if (size == 0) {
-      return Source.EMPTY_ARRAY;
-    }
-    return new List.from(sources);
-  }
-}
-
-/**
- * Instances of the class `ResolveDartLibraryTask` parse a specific Dart library.
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
  */
 class ResolveDartLibraryTask extends AnalysisTask {
   /**
    * The source representing the file whose compilation unit is to be returned.
    */
-  final Source unitSource;
+  Source unitSource;
 
   /**
    * The source representing the library to be resolved.
    */
-  final Source librarySource;
+  Source librarySource;
 
   /**
    * The library resolver holding information about the libraries that were resolved.
@@ -11974,7 +11804,10 @@
    * @param unitSource the source representing the file whose compilation unit is to be returned
    * @param librarySource the source representing the library to be resolved
    */
-  ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context);
+  ResolveDartLibraryTask(InternalAnalysisContext context, Source unitSource, Source librarySource) : super(context) {
+    this.unitSource = unitSource;
+    this.librarySource = librarySource;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
@@ -12009,7 +11842,7 @@
   /**
    * The source that is to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The element model for the library containing the source.
@@ -12033,7 +11866,8 @@
    * @param source the source to be parsed
    * @param libraryElement the element model for the library containing the source
    */
-  ResolveDartUnitTask(InternalAnalysisContext context, this.source, LibraryElement libraryElement) : super(context) {
+  ResolveDartUnitTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+    this.source = source;
     this._libraryElement = libraryElement;
   }
 
@@ -12151,12 +11985,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -12186,7 +12020,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+  ResolveHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
   }
 
@@ -12238,12 +12074,12 @@
   /**
    * The source to be scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The contents of the source.
@@ -12273,7 +12109,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ScanDartTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+  ScanDartTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._content = content;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 3dc1b49..062dd0f 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -45,12 +45,12 @@
   /**
    * The name of the severity used when producing machine output.
    */
-  final String machineCode;
+  String machineCode;
 
   /**
    * The name of the severity used when producing readable output.
    */
-  final String displayName;
+  String displayName;
 
   /**
    * Initialize a newly created severity with the given names.
@@ -58,7 +58,10 @@
    * @param machineCode the name of the severity used when producing machine output
    * @param displayName the name of the severity used when producing readable output
    */
-  ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
+  ErrorSeverity(String name, int ordinal, String machineCode, String displayName) : super(name, ordinal) {
+    this.machineCode = machineCode;
+    this.displayName = displayName;
+  }
 
   /**
    * Return the severity constant that represents the greatest severity.
@@ -376,7 +379,7 @@
   /**
    * The error code associated with the error.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * The localized error message.
@@ -419,7 +422,9 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con1(this.source, this.errorCode, List<Object> arguments) {
+  AnalysisError.con1(Source source, ErrorCode errorCode, List<Object> arguments) {
+    this.source = source;
+    this.errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
   }
 
@@ -432,9 +437,11 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con2(this.source, int offset, int length, this.errorCode, List<Object> arguments) {
+  AnalysisError.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+    this.source = source;
     this._offset = offset;
     this._length = length;
+    this.errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
     String correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
@@ -813,7 +820,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -826,7 +833,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HintCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  HintCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -834,7 +843,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HintCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  HintCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction3 = correction;
   }
 
@@ -951,14 +961,16 @@
   /**
    * The severity of this type of error.
    */
-  final ErrorSeverity severity;
+  ErrorSeverity severity;
 
   /**
    * Initialize a newly created error type to have the given severity.
    *
    * @param severity the severity of this type of error
    */
-  ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
+  ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
+    this.severity = severity;
+  }
 
   String get displayName => name.toLowerCase().replaceAll('_', ' ');
 }
@@ -2274,7 +2286,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -2287,7 +2299,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  CompileTimeErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  CompileTimeErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2295,7 +2309,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  CompileTimeErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  CompileTimeErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction2 = correction;
   }
 
@@ -2347,7 +2362,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -2360,7 +2375,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  PubSuggestionCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  PubSuggestionCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2368,7 +2385,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  PubSuggestionCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  PubSuggestionCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction5 = correction;
   }
 
@@ -3234,7 +3252,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3247,7 +3265,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  StaticWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3255,7 +3275,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  StaticWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction7 = correction;
   }
 
@@ -3321,7 +3342,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3334,7 +3355,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HtmlWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  HtmlWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3342,7 +3365,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HtmlWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  HtmlWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction4 = correction;
   }
 
@@ -3649,7 +3673,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3662,7 +3686,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticTypeWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  StaticTypeWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3670,7 +3696,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticTypeWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  StaticTypeWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction6 = correction;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 534083b..12d0e2e 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -144,9 +144,11 @@
  * characters.
  */
 class RawXmlExpression extends XmlExpression {
-  final Expression expression;
+  Expression expression;
 
-  RawXmlExpression(this.expression);
+  RawXmlExpression(Expression expression) {
+    this.expression = expression;
+  }
 
   @override
   int get end => expression.end;
@@ -682,7 +684,7 @@
   /**
    * The source being scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The token pointing to the head of the linked list of tokens.
@@ -709,7 +711,8 @@
    *
    * @param source the source being scanned
    */
-  AbstractScanner(this.source) {
+  AbstractScanner(Source source) {
+    this.source = source;
     _tokens = new Token.con1(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
     _tail = _tokens;
@@ -1183,9 +1186,11 @@
    * The lexeme that defines this type of token, or `null` if there is more than one possible
    * lexeme for this type of token.
    */
-  final String lexeme;
+  String lexeme;
 
-  TokenType(String name, int ordinal, this.lexeme) : super(name, ordinal);
+  TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
+    this.lexeme = lexeme;
+  }
 }
 
 class TokenType_EOF extends TokenType {
@@ -1201,7 +1206,7 @@
 class XmlAttributeNode extends XmlNode {
   Token _name;
 
-  final Token equals;
+  Token equals;
 
   Token _value;
 
@@ -1215,8 +1220,9 @@
    * @param equals the equals sign or `null` if none
    * @param value the value token (not `null`)
    */
-  XmlAttributeNode(Token name, this.equals, Token value) {
+  XmlAttributeNode(Token name, Token equals, Token value) {
     this._name = name;
+    this.equals = equals;
     this._value = value;
   }
 
@@ -1368,7 +1374,7 @@
   /**
    * The source being parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The next token to be parsed.
@@ -1380,7 +1386,9 @@
    *
    * @param source the source being parsed
    */
-  XmlParser(this.source);
+  XmlParser(Source source) {
+    this.source = source;
+  }
 
   /**
    * Create a node representing an attribute.
@@ -1636,7 +1644,7 @@
   /**
    * The starting [TokenType#LT] token (not `null`).
    */
-  final Token nodeStart;
+  Token nodeStart;
 
   /**
    * The [TokenType#TAG] token after the starting '&lt;' (not `null`).
@@ -1653,7 +1661,7 @@
    * `null`). The token may be the same token as [nodeEnd] if there are no child
    * [tagNodes].
    */
-  final Token attributeEnd;
+  Token attributeEnd;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1669,18 +1677,18 @@
    * the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT].
    */
-  final Token contentEnd;
+  Token contentEnd;
 
   /**
    * The closing [TokenType#TAG] after the child elements or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT]
    */
-  final Token closingTag;
+  Token closingTag;
 
   /**
    * The ending [TokenType#GT] or [TokenType#SLASH_GT] token (not `null`).
    */
-  final Token nodeEnd;
+  Token nodeEnd;
 
   /**
    * The expressions that are embedded in the tag's content.
@@ -1711,10 +1719,15 @@
    * @param nodeEnd the ending [TokenType#GT] or [TokenType#SLASH_GT] token (not
    *          `null`)
    */
-  XmlTagNode(this.nodeStart, Token tag, List<XmlAttributeNode> attributes, this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd, this.closingTag, this.nodeEnd) {
+  XmlTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
+    this.nodeStart = nodeStart;
     this._tag = tag;
     this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
+    this.attributeEnd = attributeEnd;
     this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
+    this.contentEnd = contentEnd;
+    this.closingTag = closingTag;
+    this.nodeEnd = nodeEnd;
   }
 
   @override
@@ -1978,13 +1991,13 @@
   /**
    * The first token in the token stream that was parsed to form this HTML unit.
    */
-  final Token beginToken;
+  Token beginToken;
 
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  final Token endToken;
+  Token endToken;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1999,8 +2012,10 @@
    * @param endToken the last token in the token stream which should be of type
    *          [TokenType.EOF]
    */
-  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
+  HtmlUnit(Token beginToken, List<XmlTagNode> tagNodes, Token endToken) {
+    this.beginToken = beginToken;
     this._tagNodes = becomeParentOfAll(tagNodes);
+    this.endToken = endToken;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index faeac7a..7d60cd8 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -36,7 +36,7 @@
   /**
    * The source being removed.
    */
-  final Source source;
+  Source source;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -45,9 +45,10 @@
    * @param context the [AnalysisContext] to remove source in
    * @param source the [Source] to remove from index
    */
-  RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, this.source) {
+  RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, Source source) {
     this._indexStore = indexStore;
     this._context = context;
+    this.source = source;
   }
 
   @override
@@ -610,7 +611,7 @@
   /**
    * The compilation unit being indexed.
    */
-  final CompilationUnit unit;
+  CompilationUnit unit;
 
   /**
    * The element of the compilation unit being indexed.
@@ -629,9 +630,10 @@
    * @param context the context in which compilation unit was resolved
    * @param unit the fully resolved AST structure
    */
-  IndexUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+  IndexUnitOperation(IndexStore indexStore, AnalysisContext context, CompilationUnit unit) {
     this._indexStore = indexStore;
     this._context = context;
+    this.unit = unit;
     this._unitElement = unit.element;
     this._source = _unitElement.source;
   }
@@ -781,7 +783,7 @@
   /**
    * The source container to remove.
    */
-  final SourceContainer container;
+  SourceContainer container;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -790,9 +792,10 @@
    * @param context the [AnalysisContext] to remove container in
    * @param container the [SourceContainer] to remove from index
    */
-  RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, this.container) {
+  RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, SourceContainer container) {
     this._indexStore = indexStore;
     this._context = context;
+    this.container = container;
   }
 
   @override
@@ -2272,7 +2275,7 @@
   /**
    * The context being removed.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -2280,8 +2283,9 @@
    * @param indexStore the index store against which this operation is being run
    * @param context the [AnalysisContext] to remove
    */
-  RemoveContextOperation(IndexStore indexStore, this.context) {
+  RemoveContextOperation(IndexStore indexStore, AnalysisContext context) {
     this._indexStore = indexStore;
+    this.context = context;
   }
 
   @override
@@ -2317,7 +2321,7 @@
   /**
    * The [HtmlUnit] being indexed.
    */
-  final ht.HtmlUnit unit;
+  ht.HtmlUnit unit;
 
   /**
    * The element of the [HtmlUnit] being indexed.
@@ -2336,9 +2340,10 @@
    * @param context the context in which [HtmlUnit] was resolved
    * @param unit the fully resolved [HtmlUnit]
    */
-  IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+  IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, ht.HtmlUnit unit) {
     this._indexStore = indexStore;
     this._context = context;
+    this.unit = unit;
     this._htmlElement = unit.element;
     this._source = _htmlElement.source;
   }
@@ -2386,17 +2391,17 @@
   /**
    * The element containing this location.
    */
-  final Element element;
+  Element element;
 
   /**
    * The offset of this location within the resource containing the element.
    */
-  final int offset;
+  int offset = 0;
 
   /**
    * The length of this location.
    */
-  final int length;
+  int length = 0;
 
   /**
    * Internal field used to hold a key that is referenced at this location.
@@ -2411,10 +2416,13 @@
    * @param offset the offset of this location within the resource containing the element
    * @param length the length of this location
    */
-  Location(this.element, this.offset, this.length) {
+  Location(Element element, int offset, int length) {
     if (element == null) {
       throw new IllegalArgumentException("element location cannot be null");
     }
+    this.element = element;
+    this.offset = offset;
+    this.length = length;
   }
 
   /**
@@ -2440,18 +2448,21 @@
 class GetRelationshipsOperation implements IndexOperation {
   IndexStore _indexStore;
 
-  final Element element;
+  Element element;
 
-  final Relationship relationship;
+  Relationship relationship;
 
-  final RelationshipCallback callback;
+  RelationshipCallback callback;
 
   /**
    * Initialize a newly created operation that will access the locations that have a specified
    * relationship with a specified element.
    */
-  GetRelationshipsOperation(IndexStore indexStore, this.element, this.relationship, this.callback) {
+  GetRelationshipsOperation(IndexStore indexStore, Element element, Relationship relationship, RelationshipCallback callback) {
     this._indexStore = indexStore;
+    this.element = element;
+    this.relationship = relationship;
+    this.callback = callback;
   }
 
   @override
@@ -2475,11 +2486,15 @@
  * [Location] with attached data.
  */
 class LocationWithData<D> extends Location {
-  final D data;
+  D data;
 
-  LocationWithData.con1(Location location, this.data) : super(location.element, location.offset, location.length);
+  LocationWithData.con1(Location location, D data) : super(location.element, location.offset, location.length) {
+    this.data = data;
+  }
 
-  LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
+  LocationWithData.con2(Element element, int offset, int length, D data) : super(element, offset, length) {
+    this.data = data;
+  }
 
   @override
   Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 4c47b62..a6282eb 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -260,6 +260,10 @@
   String toString() => "UnsupportedOperationException";
 }
 
+class NoSuchElementException extends JavaException {
+  String toString() => "NoSuchElementException";
+}
+
 class NumberFormatException extends JavaException {
   String toString() => "NumberFormatException";
 }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index dd2d982..16a7bc1 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -26,12 +26,12 @@
   /**
    * The documentation comment that was parsed, or `null` if none was given.
    */
-  final Comment comment;
+  Comment comment;
 
   /**
    * The metadata that was parsed.
    */
-  final List<Annotation> metadata;
+  List<Annotation> metadata;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -39,7 +39,10 @@
    * @param comment the documentation comment that was parsed
    * @param metadata the metadata that was parsed
    */
-  CommentAndMetadata(this.comment, this.metadata);
+  CommentAndMetadata(Comment comment, List<Annotation> metadata) {
+    this.comment = comment;
+    this.metadata = metadata;
+  }
 }
 
 /**
@@ -50,12 +53,12 @@
   /**
    * The 'final', 'const' or 'var' keyword, or `null` if none was given.
    */
-  final Token keyword;
+  Token keyword;
 
   /**
    * The type, of `null` if no type was specified.
    */
-  final TypeName type;
+  TypeName type;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -63,7 +66,10 @@
    * @param keyword the 'final', 'const' or 'var' keyword
    * @param type the type
    */
-  FinalConstVarOrType(this.keyword, this.type);
+  FinalConstVarOrType(Token keyword, TypeName type) {
+    this.keyword = keyword;
+    this.type = type;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6137bf0..9ec0164 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -7671,14 +7671,16 @@
   /**
    * The name of the synthetic identifier.
    */
-  final String name;
+  String name;
 
   /**
    * Initialize a newly created synthetic identifier to have the given name.
    *
    * @param name the name of the synthetic identifier
    */
-  ElementResolver_SyntheticIdentifier(this.name);
+  ElementResolver_SyntheticIdentifier(String name) {
+    this.name = name;
+  }
 
   @override
   accept(AstVisitor visitor) => null;
@@ -8731,7 +8733,7 @@
   /**
    * The source specifying the defining compilation unit of this library.
    */
-  final Source librarySource;
+  Source librarySource;
 
   /**
    * The library element representing this library.
@@ -8786,9 +8788,10 @@
    * @param errorListener the listener to which analysis errors will be reported
    * @param librarySource the source specifying the defining compilation unit of this library
    */
-  Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, this.librarySource) {
+  Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, Source librarySource) {
     this._analysisContext = analysisContext;
     this._errorListener = errorListener;
+    this.librarySource = librarySource;
     this._libraryElement = analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
   }
 
@@ -8978,7 +8981,7 @@
    * @param unit the AST structure associated with the defining compilation unit for this library
    */
   void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) {
-    _astMap[librarySource] = new ResolvableCompilationUnit(modificationStamp, unit);
+    _astMap[librarySource] = new ResolvableCompilationUnit.con1(modificationStamp, unit);
   }
 
   /**
@@ -9223,7 +9226,7 @@
   /**
    * The analysis context in which the libraries are being analyzed.
    */
-  final InternalAnalysisContext analysisContext;
+  InternalAnalysisContext analysisContext;
 
   /**
    * The listener to which analysis errors will be reported, this error listener is either
@@ -9262,7 +9265,8 @@
    *
    * @param analysisContext the analysis context in which the library is being analyzed
    */
-  LibraryResolver(this.analysisContext) {
+  LibraryResolver(InternalAnalysisContext analysisContext) {
+    this.analysisContext = analysisContext;
     this._errorListener = new RecordingErrorListener();
     _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
@@ -10126,7 +10130,7 @@
   /**
    * The conditional analysis error.
    */
-  final AnalysisError analysisError;
+  AnalysisError analysisError;
 
   /**
    * Instantiate a new [ProxyConditionalAnalysisError] with some enclosing element and the
@@ -10135,8 +10139,9 @@
    * @param enclosingElement the enclosing element
    * @param analysisError the conditional analysis error
    */
-  ProxyConditionalAnalysisError(Element enclosingElement, this.analysisError) {
+  ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysisError) {
     this._enclosingElement = enclosingElement;
+    this.analysisError = analysisError;
   }
 
   /**
@@ -11471,7 +11476,7 @@
   /**
    * The source representing the compilation unit being visited.
    */
-  final Source source;
+  Source source;
 
   /**
    * The error listener that will be informed of any errors that are found during resolution.
@@ -11486,7 +11491,7 @@
   /**
    * The object used to access the types from the core library.
    */
-  final TypeProvider typeProvider;
+  TypeProvider typeProvider;
 
   /**
    * The scope used to resolve labels for `break` and `continue` statements, or
@@ -11501,11 +11506,13 @@
    * @param source the source representing the compilation unit being visited
    * @param typeProvider the object used to access the types from the core library
    */
-  ScopedVisitor.con1(Library library, this.source, this.typeProvider) {
+  ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider) {
     this._definingLibrary = library.libraryElement;
+    this.source = source;
     LibraryScope libraryScope = library.libraryScope;
     this._errorListener = libraryScope.errorListener;
     this._nameScope = libraryScope;
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -11518,10 +11525,12 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con2(LibraryElement definingLibrary, this.source, this.typeProvider, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = new LibraryScope(definingLibrary, errorListener);
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -11535,10 +11544,12 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con3(LibraryElement definingLibrary, this.source, this.typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = nameScope;
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -15783,7 +15794,7 @@
   /**
    * The scope in which this scope is lexically enclosed.
    */
-  final Scope enclosingScope;
+  Scope enclosingScope;
 
   /**
    * A table mapping names that will be defined in this scope, but right now are not initialized.
@@ -15802,7 +15813,9 @@
    *
    * @param enclosingScope the scope in which this scope is lexically enclosed
    */
-  EnclosedScope(this.enclosingScope);
+  EnclosedScope(Scope enclosingScope) {
+    this.enclosingScope = enclosingScope;
+  }
 
   @override
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
@@ -16017,7 +16030,7 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  final AnalysisErrorListener errorListener;
+  AnalysisErrorListener errorListener;
 
   /**
    * A list of the namespaces representing the names that are available in this scope from imported
@@ -16032,8 +16045,9 @@
    *          this scope
    * @param errorListener the listener that is to be informed when an error is encountered
    */
-  LibraryImportScope(LibraryElement definingLibrary, this.errorListener) {
+  LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.errorListener = errorListener;
     _createImportedNamespaces(definingLibrary);
   }
 
@@ -20712,8 +20726,6 @@
       if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
         continue;
       }
-      // Reference the type of the enclosing class
-      InterfaceType enclosingType = _enclosingClass.type;
       // Check to see if some element is in local enclosing class that matches the name of the
       // required member.
       if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
@@ -20724,9 +20736,16 @@
       }
       // First check to see if this element was declared in the superclass chain, in which case
       // there is already a concrete implementation.
-      ExecutableElement elt = membersInheritedFromSuperclasses.get(executableElt.name);
+      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
       // Check to see if an element was found in the superclass chain with the correct name.
       if (elt != null) {
+        // Reference the types, if any are null then continue.
+        InterfaceType enclosingType = _enclosingClass.type;
+        FunctionType concreteType = elt.type;
+        FunctionType requiredMemberType = executableElt.type;
+        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
+          continue;
+        }
         // Some element was found in the superclass chain that matches the name of the required
         // member.
         // If it is not abstract and it is the correct one (types match- the version of this method
@@ -20735,8 +20754,8 @@
         if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
           // Since we are comparing two function types, we need to do the appropriate type
           // substitutions first ().
-          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(elt.type, executableElt.name, enclosingType);
-          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(executableElt.type, executableElt.name, enclosingType);
+          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
+          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
           if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
             continue;
           }
@@ -22100,12 +22119,12 @@
   /**
    * The type of this error.
    */
-  final ErrorType type;
+  ErrorType type;
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -22119,7 +22138,10 @@
    * @param type the type of this error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ResolverErrorCode.con1(String name, int ordinal, this.type, this.message) : super(name, ordinal);
+  ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : super(name, ordinal) {
+    this.type = type;
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given type, message and correction.
@@ -22128,7 +22150,9 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, String correction) : super(name, ordinal) {
+  ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String message, String correction) : super(name, ordinal) {
+    this.type = type;
+    this.message = message;
     this.correction9 = correction;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index efb01ff..ef03a42 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -163,7 +163,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -176,7 +176,9 @@
    *
    * @param message the message template used to create the message to be displayed for this error
    */
-  ScannerErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  ScannerErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -184,7 +186,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ScannerErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  ScannerErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction10 = correction;
   }
 
@@ -795,7 +798,7 @@
   /**
    * The source being scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The reader used to access the characters in the source.
@@ -865,7 +868,8 @@
    * @param reader the character reader used to read the characters in the source
    * @param errorListener the error listener that will be informed of any errors that are found
    */
-  Scanner(this.source, CharacterReader reader, AnalysisErrorListener errorListener) {
+  Scanner(Source source, CharacterReader reader, AnalysisErrorListener errorListener) {
+    this.source = source;
     this._reader = reader;
     this._errorListener = errorListener;
     _tokens = new Token(TokenType.EOF, -1);
@@ -1927,7 +1931,7 @@
   /**
    * The type of the token.
    */
-  final TokenType type;
+  TokenType type;
 
   /**
    * The offset from the beginning of the file to the first character in the token.
@@ -1950,7 +1954,8 @@
    * @param type the type of the token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  Token(this.type, int offset) {
+  Token(TokenType type, int offset) {
+    this.type = type;
     this.offset = offset;
   }
 
@@ -2198,7 +2203,7 @@
   /**
    * The keyword being represented by this token.
    */
-  final Keyword keyword;
+  Keyword keyword;
 
   /**
    * Initialize a newly created token to represent the given keyword.
@@ -2206,7 +2211,9 @@
    * @param keyword the keyword being represented by this token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+  KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
+    this.keyword = keyword;
+  }
 
   @override
   Token copy() => new KeywordToken(keyword, offset);
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 288677b..446c8ea 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -496,14 +496,16 @@
   /**
    * The single character encoding used to identify this kind of URI.
    */
-  final int encoding;
+  int encoding = 0;
 
   /**
    * Initialize a newly created URI kind to have the given encoding.
    *
    * @param encoding the single character encoding used to identify this kind of URI.
    */
-  UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
+  UriKind(String name, int ordinal, int encoding) : super(name, ordinal) {
+    this.encoding = encoding;
+  }
 }
 
 /**
@@ -519,13 +521,13 @@
    * The 0-based index of the first character of the source code for this element, relative to the
    * source buffer in which this element is contained.
    */
-  final int offset;
+  int offset = 0;
 
   /**
    * The number of characters of the source code for this element, relative to the source buffer in
    * which this element is contained.
    */
-  final int length;
+  int length = 0;
 
   /**
    * Initialize a newly created source range using the given offset and the given length.
@@ -533,7 +535,10 @@
    * @param offset the given offset
    * @param length the given length
    */
-  SourceRange(this.offset, this.length);
+  SourceRange(int offset, int length) {
+    this.offset = offset;
+    this.length = length;
+  }
 
   /**
    * @return `true` if <code>x</code> is in [offset, offset + length) interval.
@@ -753,12 +758,12 @@
   /**
    * The one-based index of the line containing the character.
    */
-  final int lineNumber;
+  int lineNumber = 0;
 
   /**
    * The one-based index of the column containing the character.
    */
-  final int columnNumber;
+  int columnNumber = 0;
 
   /**
    * Initialize a newly created location to represent the location of the character at the given
@@ -767,7 +772,10 @@
    * @param lineNumber the one-based index of the line containing the character
    * @param columnNumber the one-based index of the column containing the character
    */
-  LineInfo_Location(this.lineNumber, this.columnNumber);
+  LineInfo_Location(int lineNumber, int columnNumber) {
+    this.lineNumber = lineNumber;
+    this.columnNumber = columnNumber;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index aef7473..a9bddb5 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -26,12 +26,14 @@
   /**
    * A flag indicating whether this is an optional parameter.
    */
-  final bool isOptional;
+  bool isOptional = false;
 
   /**
    * Initialize a newly created kind with the given state.
    *
    * @param isOptional `true` if this is an optional parameter
    */
-  ParameterKind(String name, int ordinal, this.isOptional) : super(name, ordinal);
+  ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
+    this.isOptional = isOptional;
+  }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 9b33aa2..f5d2ae8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.13.0-dev.7
+version: 0.13.0-dev.9
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index d49726d..7315085 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -23527,9 +23527,11 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  final AnalysisErrorListener errorListener;
+  AnalysisErrorListener errorListener;
 
-  ScopeTest_TestScope(this.errorListener);
+  ScopeTest_TestScope(AnalysisErrorListener errorListener) {
+    this.errorListener = errorListener;
+  }
 
   @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index c355a35..753e5a1 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -4,6 +4,9 @@
   default. When using Barback with pub in verbose mode, these messages will be
   printed.
 
+* Add a `Transform.hasInput` function that returns whether or not a given
+  secondary input exists.
+
 * `Transformer.allowedExtensions` now supports extensions containing multiple
   periods, such as `.dart.js`.
 
@@ -22,3 +25,8 @@
   considered to have failed after it finishes running `apply()`. This means that
   its outputs will not be consumed by future transformers and its primary input
   will not be passed through to the next phase.
+
+* If a transform calls `Transform.getInput`, `Transform.readInput`,
+  `Transform.readInputAsString`, or `Transform.hasInput` on an input that
+  doesn't exist, the transform will be re-run if that input is created in the
+  future.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index b87ca39..74db0d9 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -48,8 +48,17 @@
   /// one.
   final _loadingSources = new Map<AssetId, CancelableFuture<Asset>>();
 
+  /// The list of phases in this cascade.
+  ///
+  /// This will always contain at least one phase, and the first phase will
+  /// never have any transformers. This ensures that every transformer can
+  /// request inputs from a previous phase.
   final _phases = <Phase>[];
 
+  /// The subscription to the [Phase.onDone] stream of the last [Phase] in
+  /// [_phases].
+  StreamSubscription _phaseOnDoneSubscription;
+
   /// A stream that emits any errors from the cascade or the transformers.
   ///
   /// This emits errors as they're detected. If an error occurs in one part of
@@ -169,9 +178,12 @@
   void updateTransformers(Iterable<Iterable> transformersIterable) {
     var transformers = transformersIterable.toList();
 
+    // Always preserve a single phase with no transformers at the beginning of
+    // the cascade so that [TransformNode]s in the first populated phase will
+    // have something to request assets from.
     for (var i = 0; i < transformers.length; i++) {
-      if (_phases.length > i) {
-        _phases[i].updateTransformers(transformers[i]);
+      if (_phases.length > i + 1) {
+        _phases[i + 1].updateTransformers(transformers[i]);
         continue;
       }
 
@@ -180,12 +192,14 @@
       phase.updateTransformers(transformers[i]);
     }
 
-    if (transformers.length == 0) {
-      _phases.last.updateTransformers([]);
-    } else if (transformers.length < _phases.length) {
-      _phases[transformers.length - 1].removeFollowing();
-      _phases.removeRange(transformers.length, _phases.length);
+    for (var i = transformers.length + 1; i < _phases.length; i++) {
+      _phases[i].remove();
     }
+    _phases.removeRange(transformers.length + 1, _phases.length);
+
+    _phaseOnDoneSubscription.cancel();
+    _phaseOnDoneSubscription = _phases.last.onDone
+        .listen(_onDoneController.add);
   }
 
   /// Force all [LazyTransformer]s' transforms in this cascade to begin
@@ -203,9 +217,8 @@
   /// Add [phase] to the end of [_phases] and watch its streams.
   void _addPhase(Phase phase) {
     _onLogPool.add(phase.onLog);
-    phase.onDone.listen((_) {
-      if (!isDirty) _onDoneController.add(null);
-    });
+    if (_phaseOnDoneSubscription != null) _phaseOnDoneSubscription.cancel();
+    _phaseOnDoneSubscription = phase.onDone.listen(_onDoneController.add);
 
     _phases.add(phase);
   }
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/base_transform.dart
index ea85f02..c0de0f8 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/base_transform.dart
@@ -110,6 +110,17 @@
   Stream<List<int>> readInput(AssetId id) =>
       futureStream(getInput(id).then((input) => input.read()));
 
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
   /// Consume the primary input so that it doesn't get processed by future
   /// phases or emitted once processing has finished.
   ///
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 4ef344f..970d4aa 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -37,15 +37,15 @@
   ///
   /// This is synchronous in order to guarantee that it will emit an event as
   /// soon as [isDirty] flips from `true` to `false`.
-  Stream get onDone => _onDoneController.stream;
-  final _onDoneController = new StreamController.broadcast(sync: true);
+  Stream get onDone => _onDone;
+  Stream _onDone;
 
   /// A stream that emits any new assets emitted by [this].
   ///
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
-  Stream<AssetNode> get onAsset => _onAssetPool.stream;
-  final _onAssetPool = new StreamPool<AssetNode>();
+  Stream<AssetNode> get onAsset => _onAsset;
+  Stream<AssetNode> _onAsset;
 
   /// A stream that emits an event whenever any transforms in this group logs
   /// an entry.
@@ -53,10 +53,13 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   GroupRunner(AssetCascade cascade, this._group, this._location) {
-    _addPhase(new Phase(cascade, _location), _group.phases.first);
-    for (var phase in _group.phases.skip(1)) {
+    _addPhase(new Phase(cascade, _location), []);
+    for (var phase in _group.phases) {
       _addPhase(_phases.last.addPhase(), phase);
     }
+
+    _onAsset = _phases.last.onAsset;
+    _onDone = _phases.last.onDone;
   }
 
   /// Add a phase with [contents] to [this]'s list of phases.
@@ -65,11 +68,7 @@
   /// value.
   void _addPhase(Phase phase, Iterable contents) {
     _phases.add(phase);
-    _onAssetPool.add(phase.onAsset);
     _onLogPool.add(phase.onLog);
-    phase.onDone.listen((_) {
-      if (!isDirty) _onDoneController.add(null);
-    });
     phase.updateTransformers(contents);
   }
 
@@ -88,7 +87,9 @@
 
   /// Removes this group and all sub-phases within it.
   void remove() {
-    _phases.first.remove();
+    for (var phase in _phases) {
+      phase.remove();
+    }
   }
 
   String toString() => "group in phase $_location for $_group";
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index b7245f4..aa7dc78 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -91,14 +91,15 @@
   /// propagated as soon as they occur. Only a phase with no [next] phase will
   /// emit assets.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// Whether [this] is dirty and still has more processing to do.
   ///
   /// A phase is considered dirty if any of the previous phases in the same
   /// cascade are dirty, since those phases could emit an asset that this phase
   /// will then need to process.
-  bool get isDirty => (_previous != null && _previous.isDirty) ||
+  bool get isDirty => (previous != null && previous.isDirty) ||
       _inputs.values.any((input) => input.isDirty) ||
       _groups.values.any((group) => group.isDirty);
 
@@ -108,16 +109,13 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   /// The previous phase in the cascade, or null if this is the first phase.
-  final Phase _previous;
+  final Phase previous;
 
-  /// The subscription to [_previous]'s [onDone] stream.
+  /// The subscription to [previous]'s [onDone] stream.
   StreamSubscription _previousOnDoneSubscription;
 
-  /// The phase after this one.
-  ///
-  /// Outputs from this phase will be passed to it.
-  Phase get next => _next;
-  Phase _next;
+  /// The subscription to [previous]'s [onAsset] stream.
+  StreamSubscription<AssetNode> _previousOnAssetSubscription;
 
   /// A map of asset ids to completers for [getInput] requests.
   ///
@@ -140,9 +138,10 @@
   Phase(AssetCascade cascade, String location)
       : this._(cascade, location, 0);
 
-  Phase._(this.cascade, this._location, this._index, [this._previous]) {
-    if (_previous != null) {
-      _previousOnDoneSubscription = _previous.onDone.listen((_) {
+  Phase._(this.cascade, this._location, this._index, [this.previous]) {
+    if (previous != null) {
+      _previousOnAssetSubscription = previous.onAsset.listen(addInput);
+      _previousOnDoneSubscription = previous.onDone.listen((_) {
         if (!isDirty) _onDoneController.add(null);
       });
     }
@@ -205,33 +204,11 @@
     }
   }
 
-  // TODO(nweiz): If the input is available when this is called, it's
+  // TODO(nweiz): If the output is available when this is called, it's
   // theoretically possible for it to become unavailable between the call and
   // the return. If it does so, it won't trigger the rebuilding process. To
   // avoid this, we should have this and the methods it calls take explicit
   // callbacks, as in [AssetNode.whenAvailable].
-  /// Gets the asset node for an input [id].
-  ///
-  /// If [id] is for a generated or transformed asset, this will wait until it
-  /// has been created and return it. This means that the returned asset will
-  /// always be [AssetState.AVAILABLE].
-  /// 
-  /// If the input cannot be found, returns null.
-  Future<AssetNode> getInput(AssetId id) {
-    return syncFuture(() {
-      if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
-      if (_previous != null) return _previous.getOutput(id);
-      if (!_inputs.containsKey(id)) return null;
-
-      var input = _inputs[id].input;
-      return input.whenAvailable((_) => input).catchError((error) {
-        if (error is! AssetNotFoundException || error.id != id) throw error;
-        // Retry in case the input was replaced.
-        return getInput(id);
-      });
-    });
-  }
-
   /// Gets the asset node for an output [id].
   ///
   /// If [id] is for a generated or transformed asset, this will wait until it
@@ -321,23 +298,20 @@
   ///
   /// This may only be called on a phase with no phase following it.
   Phase addPhase() {
-    assert(_next == null);
-    _next = new Phase._(cascade, _location, _index + 1, this);
+    var next = new Phase._(cascade, _location, _index + 1, this);
     for (var output in _outputs.values.toList()) {
       // Remove [output]'s listeners because now they should get the asset from
-      // [_next], rather than this phase. Any transforms consuming [output] will
+      // [next], rather than this phase. Any transforms consuming [output] will
       // be re-run and will consume the output from the new final phase.
       output.removeListeners();
     }
-    return _next;
+    return next;
   }
 
   /// Mark this phase as removed.
   ///
-  /// This will remove all the phase's outputs and all following phases.
+  /// This will remove all the phase's outputs.
   void remove() {
-    if (_previous != null) _previous._next = null;
-    removeFollowing();
     for (var input in _inputs.values.toList()) {
       input.remove();
     }
@@ -349,13 +323,9 @@
     if (_previousOnDoneSubscription != null) {
       _previousOnDoneSubscription.cancel();
     }
-  }
-
-  /// Remove all phases after this one.
-  void removeFollowing() {
-    if (_next == null) return;
-    _next.remove();
-    _next = null;
+    if (_previousOnAssetSubscription != null) {
+      _previousOnAssetSubscription.cancel();
+    }
   }
 
   /// Add [asset] as an output of this phase.
@@ -388,11 +358,7 @@
   /// This should be called after [_handleOutput], so that collisions are
   /// resolved.
   void _emit(AssetNode asset) {
-    if (_next != null) {
-      _next.addInput(asset);
-    } else {
-      _onAssetController.add(asset);
-    }
+    _onAssetController.add(asset);
     _providePendingAsset(asset);
   }
 
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index c6b3826..db33779 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -50,7 +50,7 @@
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
   Stream<AssetNode> get onAsset => _onAssetPool.stream;
-  final _onAssetPool = new StreamPool<AssetNode>();
+  final _onAssetPool = new StreamPool<AssetNode>.broadcast();
 
   /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => _transforms.any((transform) => transform.isDirty);
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/phase_output.dart
index 1807156..bb5f176 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/phase_output.dart
@@ -36,7 +36,8 @@
   /// A stream that emits an [AssetNode] each time this output starts forwarding
   /// a new asset.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// The assets for this output.
   ///
diff --git a/pkg/barback/lib/src/transform_logger.dart b/pkg/barback/lib/src/transform_logger.dart
index c3e5c73..5f43a2d 100644
--- a/pkg/barback/lib/src/transform_logger.dart
+++ b/pkg/barback/lib/src/transform_logger.dart
@@ -56,7 +56,15 @@
   /// Otherwise it's associated with the primary input of [transformer].
   /// If present, [span] indicates the location in the input asset that caused
   /// the error.
-  // TODO(sigmund,nweiz): clarify when an error should be logged or thrown.
+  ///
+  /// Logging any errors will cause Barback to consider the transformation to
+  /// have failed, much like throwing an exception. This means that neither the
+  /// primary input nor any outputs emitted by the transformer will be passed on
+  /// to the following phase, and the build will be reported as having failed.
+  ///
+  /// Unlike throwing an exception, this doesn't cause a transformer to stop
+  /// running. This makes it useful in cases where a single input may have
+  /// multiple errors that the user wants to know about.
   void error(String message, {AssetId asset, Span span}) {
     _logFunction(asset, LogLevel.ERROR, message, span);
   }
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 4b0a076..e31d5e8 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -40,6 +40,9 @@
   /// The subscription to [primary]'s [AssetNode.onStateChange] stream.
   StreamSubscription _primarySubscription;
 
+  /// The subscription to [phase]'s [Phase.onAsset] stream.
+  StreamSubscription<AssetNode> _phaseSubscription;
+
   /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => !_state.isDone;
 
@@ -47,10 +50,12 @@
   bool _isLazy;
 
   /// The subscriptions to each input's [AssetNode.onStateChange] stream.
-  var _inputSubscriptions = new Map<AssetId, StreamSubscription>();
+  final _inputSubscriptions = new Map<AssetId, StreamSubscription>();
 
   /// The controllers for the asset nodes emitted by this node.
-  var _outputControllers = new Map<AssetId, AssetNodeController>();
+  final _outputControllers = new Map<AssetId, AssetNodeController>();
+
+  final _missingInputs = new Set<AssetId>();
 
   /// The controller that's used to pass [primary] through [this] if it's not
   /// consumed or overwritten.
@@ -73,7 +78,8 @@
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// A stream that emits an event whenever this transform logs an entry.
   ///
@@ -108,6 +114,10 @@
       }
     });
 
+    _phaseSubscription = phase.previous.onAsset.listen((node) {
+      if (_missingInputs.contains(node.id)) _dirty(primaryChanged: false);
+    });
+
     _process();
   }
 
@@ -127,6 +137,7 @@
     _onAssetController.close();
     _onDoneController.close();
     _primarySubscription.cancel();
+    _phaseSubscription.cancel();
     _clearInputSubscriptions();
     _clearOutputs();
     if (_passThroughController != null) {
@@ -255,11 +266,14 @@
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
-    return phase.getInput(id).then((node) {
+    return phase.previous.getOutput(id).then((node) {
       // Throw if the input isn't found. This ensures the transformer's apply
       // is exited. We'll then catch this and report it through the proper
       // results stream.
-      if (node == null) throw new AssetNotFoundException(id);
+      if (node == null) {
+        _missingInputs.add(id);
+        throw new AssetNotFoundException(id);
+      }
 
       _inputSubscriptions.putIfAbsent(node.id, () {
         return node.onStateChange.listen((_) => _dirty(primaryChanged: false));
@@ -383,6 +397,7 @@
 
   /// Cancels all subscriptions to secondary input nodes.
   void _clearInputSubscriptions() {
+    _missingInputs.clear();
     for (var subscription in _inputSubscriptions.values) {
       subscription.cancel();
     }
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 011f69f..02a7675 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -176,4 +176,22 @@
     expectAsset("app|foo.txt", "failed to load app|nothing");
     buildShouldSucceed();
   });
+
+  test("a transformer that fails due to a missing secondary input is re-run "
+      "when that input appears", () {
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar"
+    }, {"app": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldFail([isMissingInputException("app|bar.inc")]);
+
+    updateSources(["app|bar.inc"]);
+    expectAsset("app|foo.out", "bar");
+    buildShouldSucceed();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/transform_test.dart b/pkg/barback/test/package_graph/transform/transform_test.dart
index 747512c..dce5e2c 100644
--- a/pkg/barback/test/package_graph/transform/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform/transform_test.dart
@@ -341,4 +341,45 @@
     expectAsset('app|bar.out', 'spread txt.out');
     buildShouldSucceed();
   });
+
+  group("Transform.hasInput", () {
+    test("returns whether an input exists", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|foo.txt', 'app|bar.txt', 'app|baz.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt',
+          'app|foo.txt: true, app|bar.txt: true, app|baz.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input stops existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+
+      removeSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input starts existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+    
+      updateSources(['app|foo.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    
+      updateSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+    });
+  });
 }
diff --git a/pkg/barback/test/transformer/has_input.dart b/pkg/barback/test/transformer/has_input.dart
new file mode 100644
index 0000000..add3017
--- /dev/null
+++ b/pkg/barback/test/transformer/has_input.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 barback.test.transformer.has_input;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// Overwrites its primary inputs with descriptions of whether various secondary
+/// inputs exist.
+class HasInputTransformer extends MockTransformer {
+  /// The inputs whose existence will be checked.
+  final List<AssetId> inputs;
+
+  HasInputTransformer(Iterable<String> inputs)
+      : inputs = inputs.map((input) => new AssetId.parse(input)).toList();
+
+  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+
+  Future doApply(Transform transform) {
+    return Future.wait(inputs.map((input) {
+      return transform.hasInput(input).then((hasInput) => "$input: $hasInput");
+    })).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id, results.join(', ')));
+    });
+  }
+
+  String toString() => "has inputs $inputs";
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 4d72a2b..7a77f1b 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -24,6 +24,7 @@
 export 'transformer/conditionally_consume_primary.dart';
 export 'transformer/create_asset.dart';
 export 'transformer/emit_nothing.dart';
+export 'transformer/has_input.dart';
 export 'transformer/lazy_bad.dart';
 export 'transformer/lazy_many_to_one.dart';
 export 'transformer/lazy_rewrite.dart';
diff --git a/pkg/browser/pubspec.yaml b/pkg/browser/pubspec.yaml
index e51235f..3bf88f1 100644
--- a/pkg/browser/pubspec.yaml
+++ b/pkg/browser/pubspec.yaml
@@ -1,8 +1,8 @@
 name: browser
-version: 0.10.0
+version: 0.10.0+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
  The bootstrap dart.js script for Dart apps running in the browser.
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: ">=1.3.0-dev.4.1 <2.0.0"
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
new file mode 100644
index 0000000..8fabaf6
--- /dev/null
+++ b/pkg/code_transformers/lib/assets.dart
@@ -0,0 +1,99 @@
+// 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.
+
+/// Common methods used by transfomers for dealing with asset IDs.
+library code_transformers.assets;
+
+import 'dart:math' show min, max;
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:source_maps/span.dart' show Span;
+
+/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
+/// is used to resolve relative urls that occur in HTML assets, including
+/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
+/// urls are not resolved unless [source] is Dart file (has a .dart extension).
+// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
+AssetId uriToAssetId(AssetId source, String url, TransformLogger logger,
+    Span span, {bool errorOnAbsolute: true}) {
+  if (url == null || url == '') return null;
+  var uri = Uri.parse(url);
+  var urlBuilder = path.url;
+  if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
+    if (source.extension == '.dart' && uri.scheme == 'package') {
+      var index = uri.path.indexOf('/');
+      if (index != -1) {
+        return new AssetId(uri.path.substring(0, index),
+            'lib${uri.path.substring(index)}');
+      }
+    }
+
+    if (errorOnAbsolute) {
+      logger.error('absolute paths not allowed: "$url"', span: span);
+    }
+    return null;
+  }
+
+  var targetPath = urlBuilder.normalize(
+      urlBuilder.join(urlBuilder.dirname(source.path), url));
+  var segments = urlBuilder.split(targetPath);
+  var sourceSegments = urlBuilder.split(source.path);
+  assert (sourceSegments.length > 0);
+  var topFolder = sourceSegments[0];
+  var entryFolder = topFolder != 'lib' && topFolder != 'asset';
+
+  // Find the first 'packages/'  or 'assets/' segment:
+  var packagesIndex = segments.indexOf('packages');
+  var assetsIndex = segments.indexOf('assets');
+  var index = (packagesIndex >= 0 && assetsIndex >= 0)
+      ? min(packagesIndex, assetsIndex)
+      : max(packagesIndex, assetsIndex);
+  if (index > -1) {
+    if (entryFolder) {
+      // URLs of the form "packages/foo/bar" seen under entry folders (like
+      // web/, test/, example/, etc) are resolved as an asset in another
+      // package. 'packages' can be used anywhere, there is no need to walk up
+      // where the entrypoint file was.
+      return _extractOtherPackageId(index, segments, logger, span);
+    } else if (index == 1 && segments[0] == '..') {
+      // Relative URLs of the form "../../packages/foo/bar" in an asset under
+      // lib/ or asset/ are also resolved as an asset in another package, but we
+      // check that the relative path goes all the way out where the packages
+      // folder lives (otherwise the app would not work in Dartium). Since
+      // [targetPath] has been normalized, "packages" or "assets" should be at
+      // index 1.
+      return _extractOtherPackageId(1, segments, logger, span);
+    } else {
+      var prefix = segments[index];
+      var fixedSegments = [];
+      fixedSegments.addAll(sourceSegments.map((_) => '..'));
+      fixedSegments.addAll(segments.sublist(index));
+      var fixedUrl = urlBuilder.joinAll(fixedSegments);
+      logger.error('Invalid url to reach to another package: $url. Path '
+          'reaching to other packages must first reach up all the '
+          'way to the $prefix folder. For example, try changing the url above '
+          'to: $fixedUrl', span: span);
+      return null;
+    }
+  }
+
+  // Otherwise, resolve as a path in the same package.
+  return new AssetId(source.package, targetPath);
+}
+
+AssetId _extractOtherPackageId(int index, List segments,
+    TransformLogger logger, Span span) {
+  if (index >= segments.length) return null;
+  var prefix = segments[index];
+  if (prefix != 'packages' && prefix != 'assets') return null;
+  var folder = prefix == 'packages' ? 'lib' : 'asset';
+  if (segments.length < index + 3) {
+    logger.error("incomplete $prefix/ path. It should have at least 3 "
+        "segments $prefix/name/path-from-name's-$folder-dir", span: span);
+    return null;
+  }
+  return new AssetId(segments[index + 1],
+      path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
+}
diff --git a/pkg/code_transformers/lib/resolver.dart b/pkg/code_transformers/lib/resolver.dart
index 91ce8c3..faf34db 100644
--- a/pkg/code_transformers/lib/resolver.dart
+++ b/pkg/code_transformers/lib/resolver.dart
@@ -5,6 +5,7 @@
 /// Tools for working with resolved ASTs from Barback transformers.
 library code_transformers.resolver;
 
-export 'src/resolvers.dart';
-export 'src/resolver.dart';
 export 'src/dart_sdk.dart';
+export 'src/entry_point.dart';
+export 'src/resolver.dart';
+export 'src/resolvers.dart';
diff --git a/pkg/code_transformers/lib/src/dart_sdk.dart b/pkg/code_transformers/lib/src/dart_sdk.dart
index 3b79f36..7b6f8e6 100644
--- a/pkg/code_transformers/lib/src/dart_sdk.dart
+++ b/pkg/code_transformers/lib/src/dart_sdk.dart
@@ -5,7 +5,7 @@
 library code_transformers.src.dart_sdk;
 
 import 'dart:convert' as convert;
-import 'dart:io' show Directory, File, Platform, Process;
+import 'dart:io' show File, Platform, Process;
 import 'package:path/path.dart' as path;
 
 
diff --git a/pkg/code_transformers/lib/src/entry_point.dart b/pkg/code_transformers/lib/src/entry_point.dart
new file mode 100644
index 0000000..ee7868e
--- /dev/null
+++ b/pkg/code_transformers/lib/src/entry_point.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.
+import 'dart:async';
+
+import 'package:analyzer/analyzer.dart' as analyzer;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:barback/barback.dart';
+
+/// Checks to see if the provided Asset is a Dart entry point.
+///
+/// Assets are considered entry points if they are Dart files located in
+/// web/, test/, benchmark/ or example/ and have a main() function.
+///
+/// Because this only analyzes the primary asset this may return true for files
+/// which are not dart entries if the file does not have a main() but does have
+/// parts or exports.
+Future<bool> isPossibleDartEntry(Asset asset) {
+  if (asset.id.extension != '.dart') return new Future.value(false);
+
+  if (!['benchmark', 'example', 'test', 'web']
+      .any((dir) => asset.id.path.startsWith("$dir/"))) {
+    return new Future.value(false);
+  }
+  return asset.readAsString().then((contents) {
+    return _couldBeEntrypoint(
+        analyzer.parseCompilationUnit(contents, suppressErrors: true));
+  });
+}
+
+bool _couldBeEntrypoint(CompilationUnit compilationUnit) {
+  // Allow two or fewer arguments so that entrypoints intended for use with
+  // [spawnUri] get counted.
+  var hasMain = compilationUnit.declarations.any((node) =>
+      node is FunctionDeclaration &&
+      node.name.name == "main" &&
+      node.functionExpression.parameters.parameters.length <= 2);
+
+  if (hasMain) return true;
+
+  // If it has an export or a part, assume the worst- that the main could be
+  // in there.
+  // We avoid loading those since this can be run from isPrimaryAsset calls
+  // where we do not have access to other sources.
+  return compilationUnit.directives.any((node) =>
+      node is ExportDirective || node is PartDirective);
+}
diff --git a/pkg/code_transformers/lib/src/resolver.dart b/pkg/code_transformers/lib/src/resolver.dart
index b944a4e..fac1aac 100644
--- a/pkg/code_transformers/lib/src/resolver.dart
+++ b/pkg/code_transformers/lib/src/resolver.dart
@@ -14,25 +14,23 @@
 
 /// Class for working with a barback based resolved AST.
 abstract class Resolver {
-  /// The Dart entry point file where parsing begins.
-  AssetId get entryPoint;
-
-  /// Update the status of all the sources referenced by the entryPoint and
-  /// update the resolved library.
+  /// Update the status of all the sources referenced by the entry points and
+  /// update the resolved library. If [entryPoints] is omitted, the primary
+  /// asset of [transform] is used as the only entry point.
   ///
   /// [release] must be called when done handling this Resolver to allow it
   /// to be used by later phases.
-  Future<Resolver> resolve(Transform transform);
+  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]);
 
   /// Release this resolver so it can be updated by following transforms.
   void release();
 
-  /// Gets the resolved Dart library for the entry asset, or null if
-  /// the AST has not been resolved.
+  /// Gets the resolved Dart library for an asset, or null if the AST has not
+  /// been resolved.
   ///
   /// If the AST has not been resolved then this normally means that the
   /// transformer hosting this needs to be in an earlier phase.
-  LibraryElement get entryLibrary;
+  LibraryElement getLibrary(AssetId assetId);
 
   /// Gets all libraries accessible from the entry point, recursively.
   ///
@@ -83,6 +81,10 @@
   /// the element came from the Dart SDK.
   Span getSourceSpan(Element element);
 
+  /// Get a [SourceFile] with the contents of the file that defines [element],
+  /// or null if the element came from the Dart SDK.
+  SourceFile getSourceFile(Element element);
+
   /// Creates a text edit transaction for the given element if it is able
   /// to be edited, returns null otherwise.
   ///
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 9322ccd..f26c072 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -5,14 +5,19 @@
 library code_transformer.src.resolver_impl;
 
 import 'dart:async';
+import 'package:analyzer/analyzer.dart' show parseCompilationUnit;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as native_path;
 import 'package:source_maps/refactor.dart';
 import 'package:source_maps/span.dart' show SourceFile, Span;
@@ -31,17 +36,14 @@
   final Map<AssetId, _AssetBasedSource> sources =
       <AssetId, _AssetBasedSource>{};
 
-  /// The Dart entry point file where parsing begins.
-  final AssetId entryPoint;
-
   final AnalysisContext _context =
       AnalysisEngine.instance.createAnalysisContext();
 
   /// Transform for which this is currently updating, or null when not updating.
   Transform _currentTransform;
 
-  /// The currently resolved library, or null if unresolved.
-  LibraryElement _entryLibrary;
+  /// The currently resolved entry libraries, or null if nothing is resolved.
+  List<LibraryElement> _entryLibraries;
 
   /// Future indicating when this resolver is done in the current phase.
   Future _lastPhaseComplete = new Future.value();
@@ -52,12 +54,9 @@
   /// Handler for all Dart SDK (dart:) sources.
   DirectoryBasedDartSdk _dartSdk;
 
-  /// Creates a resolver that will resolve the Dart code starting at
-  /// [entryPoint].
-  ///
-  /// [sdkDir] is the root directory of the Dart SDK, for resolving dart:
-  /// imports.
-  ResolverImpl(this.entryPoint, String sdkDir, {AnalysisOptions options}) {
+  /// Creates a resolver, where [sdkDir] is the root directory of the Dart SDK,
+  /// for resolving `dart:*` imports.
+  ResolverImpl(String sdkDir, {AnalysisOptions options}) {
     if (options == null) {
       options = new AnalysisOptionsImpl()
         ..cacheSize = 256 // # of sources to cache ASTs for.
@@ -74,16 +73,19 @@
         new _AssetUriResolver(this)]);
   }
 
-  LibraryElement get entryLibrary => _entryLibrary;
+  LibraryElement getLibrary(AssetId assetId) {
+    var source = sources[assetId];
+    return source == null ? null : _context.computeLibraryElement(source);
+  }
 
-  Future<Resolver> resolve(Transform transform) {
+  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]) {
     // Can only have one resolve in progress at a time, so chain the current
     // resolution to be after the last one.
     var phaseComplete = new Completer();
     var future = _lastPhaseComplete.then((_) {
       _currentPhaseComplete = phaseComplete;
-
-      return _performResolve(transform);
+      return _performResolve(transform,
+        entryPoints == null ? [transform.primaryInput.id] : entryPoints);
     }).then((_) => this);
     // Advance the lastPhaseComplete to be done when this phase is all done.
     _lastPhaseComplete = phaseComplete.future;
@@ -97,11 +99,12 @@
     _currentPhaseComplete.complete(null);
     _currentPhaseComplete = null;
 
-    // Clear out the entry lib since it should not be referenced after release.
-    _entryLibrary = null;
+    // Clear out libraries since they should not be referenced after release.
+    _entryLibraries = null;
+    _currentTransform = null;
   }
 
-  Future _performResolve(Transform transform) {
+  Future _performResolve(Transform transform, List<AssetId> entryPoints) {
     if (_currentTransform != null) {
       throw new StateError('Cannot be accessed by concurrent transforms');
     }
@@ -111,6 +114,7 @@
     // and see if it changed, then walk all files accessed by it.
     var visited = new Set<AssetId>();
     var visiting = new FutureGroup();
+    var toUpdate = [];
 
     void processAsset(AssetId assetId) {
       visited.add(assetId);
@@ -121,23 +125,22 @@
           source = new _AssetBasedSource(assetId, this);
           sources[assetId] = source;
         }
-        source.updateContents(contents);
-
-        source.dependentAssets
-            .where((id) => !visited.contains(id))
+        source.updateDependencies(contents);
+        toUpdate.add(new _PendingUpdate(source, contents));
+        source.dependentAssets.where((id) => !visited.contains(id))
             .forEach(processAsset);
-
       }, onError: (e) {
         _context.applyChanges(new ChangeSet()..removedSource(sources[assetId]));
         sources.remove(assetId);
       }));
     }
-    processAsset(entryPoint);
+    entryPoints.forEach(processAsset);
 
     // Once we have all asset sources updated with the new contents then
     // resolve everything.
     return visiting.future.then((_) {
       var changeSet = new ChangeSet();
+      toUpdate.forEach((pending) => pending.apply(changeSet));
       var unreachableAssets = new Set.from(sources.keys).difference(visited);
       for (var unreachable in unreachableAssets) {
         changeSet.removedSource(sources[unreachable]);
@@ -146,13 +149,15 @@
 
       // Update the analyzer context with the latest sources
       _context.applyChanges(changeSet);
-      // Resolve the AST
-      _entryLibrary = _context.computeLibraryElement(sources[entryPoint]);
-      _currentTransform = null;
+      // Force resolve each entry point (the getter will ensure the library is
+      // computed first).
+      _entryLibraries = entryPoints
+          .map((id) => _context.computeLibraryElement(sources[id])).toList();
     });
   }
 
-  Iterable<LibraryElement> get libraries => entryLibrary.visibleLibraries;
+  Iterable<LibraryElement> get libraries =>
+      _entryLibraries.expand((lib) => lib.visibleLibraries).toSet();
 
   LibraryElement getLibraryByName(String libraryName) =>
       libraries.firstWhere((l) => l.name == libraryName, orElse: () => null);
@@ -226,7 +231,7 @@
   }
 
   Span getSourceSpan(Element element) {
-    var sourceFile = _getSourceFile(element);
+    var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
     return sourceFile.span(element.node.offset, element.node.end);
   }
@@ -234,22 +239,27 @@
   TextEditTransaction createTextEditTransaction(Element element) {
     if (element.source is! _AssetBasedSource) return null;
 
+    // Cannot edit unless there is an active transformer.
+    if (_currentTransform == null) return null;
+
     _AssetBasedSource source = element.source;
     // Cannot modify assets in other packages.
-    if (source.assetId.package != entryPoint.package) return null;
+    if (source.assetId.package != _currentTransform.primaryInput.id.package) {
+      return null;
+    }
 
-    var sourceFile = _getSourceFile(element);
+    var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
 
     return new TextEditTransaction(source.rawContents, sourceFile);
   }
 
   /// Gets the SourceFile for the source of the element.
-  SourceFile _getSourceFile(Element element) {
+  SourceFile getSourceFile(Element element) {
     var assetId = getSourceAssetId(element);
     if (assetId == null) return null;
 
-    var importUri = _getSourceUri(element, from: entryPoint);
+    var importUri = _getSourceUri(element);
     var spanPath = importUri != null ? importUri.toString() : assetId.path;
     return new SourceFile.text(spanPath, sources[assetId].rawContents);
   }
@@ -275,30 +285,26 @@
 
   _AssetBasedSource(this.assetId, this._resolver);
 
+  /// Update the dependencies of this source. This parses [contents] but avoids
+  /// any analyzer resolution.
+  void updateDependencies(String contents) {
+    if (contents == _contents) return;
+    var unit = parseCompilationUnit(contents, suppressErrors: true);
+    _dependentAssets = unit.directives
+        .where((d) => (d is ImportDirective || d is PartDirective ||
+            d is ExportDirective))
+        .map((d) => _resolve(assetId, d.uri.stringValue, _logger,
+              _getSpan(d, contents)))
+        .where((id) => id != null).toSet();
+  }
+
   /// Update the contents of this file with [contents].
   ///
   /// Returns true if the contents of this asset have changed.
   bool updateContents(String contents) {
     if (contents == _contents) return false;
-    var added = _contents == null;
     _contents = contents;
     ++_revision;
-    // Invalidate the imports so we only parse the AST when needed.
-    _dependentAssets = null;
-
-    if (added) {
-      _resolver._context.applyChanges(new ChangeSet()..addedSource(this));
-    } else {
-      _resolver._context.applyChanges(new ChangeSet()..changedSource(this));
-    }
-
-    var compilationUnit = _resolver._context.parseCompilationUnit(this);
-    _dependentAssets = compilationUnit.directives
-        .where((d) => (d is ImportDirective || d is PartDirective ||
-            d is ExportDirective))
-        .map((d) => _resolve(assetId, d.uri.stringValue,
-            _logger, _getSpan(d)))
-        .where((id) => id != null).toSet();
     return true;
   }
 
@@ -357,13 +363,13 @@
   }
 
   /// For logging errors.
-  Span _getSpan(AstNode node) => _sourceFile.span(node.offset, node.end);
+  Span _getSpan(AstNode node, [String contents]) =>
+      _getSourceFile(contents).span(node.offset, node.end);
   /// For logging errors.
-  SourceFile get _sourceFile {
-    var uri = getSourceUri(_resolver.entryPoint);
+  SourceFile _getSourceFile([String contents]) {
+    var uri = getSourceUri();
     var path = uri != null ? uri.toString() : assetId.path;
-
-    return new SourceFile.text(path, rawContents);
+    return new SourceFile.text(path, contents != null ? contents : rawContents);
   }
 
   /// Gets a URI which would be appropriate for importing this file.
@@ -509,14 +515,7 @@
   // Dart SDK libraries do not have assets.
   if (uri.scheme == 'dart') return null;
 
-  if (uri.host != '' || uri.scheme != '' || path.isAbsolute(url)) {
-    logger.error('absolute paths not allowed: "$url"', span: span);
-    return null;
-  }
-
-  var targetPath = path.normalize(
-      path.join(path.dirname(source.path), url));
-  return new AssetId(source.package, targetPath);
+  return uriToAssetId(source, url, logger, span);
 }
 
 
@@ -574,3 +573,23 @@
    */
   Future<List<E>> get future => _completer.future;
 }
+
+/// A pending update to notify the resolver that a [Source] has been added or
+/// changed. This is used by the `_performResolve` algorithm above to apply all
+/// changes after it first discovers the transitive closure of files that are
+/// reachable from the sources.
+class _PendingUpdate {
+  _AssetBasedSource source;
+  String content;
+
+  _PendingUpdate(this.source, this.content);
+
+  void apply(ChangeSet changeSet) {
+    if (!source.updateContents(content)) return;
+    if (source._revision == 1 && source._contents != null) {
+      changeSet.addedSource(source);
+    } else {
+      changeSet.changedSource(source);
+    }
+  }
+}
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index b98e587..f7e39b3 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -19,21 +19,23 @@
 /// If multiple transformers rely on a resolved AST they should (ideally) share
 /// the same Resolvers object to minimize re-parsing the AST.
 class Resolvers {
-  final Map<AssetId, ResolverImpl> _resolvers = {};
+  final Map<AssetId, Resolver> _resolvers = {};
   final String dartSdkDirectory;
 
   Resolvers(this.dartSdkDirectory);
 
-  /// Get a resolver for the AST starting from [id].
+  /// Get a resolver for [transform]. If provided, this resolves the code
+  /// starting from each of the assets in [entryPoints]. If not, this resolves
+  /// the code starting from `transform.primaryInput.id` by default.
   ///
   /// [Resolver.release] must be called once it's done being used, or
   /// [ResolverTransformer] should be used to automatically release the
   /// resolver.
-  Future<Resolver> get(Transform transform) {
+  Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
     var id = transform.primaryInput.id;
     var resolver = _resolvers.putIfAbsent(id,
-        () => new ResolverImpl(id, dartSdkDirectory));
-    return resolver.resolve(transform);
+        () => new ResolverImpl(dartSdkDirectory));
+    return resolver.resolve(transform, entryPoints);
   }
 }
 
@@ -45,8 +47,27 @@
   /// The cache of resolvers- must be set from subclass.
   Resolvers resolvers;
 
-  Future apply(Transform transform) {
-    return resolvers.get(transform).then((resolver) {
+  /// This provides a default implementation of `Transformer.apply` that will
+  /// get and release resolvers automatically. Internally this:
+  ///   * Gets a resolver associated with the transform primary input.
+  ///   * Does resolution to the code starting from that input.
+  ///   * Calls [applyResolver].
+  ///   * Then releases the resolver.
+  ///
+  /// Use [applyToEntryPoints] instead if you need to override the entry points
+  /// to run the resolver on.
+  Future apply(Transform transform) => applyToEntryPoints(transform);
+
+  /// Helper function to make it easy to write an `Transformer.apply` method
+  /// that automatically gets and releases the resolver. This is typically used
+  /// as follows:
+  ///
+  ///    Future apply(Transform transform) {
+  ///       var entryPoints = ...; // compute entry points
+  ///       return applyToEntryPoints(transform, entryPoints);
+  ///    }
+  Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
+    return resolvers.get(transform, entryPoints).then((resolver) {
       return new Future.value(applyResolver(transform, resolver)).then((_) {
         resolver.release();
       });
diff --git a/pkg/code_transformers/lib/src/test_harness.dart b/pkg/code_transformers/lib/src/test_harness.dart
index db53909..e579a58 100644
--- a/pkg/code_transformers/lib/src/test_harness.dart
+++ b/pkg/code_transformers/lib/src/test_harness.dart
@@ -117,7 +117,7 @@
     }).then((_) {
       // We only check messages when an expectation is provided.
       if (messages == null) return;
-      expect(messages.length, messagesSeen,
+      expect(messagesSeen, messages.length,
           reason: 'less messages than expected');
     });
   }
diff --git a/pkg/code_transformers/lib/tests.dart b/pkg/code_transformers/lib/tests.dart
index bd6886c..9ed8e0b 100644
--- a/pkg/code_transformers/lib/tests.dart
+++ b/pkg/code_transformers/lib/tests.dart
@@ -7,11 +7,14 @@
 library code_transformers.tests;
 
 import 'dart:async' show Future;
+import 'dart:io' show Platform;
 
 import 'package:barback/barback.dart' show Transformer;
+import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
 import 'src/test_harness.dart';
+import 'src/dart_sdk.dart';
 
 /// Defines a test which invokes [applyTransformers].
 testPhases(String testName, List<List<Transformer>> phases,
@@ -38,3 +41,19 @@
   var helper = new TestHelper(phases, inputs, messages)..run();
   return helper.checkAll(results).then((_) => helper.tearDown());
 }
+
+/// Variant of [dartSdkDirectory] which includes additional cases only
+/// typically encountered in Dart's testing environment.
+String get testingDartSdkDirectory {
+  var sdkDir = dartSdkDirectory;
+  if (sdkDir == null) {
+    // If we cannot find the SDK dir, then assume this is being run from Dart's
+    // source directory and this script is the main script.
+    var segments = path.split(path.fromUri(Platform.script));
+    var index = segments.indexOf('pkg');
+    expect(index, greaterThan(0),
+        reason: 'testingDartSdkDirectory is only supported in pkg/ tests');
+    sdkDir = path.joinAll(segments.sublist(0, index)..add('sdk'));
+  }
+  return sdkDir;
+}
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 3ff8c5d..bd85f83 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,10 +1,10 @@
 name: code_transformers
-version: 0.0.1-dev.1
+version: 0.0.1-dev.4
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: "0.13.0-dev.6"
+  analyzer: ">=0.13.0-dev.9 <0.14.0"
   barback: ">=0.11.0 <0.12.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/code_transformers/test/assets_test.dart b/pkg/code_transformers/test/assets_test.dart
new file mode 100644
index 0000000..0d104dd
--- /dev/null
+++ b/pkg/code_transformers/test/assets_test.dart
@@ -0,0 +1,110 @@
+// 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 code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  useCompactVMConfiguration();
+
+
+  Future testAssetUri(String name,
+      {AssetId source, String uri, AssetId result, String message,
+      bool errorOnAbsolute: true}) {
+    test(name, () {
+      var transformer = new Validator((transform) {
+      var assetId = uriToAssetId(source, uri, transform.logger, null,
+          errorOnAbsolute: errorOnAbsolute);
+        expect(assetId, result);
+      });
+      var messages = [];
+      if (message != null) messages.add(message);
+
+      return applyTransformers(
+            [[transformer]],
+            inputs: {
+              source.toString(): ''
+            },
+            messages: messages);
+    });
+  }
+
+  group('uriToAssetId', () {
+    testAssetUri('resolves relative URIs',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'foo.dart',
+        result: new AssetId('a', 'web/foo.dart'));
+
+    testAssetUri('resolves package: URIs',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'package:foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves package: URIs from libs',
+        source: new AssetId('a', 'lib/main.dart'),
+        uri: 'package:foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves packages paths',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'packages/foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves relative packages paths',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'packages/foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('does not allow packages from non-dart lib files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: 'packages/foo/bar',
+        message: 'error: Invalid url to reach to another package: '
+            'packages/foo/bar. Path reaching to other packages must first '
+            'reach up all the way to the packages folder. For example, try '
+            'changing the url above to: ../../packages/foo/bar');
+
+    testAssetUri('allows relative packages from non-dart lib files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '../../packages/foo/bar',
+        result: new AssetId('foo', 'lib/bar'));
+
+    testAssetUri('does not allow package: imports from non-dart files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: 'package:foo/bar.dart',
+        message: 'error: absolute paths not allowed: "package:foo/bar.dart"');
+
+    testAssetUri('does not allow absolute /packages by default',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '/packages/foo/bar.dart',
+        message: 'error: absolute paths not allowed: "/packages/foo/bar.dart"');
+
+    testAssetUri('can suppress error on absolute /packages ',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '/packages/foo/bar.dart',
+        errorOnAbsolute: false,
+        result: null);
+  });
+}
+
+class Validator extends Transformer {
+  final Function validation;
+
+  Validator(this.validation);
+
+  Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+  Future apply(Transform transform) {
+    return new Future.value(validation(transform));
+  }
+}
diff --git a/pkg/code_transformers/test/entry_point_test.dart b/pkg/code_transformers/test/entry_point_test.dart
new file mode 100644
index 0000000..a384444
--- /dev/null
+++ b/pkg/code_transformers/test/entry_point_test.dart
@@ -0,0 +1,108 @@
+// 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 code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  useCompactVMConfiguration();
+
+  Future checkDartEntry({Map<String, String> inputs, bool expectation}) {
+    var transformer = new Validator((transform) {
+      return isPossibleDartEntry(transform.primaryInput).then((value) {
+        expect(value, expectation);
+      });
+    });
+    return applyTransformers(
+          [[transformer]],
+          inputs: inputs);
+  }
+
+  group('isPossibleDartEntry', () {
+    test('should handle empty files', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': '',
+          },
+          expectation: false);
+    });
+
+    test('should detect main methods', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'main() {}',
+          },
+          expectation: true);
+    });
+
+    test('should exclude dart mains in lib folder', () {
+      return checkDartEntry(
+          inputs: {
+            'a|lib/main.dart': 'main() {}',
+          },
+          expectation: false);
+    });
+
+    test('should validate file extension', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.not_dart': 'main() {}',
+          },
+          expectation: false);
+    });
+
+    test('should count exports as main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'export "foo.dart";',
+          },
+          expectation: true);
+    });
+
+    test('should count parts as main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'part "foo.dart";',
+          },
+          expectation: true);
+    });
+
+    test('is tolerant of syntax errors with main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'main() {} {',
+          },
+          expectation: true);
+    });
+
+    test('is tolerant of syntax errors without main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'class Foo {',
+          },
+          expectation: false);
+    });
+  });
+}
+
+class Validator extends Transformer {
+  final Function validation;
+
+  Validator(this.validation);
+
+  Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+  Future apply(Transform transform) {
+    return new Future.value(validation(transform));
+  }
+}
diff --git a/pkg/code_transformers/test/resolver_test.dart b/pkg/code_transformers/test/resolver_test.dart
index 73f50f1..886e935 100644
--- a/pkg/code_transformers/test/resolver_test.dart
+++ b/pkg/code_transformers/test/resolver_test.dart
@@ -16,17 +16,8 @@
 
 main() {
   useCompactVMConfiguration();
-
-  var sdkDir = dartSdkDirectory;
-  if (sdkDir == null) {
-    // If we cannot find the SDK dir, then assume this is being run from Dart's
-    // source directory and this script is the main script.
-    sdkDir = path.join(
-        path.dirname(path.fromUri(Platform.script)), '..', '..', '..', 'sdk');
-  }
-
   var entryPoint = new AssetId('a', 'web/main.dart');
-  var resolvers = new Resolvers(sdkDir);
+  var resolvers = new Resolvers(testingDartSdkDirectory);
 
   Future validateResolver({Map<String, String> inputs, void validator(Resolver),
       List<String> messages: const[]}) {
@@ -47,7 +38,7 @@
             var source = resolver.sources[entryPoint];
             expect(source.modificationStamp, 1);
 
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib, isNotNull);
             expect(lib.entryPoint, isNull);
           });
@@ -62,7 +53,7 @@
             var source = resolver.sources[entryPoint];
             expect(source.modificationStamp, 2);
 
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib, isNotNull);
             expect(lib.entryPoint, isNotNull);
           });
@@ -81,7 +72,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
             expect(libA.getType('Foo'), isNull);
@@ -102,7 +93,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
             expect(libA.getType('Foo'), isNotNull);
@@ -122,7 +113,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
             expect(libB.getType('Foo'), isNull);
@@ -143,7 +134,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
             expect(libB.getType('Bar'), isNotNull);
@@ -161,10 +152,9 @@
           },
           messages: [
             'error: Unable to find asset for "package:b/b.dart"',
-            'error: Unable to find asset for "package:b/b.dart"',
           ],
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 1);
           });
     });
@@ -180,13 +170,13 @@
           },
           messages: [
             // First from the AST walker
-            'error: absolute paths not allowed: "/b.dart" (main.dart 0 14)',
+            'error: absolute paths not allowed: "/b.dart" (web/main.dart 0 14)',
             // Then two from the resolver.
             'error: absolute paths not allowed: "/b.dart"',
             'error: absolute paths not allowed: "/b.dart"',
           ],
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 1);
           });
     });
@@ -329,7 +319,7 @@
                 library foo;'''
           },
           validator: (resolver) {
-            expect(resolver.entryLibrary.name, 'foo');
+            expect(resolver.getLibrary(entryPoint).name, 'foo');
           }),
         validateResolver(
           inputs: {
@@ -337,7 +327,7 @@
                 library bar;'''
           },
           validator: (resolver) {
-            expect(resolver.entryLibrary.name, 'bar');
+            expect(resolver.getLibrary(entryPoint).name, 'bar');
           }),
       ]);
     });
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 3b5784c..da817fe 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -22,8 +22,12 @@
 import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 
-import 'dart2yaml.dart';
+import 'src/dart2yaml.dart';
 import 'src/io.dart';
+import 'src/mdn.dart';
+import 'src/models.dart';
+import 'src/utils.dart';
+
 import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
 import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart'
@@ -44,7 +48,7 @@
     '_js_helper.Returns'];
 
 /// Support for [:foo:]-style code comments to the markdown parser.
-List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
+final List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
   [new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
 
 /// If we can't find the SDK introduction text, which will happen if running
@@ -218,29 +222,6 @@
   }
 }
 
-/// Docgen representation of an item to be documented, that wraps around a
-/// dart2js mirror.
-abstract class MirrorBased {
-  /// The original dart2js mirror around which this object wraps.
-  DeclarationMirror get mirror;
-
-  /// Returns a list of meta annotations assocated with a mirror.
-  static List<Annotation> _createAnnotations(DeclarationMirror mirror,
-      Library owningLibrary) {
-    var annotationMirrors = mirror.metadata.where((e) =>
-        e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
-    var annotations = [];
-    annotationMirrors.forEach((annotation) {
-      var docgenAnnotation = new Annotation(annotation, owningLibrary);
-      if (!_SKIPPED_ANNOTATIONS.contains(
-          dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
-        annotations.add(docgenAnnotation);
-      }
-    });
-    return annotations;
-  }
-}
-
 /// Top level documentation traversal and generation object.
 ///
 /// Yes, everything in this class is used statically so this technically doesn't
@@ -377,7 +358,7 @@
     libs.forEach((lib) {
       // Files belonging to the SDK have a uri that begins with 'dart:'.
       if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
-        var library = generateLibrary(lib);
+        generateLibrary(lib);
       }
     });
 
@@ -398,7 +379,7 @@
 
     // Outputs a JSON file with all libraries and their preview comments.
     // This will help the viewer know what libraries are available to read in.
-    var libraryMap;
+    Map<String, dynamic> libraryMap;
 
     if (append) {
       var docsDir = listDir(_outputDirectory);
@@ -430,7 +411,7 @@
 
   /// Output all of the libraries and classes into json or yaml files for
   /// consumption by a viewer.
-  static void _writeOutputFiles(libraryMap,
+  static void _writeOutputFiles(Map<String, dynamic> libraryMap,
       Iterable<Indexable> filteredEntities, bool outputToYaml, bool append,
       String startPage) {
     if (startPage != null) libraryMap['start-page'] = startPage;
@@ -577,8 +558,9 @@
     for (var arg in args) {
       if (FileSystemEntity.typeSync(arg) == FileSystemEntityType.FILE) {
         if (arg.endsWith('.dart')) {
-          libraries.add(new Uri.file(path.absolute(arg)));
-          logger.info('Added to libraries: ${libraries.last}');
+          var lib = new Uri.file(path.absolute(arg));
+          libraries.add(lib);
+          logger.info('Added to libraries: $lib');
         }
       } else {
         libraries.addAll(_findFilesToDocumentInPackage(arg));
@@ -594,26 +576,49 @@
     // To avoid anaylzing package files twice, only files with paths not
     // containing '/packages' will be added. The only exception is if the file
     // to analyze already has a '/package' in its path.
-    var files = listDir(packageName, recursive: true).where(
-        (f) => f.endsWith('.dart') && (!f.contains('${path.separator}packages')
-            || packageName.contains('${path.separator}packages'))).toList();
+    var files = listDir(packageName, recursive: true, listDir: _packageDirList)
+        .where((f) => f.endsWith('.dart')
+            &&  (!f.contains('${path.separator}packages')
+                || packageName.contains('${path.separator}packages'))).toList();
 
-    files.forEach((String f) {
+    files.forEach((String lib) {
       // Only include libraries at the top level of "lib"
-      if (path.basename(path.dirname(f)) == 'lib') {
+      if (path.basename(path.dirname(lib)) == 'lib') {
         // Only add the file if it does not contain 'part of'
         // TODO(janicejl): Remove when Issue(12406) is resolved.
-        var contents = new File(f).readAsStringSync();
+        var contents = new File(lib).readAsStringSync();
         if (!(contents.contains(new RegExp('\npart of ')) ||
             contents.startsWith(new RegExp('part of ')))) {
-          libraries.add(new Uri.file(path.normalize(path.absolute(f))));
-          logger.info('Added to libraries: $f');
+          libraries.add(new Uri.file(path.normalize(path.absolute(lib))));
+          logger.info('Added to libraries: $lib');
         }
       }
     });
     return libraries;
   }
 
+  /// If [dir] contains both a `lib` directory and a `pubspec.yaml` file treat
+  /// it like a package and only return the `lib` dir.
+  ///
+  /// This ensures that packages don't have non-`lib` content documented.
+  static List<FileSystemEntity> _packageDirList(Directory dir) {
+    var entities = dir.listSync();
+
+    var pubspec = entities
+        .firstWhere((e) => e is File &&
+        path.basename(e.path) == 'pubspec.yaml', orElse: () => null);
+
+    var libDir = entities
+        .firstWhere((e) => e is Directory &&
+        path.basename(e.path) == 'lib', orElse: () => null);
+
+    if (pubspec != null && libDir != null) {
+      return [libDir];
+    } else {
+      return entities;
+    }
+  }
+
   /// All of the directories for our dependent packages
   /// If this is not a package, return an empty list.
   static List<String> _allDependentPackageDirs(String packageDirectory) {
@@ -648,11 +653,10 @@
   }
 
   /// Currently left public for testing purposes. :-/
-  static Library generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
+  static void generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
     var result = new Library(library);
-    result._findPackage(library);
+    result._updateLibraryPackage(library);
     logger.fine('Generated library for ${result.name}');
-    return result;
   }
 }
 
@@ -862,19 +866,15 @@
   /// when running dart by default.
   static Iterable<LibraryMirror> _sdkLibraries;
 
+  Library get _owningLibrary => owner._owningLibrary;
+
   String get qualifiedName => fileName;
-  bool isPrivate;
-  DeclarationMirror mirror;
+  final DeclarationMirror mirror;
+  final bool isPrivate;
   /// The comment text pre-resolution. We keep this around because inherited
   /// methods need to resolve links differently from the superclass.
   String _unresolvedComment = '';
 
-  // TODO(janicejl): Make MDN content generic or pluggable. Maybe move
-  // MDN-specific code to its own library that is imported into the default
-  // impl?
-  /// Map of all the comments for dom elements from MDN.
-  static Map _mdn;
-
   /// Index of all the dart2js mirrors examined to corresponding MirrorBased
   /// docgen objects.
   ///
@@ -884,8 +884,9 @@
   static Map<String, Map<String, Set<Indexable>>> _mirrorToDocgen =
       new Map<String, Map<String, Set<Indexable>>>();
 
-  Indexable(this.mirror) {
-    this.isPrivate = _isHidden(mirror);
+  Indexable(DeclarationMirror mirror)
+      : this.mirror = mirror,
+        this.isPrivate = isHidden(mirror) {
 
     var map = _mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)];
     if (map == null) map = new Map<String, Set<Indexable>>();
@@ -897,12 +898,6 @@
     _mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)] = map;
   }
 
-  /** Walk up the owner chain to find the owning library. */
-  Library _getOwningLibrary(Indexable indexable) {
-    if (indexable is Library) return indexable;
-    return _getOwningLibrary(indexable.owner);
-  }
-
   static _initializeTopLevelLibraries(MirrorSystem mirrorSystem) {
     _sdkLibraries = mirrorSystem.libraries.values.where(
         (each) => each.uri.scheme == 'dart');
@@ -930,12 +925,6 @@
   String findElementInScope(String name) =>
       _findElementInScope(name, packagePrefix);
 
-  /// For a given name, determine if we need to resolve it as a qualified name
-  /// or a simple name in the source mirors.
-  static determineLookupFunc(name) => name.contains('.') ?
-      dart2js_util.lookupQualifiedInScope :
-        (mirror, name) => mirror.lookupInScope(name);
-
   /// The reference to this element based on where it is printed as a
   /// documentation file and also the unique URL to refer to this item.
   ///
@@ -986,33 +975,6 @@
   /// Generates MDN comments from database.json.
   String _mdnComment();
 
-  /// Generates the MDN Comment for variables and method DOM elements.
-  String _mdnMemberComment(String type, String member) {
-    var mdnType = _mdn[type];
-    if (mdnType == null) return '';
-    var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
-        orElse: () => null);
-    if (mdnMember == null) return '';
-    if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
-    if (mdnMember['url'] == null) return '';
-    return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
-  }
-
-  /// Generates the MDN Comment for class DOM elements.
-  String _mdnTypeComment(String type) {
-    var mdnType = _mdn[type];
-    if (mdnType == null) return '';
-    if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
-    if (mdnType['srcUrl'] == null) return '';
-    return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
-  }
-
-  /// Encloses the given content in an MDN div and the original source link.
-  String _htmlifyMdn(String content, String url) {
-    return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
-        '<a href="' + url.trim() + '">from Mdn</a></p></div>';
-  }
-
   /// The type of this member to be used in index.txt.
   String get typeName => '';
 
@@ -1081,7 +1043,7 @@
     // TODO(janicejl): When map to map feature is created, replace the below
     // with a filter. Issue(#9590).
     mirrors.forEach((VariableMirror mirror) {
-      if (_Generator._includePrivate || !_isHidden(mirror)) {
+      if (_Generator._includePrivate || !isHidden(mirror)) {
         var mirrorName = dart2js_util.nameOf(mirror);
         data[mirrorName] = new Variable(mirrorName, mirror, owner);
       }
@@ -1110,7 +1072,7 @@
     var data = {};
     mirrorList.forEach((ParameterMirror mirror) {
       data[dart2js_util.nameOf(mirror)] =
-          new Parameter(mirror, _getOwningLibrary(owner));
+          new Parameter(mirror, owner._owningLibrary);
     });
     return data;
   }
@@ -1128,37 +1090,7 @@
   /// Return a map representation of this type.
   Map toMap();
 
-  /// A declaration is private if itself is private, or the owner is private.
-  // Issue(12202) - A declaration is public even if it's owner is private.
-  bool _isHidden(DeclarationMirror mirror) {
-    if (mirror is LibraryMirror) {
-      return _isLibraryPrivate(mirror);
-    } else if (mirror.owner is LibraryMirror) {
-      return (mirror.isPrivate || _isLibraryPrivate(mirror.owner)
-          || mirror.isNameSynthetic);
-    } else {
-      return (mirror.isPrivate || _isHidden(mirror.owner)
-          || owner.mirror.isNameSynthetic);
-    }
-  }
 
-  /// Returns true if a library name starts with an underscore, and false
-  /// otherwise.
-  ///
-  /// An example that starts with _ is _js_helper.
-  /// An example that contains ._ is dart._collection.dev
-  bool _isLibraryPrivate(LibraryMirror mirror) {
-    // This method is needed because LibraryMirror.isPrivate returns `false` all
-    // the time.
-    var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
-    if (sdkLibrary != null) {
-      return !sdkLibrary.documented;
-    } else if (dart2js_util.nameOf(mirror).startsWith('_') ||
-        dart2js_util.nameOf(mirror).contains('._')) {
-      return true;
-    }
-    return false;
-  }
 
   ////// Top level resolution functions
   /// Converts all [foo] references in comments to <a>libraryName.foo</a>.
@@ -1182,11 +1114,11 @@
   /// version of resolvedBar.
   static markdown.Node _fixComplexReference(String name) {
     // Parse into multiple elements we can try to resolve.
-    var tokens = _tokenizeComplexReference(name);
+    var tokens = tokenizeComplexReference(name);
 
     // Produce an html representation of our elements. Group unresolved and
     // plain text are grouped into "link" elements so they display as code.
-    final textElements = [' ', ',', '>', _LESS_THAN];
+    final textElements = [' ', ',', '>', LESS_THAN];
     var accumulatedHtml = '';
 
     for (var token in tokens) {
@@ -1206,43 +1138,6 @@
     return new markdown.Text(accumulatedHtml);
   }
 
-
-  // HTML escaped version of '<' character.
-  static final _LESS_THAN = '&lt;';
-
-  /// Chunk the provided name into individual parts to be resolved. We take a
-  /// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
-  /// and ">". All other characters are grouped into the name to be resolved.
-  /// As a result, these characters will all be treated as part of the item to
-  /// be resolved (aka the * is interpreted literally as a *, not as an
-  /// indicator for bold <em>.
-  static List<String> _tokenizeComplexReference(String name) {
-    var tokens = [];
-    var append = false;
-    var index = 0;
-    while(index < name.length) {
-      if (name.indexOf(_LESS_THAN, index) == index) {
-        tokens.add(_LESS_THAN);
-        append = false;
-        index += _LESS_THAN.length;
-      } else if (name[index] == ' ' || name[index] == ',' ||
-          name[index] == '>') {
-        tokens.add(name[index]);
-        append = false;
-        index++;
-      } else {
-        if (append) {
-          tokens[tokens.length - 1] = tokens.last + name[index];
-        } else {
-          tokens.add(name[index]);
-          append = true;
-        }
-        index++;
-      }
-    }
-    return tokens;
-  }
-
   static String _findElementInScope(String name, String packagePrefix) {
     var lookupFunc = determineLookupFunc(name);
     // Look in the dart core library scope.
@@ -1278,39 +1173,18 @@
   /// Expand the method map [mapToExpand] into a more detailed map that
   /// separates out setters, getters, constructors, operators, and methods.
   Map _expandMethodMap(Map<String, Method> mapToExpand) => {
-    'setters': recurseMap(_filterMap(mapToExpand,
+    'setters': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isSetter)),
-    'getters': recurseMap(_filterMap(mapToExpand,
+    'getters': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isGetter)),
-    'constructors': recurseMap(_filterMap(mapToExpand,
+    'constructors': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isConstructor)),
-    'operators': recurseMap(_filterMap(mapToExpand,
+    'operators': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isOperator)),
-    'methods': recurseMap(_filterMap(mapToExpand,
+    'methods': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isRegularMethod && !val.mirror.isOperator))
   };
 
-  /// Transforms the map by calling toMap on each value in it.
-  Map recurseMap(Map inputMap) {
-    var outputMap = {};
-    inputMap.forEach((key, value) {
-      if (value is Map) {
-        outputMap[key] = recurseMap(value);
-      } else {
-        outputMap[key] = value.toMap();
-      }
-    });
-    return outputMap;
-  }
-
-  Map _filterMap(Map map, Function test) {
-    var exported = new Map();
-    map.forEach((key, value) {
-      if (test(key, value)) exported[key] = value;
-    });
-    return exported;
-  }
-
   /// Accessor to determine if this item and all of its owners are visible.
   bool get _isVisible => _Generator._isFullChainVisible(this);
 
@@ -1365,6 +1239,9 @@
 
 /// A class containing contents of a Dart library.
 class Library extends Indexable {
+  final Map<String, Class> classes = {};
+  final Map<String, Typedef> typedefs = {};
+  final Map<String, Class> errors = {};
 
   /// Top-level variables in the library.
   Map<String, Variable> variables;
@@ -1372,14 +1249,12 @@
   /// Top-level functions in the library.
   Map<String, Method> functions;
 
-  Map<String, Class> classes = {};
-  Map<String, Typedef> typedefs = {};
-  Map<String, Class> errors = {};
-
   String packageName = '';
   bool _hasBeenCheckedForPackage = false;
   String packageIntro;
 
+  Library get _owningLibrary => this;
+
   /// Returns the [Library] for the given [mirror] if it has already been
   /// created, else creates it.
   factory Library(LibraryMirror mirror) {
@@ -1394,10 +1269,7 @@
     var exported = _calcExportedItems(libraryMirror);
     var exportedClasses = _addAll(exported['classes'],
         dart2js_util.typesOf(libraryMirror.declarations));
-    _findPackage(mirror);
-    classes = {};
-    typedefs = {};
-    errors = {};
+    _updateLibraryPackage(mirror);
     exportedClasses.forEach((String mirrorName, TypeMirror mirror) {
         if (mirror is TypedefMirror) {
           // This is actually a Dart2jsTypedefMirror, and it does define value,
@@ -1428,7 +1300,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var libraryScope = lookupFunc(mirror, name);
     if (libraryScope != null) {
       var result = Indexable.getDocgenObject(libraryScope, this);
@@ -1441,7 +1313,7 @@
   String _mdnComment() => '';
 
   /// Helper that maps [mirrors] to their simple name in map.
-  Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
+  static Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
     for (var mirror in mirrors) {
       map[dart2js_util.nameOf(mirror)] = mirror;
     }
@@ -1452,17 +1324,16 @@
   /// believe it came from (because of its file URI).
   ///
   /// If no package could be determined, we return an empty string.
-  String _findPackage(LibraryMirror mirror) {
-    if (mirror == null) return '';
-    if (_hasBeenCheckedForPackage) return packageName;
+  void _updateLibraryPackage(LibraryMirror mirror) {
+    if (mirror == null) return;
+    if (_hasBeenCheckedForPackage) return;
     _hasBeenCheckedForPackage = true;
-    if (mirror.uri.scheme != 'file') return '';
+    if (mirror.uri.scheme != 'file') return;
     packageName = _packageName(mirror);
     // Associate the package readme with all the libraries. This is a bit
     // wasteful, but easier than trying to figure out which partial match
     // is best.
     packageIntro = _packageIntro(_getPackageDirectory(mirror));
-    return packageName;
   }
 
   String _packageIntro(packageDir) {
@@ -1569,7 +1440,7 @@
 
     // Determine the classes, variables and methods that are exported for a
     // specific dependency.
-    _populateExports(LibraryDependencyMirror export, bool showExport) {
+    void _populateExports(LibraryDependencyMirror export, bool showExport) {
       if (!showExport) {
         // Add all items, and then remove the hidden ones.
         // Ex: "export foo hide bar"
@@ -1667,29 +1538,13 @@
 
   /// Generates MDN comments from database.json.
   String _mdnComment() {
-    //Check if MDN is loaded.
-    if (Indexable._mdn == null) {
-      // Reading in MDN related json file.
-      var root = _Generator._rootDirectory;
-      var mdnPath = path.join(root, 'utils/apidoc/mdn/database.json');
-      var mdnFile = new File(mdnPath);
-      if (mdnFile.existsSync()) {
-        Indexable._mdn = JSON.decode(mdnFile.readAsStringSync());
-      } else {
-        _Generator.logger.warning("Cannot find MDN docs expected at $mdnPath");
-        Indexable._mdn = {};
-      }
-    }
     var domAnnotation = this.annotations.firstWhere(
         (e) => e.mirror.qualifiedName == #metadata.DomName,
         orElse: () => null);
     if (domAnnotation == null) return '';
     var domName = domAnnotation.parameters.single;
-    var parts = domName.split('.');
-    if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
-    if (parts.length == 1) return _mdnTypeComment(parts[0]);
 
-    throw new StateError('More than two items is not supported: $parts');
+    return mdnComment(_Generator._rootDirectory, _Generator.logger, domName);
   }
 
   String get packagePrefix => owner.packagePrefix;
@@ -1768,7 +1623,7 @@
         dart2js_util.variablesOf(classMirror.declarations), this);
     methods = _createMethods(classMirror.declarations.values.where(
         (mirror) => mirror is MethodMirror), this);
-    annotations = MirrorBased._createAnnotations(classMirror, _getOwningLibrary(owner));
+    annotations = _createAnnotations(classMirror, owner._owningLibrary);
     generics = _createGenerics(classMirror);
     isAbstract = classMirror.isAbstract;
     inheritedMethods = new Map<String, Method>();
@@ -1784,7 +1639,7 @@
   }
 
   String _lookupInClassAndSuperclasses(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var classScope = this;
     while (classScope != null) {
       var classFunc = lookupFunc(classScope.mirror, name);
@@ -1799,7 +1654,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var result = _lookupInClassAndSuperclasses(name);
     if (result != null) {
       return result;
@@ -1951,7 +1806,7 @@
     returnType = Indexable.getDocgenObject(mirror.referent.returnType).docName;
     generics = _createGenerics(mirror);
     parameters = _createParameters(mirror.referent.parameters, owningLibrary);
-    annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+    annotations = _createAnnotations(mirror, owningLibrary);
   }
 
   Map toMap() {
@@ -2003,8 +1858,8 @@
     isFinal = mirror.isFinal;
     isStatic = mirror.isStatic;
     isConst = mirror.isConst;
-    type = new Type(mirror.type, _getOwningLibrary(owner));
-    annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+    type = new Type(mirror.type, owner._owningLibrary);
+    annotations = _createAnnotations(mirror, owner._owningLibrary);
   }
 
   String get name => _variableName;
@@ -2032,7 +1887,7 @@
   }
 
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var result = lookupFunc(mirror, name);
     if (result != null) {
       result = Indexable.getDocgenObject(result);
@@ -2081,9 +1936,9 @@
     isStatic = mirror.isStatic;
     isAbstract = mirror.isAbstract;
     isConst = mirror.isConstConstructor;
-    returnType = new Type(mirror.returnType, _getOwningLibrary(owner));
+    returnType = new Type(mirror.returnType, owner._owningLibrary);
     parameters = _createParameters(mirror.parameters, owner);
-    annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+    annotations = _createAnnotations(mirror, owner._owningLibrary);
   }
 
   Method get originallyInheritedFrom => methodInheritedFrom == null ?
@@ -2092,7 +1947,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
 
     var memberScope = lookupFunc(this.mirror, name);
     if (memberScope != null) {
@@ -2212,7 +2067,7 @@
         hasDefaultValue = mirror.hasDefaultValue,
         defaultValue = '${mirror.defaultValue}',
         type = new Type(mirror.type, owningLibrary),
-        annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+        annotations = _createAnnotations(mirror, owningLibrary);
 
   /// Generates a map describing the [Parameter] object.
   Map toMap() => {
@@ -2226,16 +2081,6 @@
   };
 }
 
-/// A Docgen wrapper around the dart2js mirror for a generic type.
-class Generic extends MirrorBased {
-  final TypeVariableMirror mirror;
-  Generic(this.mirror);
-  Map toMap() => {
-    'name': dart2js_util.nameOf(mirror),
-    'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
-  };
-}
-
 /// Docgen wrapper around the mirror for a return type, and/or its generic
 /// type parameters.
 ///
@@ -2315,3 +2160,19 @@
     'parameters': parameters
   };
 }
+
+/// Returns a list of meta annotations assocated with a mirror.
+List<Annotation> _createAnnotations(DeclarationMirror mirror,
+    Library owningLibrary) {
+  var annotationMirrors = mirror.metadata.where((e) =>
+      e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
+  var annotations = [];
+  annotationMirrors.forEach((annotation) {
+    var docgenAnnotation = new Annotation(annotation, owningLibrary);
+    if (!_SKIPPED_ANNOTATIONS.contains(
+        dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
+      annotations.add(docgenAnnotation);
+    }
+  });
+  return annotations;
+}
diff --git a/pkg/docgen/lib/dart2yaml.dart b/pkg/docgen/lib/src/dart2yaml.dart
similarity index 98%
rename from pkg/docgen/lib/dart2yaml.dart
rename to pkg/docgen/lib/src/dart2yaml.dart
index b86cbb4..ac0a8ee 100644
--- a/pkg/docgen/lib/dart2yaml.dart
+++ b/pkg/docgen/lib/src/dart2yaml.dart
@@ -5,7 +5,7 @@
 /**
  * This library is used to convert data from a map to a YAML string.
  */
-library dart2yaml;
+library docgen.dart2yaml;
 
 /**
  * Gets a String representing the input Map in YAML format.
diff --git a/pkg/docgen/lib/src/io.dart b/pkg/docgen/lib/src/io.dart
index 9998687..65e69e8 100644
--- a/pkg/docgen/lib/src/io.dart
+++ b/pkg/docgen/lib/src/io.dart
@@ -1,151 +1,61 @@
-library io;
+// 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 is a helper library to make working with io easier.
+library docgen.io;
+
 // TODO(janicejl): listDir, canonicalize, resolveLink, and linkExists are from
 // pub/lib/src/io.dart. If the io.dart file becomes a package, should remove
 // copy of the functions.
 
-import 'dart:collection';
 import 'dart:io';
 import 'package:path/path.dart' as path;
 
-/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
-/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
-/// and directories beginning with `.` (defaults to `false`).
+/// Lists the contents of [dir].
+///
+/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
+///
+/// Excludes files and directories beginning with `.`
 ///
 /// The returned paths are guaranteed to begin with [dir].
 List<String> listDir(String dir, {bool recursive: false,
-    bool includeHidden: false}) {
-  List<String> doList(String dir, Set<String> listedDirectories) {
-    var contents = <String>[];
+  List<FileSystemEntity> listDir(Directory dir)}) {
+  if (listDir == null) listDir = (Directory dir) => dir.listSync();
 
-    // Avoid recursive symlinks.
-    var resolvedPath = canonicalize(dir);
-    if (listedDirectories.contains(resolvedPath)) return [];
-
-    listedDirectories = new Set<String>.from(listedDirectories);
-    listedDirectories.add(resolvedPath);
-
-    var children = <String>[];
-    for (var entity in new Directory(dir).listSync()) {
-      if (!includeHidden && path.basename(entity.path).startsWith('.')) {
-        continue;
-      }
-
-      contents.add(entity.path);
-      if (entity is Directory) {
-        // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
-        // Note that once we remove the manual recursion, we'll need to
-        // explicitly filter out files in hidden directories.
-        if (recursive) {
-          children.addAll(doList(entity.path, listedDirectories));
-        }
-      }
-    }
-
-    contents.addAll(children);
-    return contents;
-  }
-
-  return doList(dir, new Set<String>());
+  return _doList(dir, new Set<String>(), recursive, listDir);
 }
 
-/// Returns the canonical path for [pathString]. This is the normalized,
-/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
-/// recursive symlinks will not be fully resolved.
-///
-/// This doesn't require [pathString] to point to a path that exists on the
-/// filesystem; nonexistent or unreadable path entries are treated as normal
-/// directories.
-String canonicalize(String pathString) {
-  var seen = new Set<String>();
-  var components = new Queue<String>.from(
-      path.split(path.normalize(path.absolute(pathString))));
+List<String> _doList(String dir, Set<String> listedDirectories, bool recurse,
+    List<FileSystemEntity> listDir(Directory dir)) {
+  var contents = <String>[];
 
-  // The canonical path, built incrementally as we iterate through [components].
-  var newPath = components.removeFirst();
+  // Avoid recursive symlinks.
+  var resolvedPath = new Directory(dir).resolveSymbolicLinksSync();
+  if (listedDirectories.contains(resolvedPath)) return [];
 
-  // Move through the components of the path, resolving each one's symlinks as
-  // necessary. A resolved component may also add new components that need to be
-  // resolved in turn.
-  while (!components.isEmpty) {
-    seen.add(path.join(newPath, path.joinAll(components)));
-    var resolvedPath = resolveLink(
-        path.join(newPath, components.removeFirst()));
-    var relative = path.relative(resolvedPath, from: newPath);
+  listedDirectories = new Set<String>.from(listedDirectories);
+  listedDirectories.add(resolvedPath);
 
-    // If the resolved path of the component relative to `newPath` is just ".",
-    // that means component was a symlink pointing to its parent directory. We
-    // can safely ignore such components.
-    if (relative == '.') continue;
-
-    var relativeComponents = new Queue<String>.from(path.split(relative));
-
-    // If the resolved path is absolute relative to `newPath`, that means it's
-    // on a different drive. We need to canonicalize the entire target of that
-    // symlink again.
-    if (path.isAbsolute(relative)) {
-      // If we've already tried to canonicalize the new path, we've encountered
-      // a symlink loop. Avoid going infinite by treating the recursive symlink
-      // as the canonical path.
-      if (seen.contains(relative)) {
-        newPath = relative;
-      } else {
-        newPath = relativeComponents.removeFirst();
-        relativeComponents.addAll(components);
-        components = relativeComponents;
-      }
+  var children = <String>[];
+  for (var entity in listDir(new Directory(dir))) {
+    // Skip hidden files and directories
+    if (path.basename(entity.path).startsWith('.')) {
       continue;
     }
 
-    // Pop directories off `newPath` if the component links upwards in the
-    // directory hierarchy.
-    while (relativeComponents.first == '..') {
-      newPath = path.dirname(newPath);
-      relativeComponents.removeFirst();
+    contents.add(entity.path);
+    if (entity is Directory) {
+      // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
+      // Note that once we remove the manual recursion, we'll need to
+      // explicitly filter out files in hidden directories.
+      if (recurse) {
+        children.addAll(_doList(entity.path, listedDirectories, recurse,
+            listDir));
+      }
     }
-
-    // If there's only one component left, [resolveLink] guarantees that it's
-    // not a link (or is a broken link). We can just add it to `newPath` and
-    // continue resolving the remaining components.
-    if (relativeComponents.length == 1) {
-      newPath = path.join(newPath, relativeComponents.single);
-      continue;
-    }
-
-    // If we've already tried to canonicalize the new path, we've encountered a
-    // symlink loop. Avoid going infinite by treating the recursive symlink as
-    // the canonical path.
-    var newSubPath = path.join(newPath, path.joinAll(relativeComponents));
-    if (seen.contains(newSubPath)) {
-      newPath = newSubPath;
-      continue;
-    }
-
-    // If there are multiple new components to resolve, add them to the
-    // beginning of the queue.
-    relativeComponents.addAll(components);
-    components = relativeComponents;
   }
-  return newPath;
-}
 
-/// Returns the transitive target of [link] (if A links to B which links to C,
-/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
-/// which links back to A), this returns the path to the first repeated link (so
-/// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
-/// return `"B"`).
-///
-/// This accepts paths to non-links or broken links, and returns them as-is.
-String resolveLink(String link) {
-  var seen = new Set<String>();
-  while (linkExists(link) && !seen.contains(link)) {
-    seen.add(link);
-    link = path.normalize(path.join(
-        path.dirname(link), new Link(link).targetSync()));
-  }
-  return link;
+  contents.addAll(children);
+  return contents;
 }
-
-/// Returns whether [link] exists on the file system. This will return `true`
-/// for any symlink, regardless of what it points at or whether it's broken.
-bool linkExists(String link) => new Link(link).existsSync();
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/mdn.dart b/pkg/docgen/lib/src/mdn.dart
new file mode 100644
index 0000000..073dbdd
--- /dev/null
+++ b/pkg/docgen/lib/src/mdn.dart
@@ -0,0 +1,65 @@
+// 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 docgen.mdn;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+// TODO(janicejl): Make MDN content generic or pluggable.
+
+/// Map of all the comments for dom elements from MDN.
+Map<String, dynamic> _mdn;
+
+/// Generates MDN comments from database.json.
+String mdnComment(String root, Logger logger, String domName) {
+   //Check if MDN is loaded.
+ if (_mdn == null) {
+   // Reading in MDN related json file.
+   var mdnPath = p.join(root, 'utils/apidoc/mdn/database.json');
+   var mdnFile = new File(mdnPath);
+   if (mdnFile.existsSync()) {
+     _mdn = JSON.decode(mdnFile.readAsStringSync());
+   } else {
+     logger.warning("Cannot find MDN docs expected at $mdnPath");
+     _mdn = {};
+   }
+ }
+
+ var parts = domName.split('.');
+ if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
+ if (parts.length == 1) return _mdnTypeComment(parts[0]);
+
+ throw new StateError('More than two items is not supported: $parts');
+}
+
+/// Generates the MDN Comment for variables and method DOM elements.
+String _mdnMemberComment(String type, String member) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
+      orElse: () => null);
+  if (mdnMember == null) return '';
+  if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
+  if (mdnMember['url'] == null) return '';
+  return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
+}
+
+/// Generates the MDN Comment for class DOM elements.
+String _mdnTypeComment(String type) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
+  if (mdnType['srcUrl'] == null) return '';
+  return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
+}
+
+/// Encloses the given content in an MDN div and the original source link.
+String _htmlifyMdn(String content, String url) {
+  return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
+      '<a href="' + url.trim() + '">from Mdn</a></p></div>';
+}
diff --git a/pkg/docgen/lib/src/models.dart b/pkg/docgen/lib/src/models.dart
new file mode 100644
index 0000000..32f4a43
--- /dev/null
+++ b/pkg/docgen/lib/src/models.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 docgen.models;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+    as dart2js_util;
+
+/// Docgen representation of an item to be documented, that wraps around a
+/// dart2js mirror.
+abstract class MirrorBased {
+  /// The original dart2js mirror around which this object wraps.
+  DeclarationMirror get mirror;
+}
+
+/// A Docgen wrapper around the dart2js mirror for a generic type.
+class Generic extends MirrorBased {
+  final TypeVariableMirror mirror;
+
+  Generic(this.mirror);
+
+  Map toMap() => {
+    'name': dart2js_util.nameOf(mirror),
+    'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
+  };
+}
diff --git a/pkg/docgen/lib/src/utils.dart b/pkg/docgen/lib/src/utils.dart
new file mode 100644
index 0000000..8915af4
--- /dev/null
+++ b/pkg/docgen/lib/src/utils.dart
@@ -0,0 +1,107 @@
+// 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 docgen.utils;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+    as dart2js_util;
+import '../../../../sdk/lib/_internal/libraries.dart';
+
+// HTML escaped version of '<' character.
+const LESS_THAN = '&lt;';
+
+/// A declaration is private if itself is private, or the owner is private.
+// Issue(12202) - A declaration is public even if it's owner is private.
+bool isHidden(DeclarationMirror mirror) {
+  if (mirror is LibraryMirror) {
+    return _isLibraryPrivate(mirror);
+  } else if (mirror.owner is LibraryMirror) {
+    return (mirror.isPrivate || _isLibraryPrivate(mirror.owner) ||
+        mirror.isNameSynthetic);
+  } else {
+    return (mirror.isPrivate || isHidden(mirror.owner) ||
+        mirror.isNameSynthetic);
+  }
+}
+
+/// Returns true if a library name starts with an underscore, and false
+/// otherwise.
+///
+/// An example that starts with _ is _js_helper.
+/// An example that contains ._ is dart._collection.dev
+bool _isLibraryPrivate(LibraryMirror mirror) {
+  // This method is needed because LibraryMirror.isPrivate returns `false` all
+  // the time.
+  var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
+  if (sdkLibrary != null) {
+    return !sdkLibrary.documented;
+  } else if (dart2js_util.nameOf(mirror).startsWith('_') || dart2js_util.nameOf(
+      mirror).contains('._')) {
+    return true;
+  }
+  return false;
+}
+
+/// Transforms the map by calling toMap on each value in it.
+Map recurseMap(Map inputMap) {
+  var outputMap = {};
+  inputMap.forEach((key, value) {
+    if (value is Map) {
+      outputMap[key] = recurseMap(value);
+    } else {
+      outputMap[key] = value.toMap();
+    }
+  });
+  return outputMap;
+}
+
+Map filterMap(Map map, Function test) {
+  var exported = new Map();
+  map.forEach((key, value) {
+    if (test(key, value)) exported[key] = value;
+  });
+  return exported;
+}
+
+/// Chunk the provided name into individual parts to be resolved. We take a
+/// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
+/// and ">". All other characters are grouped into the name to be resolved.
+/// As a result, these characters will all be treated as part of the item to
+/// be resolved (aka the * is interpreted literally as a *, not as an
+/// indicator for bold <em>.
+List<String> tokenizeComplexReference(String name) {
+  var tokens = [];
+  var append = false;
+  var index = 0;
+  while (index < name.length) {
+    if (name.indexOf(LESS_THAN, index) == index) {
+      tokens.add(LESS_THAN);
+      append = false;
+      index += LESS_THAN.length;
+    } else if (name[index] == ' ' || name[index] == ',' || name[index] == '>') {
+      tokens.add(name[index]);
+      append = false;
+      index++;
+    } else {
+      if (append) {
+        tokens[tokens.length - 1] = tokens.last + name[index];
+      } else {
+        tokens.add(name[index]);
+        append = true;
+      }
+      index++;
+    }
+  }
+  return tokens;
+}
+
+typedef DeclarationMirror LookupFunction(DeclarationSourceMirror declaration,
+    String name);
+
+/// For a given name, determine if we need to resolve it as a qualified name
+/// or a simple name in the source mirors.
+LookupFunction determineLookupFunc(String name) => name.contains('.') ?
+    dart2js_util.lookupQualifiedInScope :
+      (mirror, name) => mirror.lookupInScope(name);
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index f158dab..68a3a12 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -1,4 +1,9 @@
-import 'dart:convert';
+// 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 docgen.generate_json_test;
+
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
@@ -12,94 +17,29 @@
 void main() {
 
   setUp(() {
-     var tempDir;
-     schedule(() {
-       return Directory.systemTemp
-           .createTemp('docgen_test-')
-           .then((dir) {
-         tempDir = dir;
-         d.defaultRoot = tempDir.path;
-       });
-     });
-
-     currentSchedule.onComplete.schedule(() {
-       d.defaultRoot = null;
-       return tempDir.delete(recursive: true);
-     });
-   });
+    scheduleTempDir();
+  });
 
   test('json output', () {
     schedule(() {
       var codeDir = getMultiLibraryCodePath();
       expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
     });
 
     d.dir('docs', [
-        d.matcherFile('index.json', _isJsonMap),
-        d.matcherFile('index.txt', _hasSortedLines),
-        d.matcherFile('library_list.json', _isJsonMap),
-        d.matcherFile('testLib-bar.C.json', _isJsonMap),
-        d.matcherFile('testLib-bar.json', _isJsonMap),
-        d.matcherFile('testLib.A.json', _isJsonMap),
-        d.matcherFile('testLib.B.json', _isJsonMap),
-        d.matcherFile('testLib.C.json', _isJsonMap),
-        d.matcherFile('testLib.json', _isJsonMap),
-        d.matcherFile('testLib2-foo.B.json', _isJsonMap),
-        d.matcherFile('testLib2-foo.json', _isJsonMap)
+        d.matcherFile('index.json', isJsonMap),
+        d.matcherFile('index.txt', hasSortedLines),
+        d.matcherFile('library_list.json', isJsonMap),
+        d.matcherFile('test_lib-bar.C.json', isJsonMap),
+        d.matcherFile('test_lib-bar.json', isJsonMap),
+        d.matcherFile('test_lib-foo.B.json', isJsonMap),
+        d.matcherFile('test_lib-foo.json', isJsonMap),
+        d.matcherFile('test_lib.A.json', isJsonMap),
+        d.matcherFile('test_lib.B.json', isJsonMap),
+        d.matcherFile('test_lib.C.json', isJsonMap),
+        d.matcherFile('test_lib.json', isJsonMap),
     ]).validate();
 
   });
-
-  test('typedef gen', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    schedule(() {
-      var dartCoreJson = new File(p.join(d.defaultRoot, 'docs', 'testLib-bar.json'))
-        .readAsStringSync();
-
-      var dartCore = JSON.decode(dartCoreJson) as Map<String, dynamic>;
-
-      var classes = dartCore['classes'] as Map<String, dynamic>;
-
-      expect(classes, hasLength(3));
-
-      expect(classes['class'], isList);
-      expect(classes['error'], isList);
-
-      var typeDefs = classes['typedef'] as Map<String, dynamic>;
-      var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
-
-      var expectedPreview = '<p>A trivial use of <code>A</code> to eliminate '
-          'import warnings.</p>';
-
-      expect(comparator['preview'], expectedPreview);
-
-      var expectedComment = expectedPreview +
-          '\n<p>And to test typedef preview.</p>';
-
-      expect(comparator['comment'], expectedComment);
-    });
-  });
 }
-
-final Matcher _hasSortedLines = predicate((String input) {
-  var lines = new LineSplitter().convert(input);
-
-  var sortedLines = new List.from(lines)..sort();
-
-  var orderedMatcher = orderedEquals(sortedLines);
-  return orderedMatcher.matches(lines, {});
-}, 'String has sorted lines');
-
-final Matcher _isJsonMap = predicate((input) {
-  try {
-    return JSON.decode(input) is Map;
-  } catch (e) {
-    return false;
-  }
-}, 'Output is JSON encoded Map');
diff --git a/pkg/docgen/lib/dottedLibraryName.dart b/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
similarity index 100%
rename from pkg/docgen/lib/dottedLibraryName.dart
rename to pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
diff --git a/pkg/docgen/test/multi_library_code/lib/temp3.dart b/pkg/docgen/test/multi_library_code/lib/temp3.dart
deleted file mode 100644
index fa1d74a..0000000
--- a/pkg/docgen/test/multi_library_code/lib/temp3.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-library testLib.bar;
-import 'temp.dart';
-
-/*
- * Normal comment for class C.
- */
-class C {
-}
-
-/// A trivial use of `A` to eliminate import warnings.
-///
-/// And to test typedef preview.
-typedef A AnATransformer(A input);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp.dart b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
similarity index 75%
rename from pkg/docgen/test/multi_library_code/lib/temp.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib.dart
index 694a8a7..ab0a577 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
@@ -1,8 +1,9 @@
-library testLib;
-import 'temp2.dart';
-import 'temp3.dart';
-export 'temp2.dart';
-export 'temp3.dart';
+library test_lib;
+
+import 'test_lib_foo.dart';
+import 'test_lib_bar.dart';
+export 'test_lib_foo.dart';
+export 'test_lib_bar.dart';
 
 /**
  * Doc comment for class [A].
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
new file mode 100644
index 0000000..c329a43
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
@@ -0,0 +1,19 @@
+library test_lib.bar;
+
+import 'test_lib.dart';
+
+/*
+ * Normal comment for class C.
+ */
+class C {
+}
+
+/// [input] is of type [C] returns an [A].
+A generateFoo(C input) {
+  throw 'noop';
+}
+
+/// Processes a [C] instance for testing.
+///
+/// To eliminate import warnings for [A] and to test typedefs.
+typedef A AnATransformer(C other);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
similarity index 88%
rename from pkg/docgen/test/multi_library_code/lib/temp2.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
index ad62c09..f933f7f 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp2.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
@@ -1,5 +1,6 @@
-library testLib2.foo;
-import 'temp.dart';
+library test_lib.foo;
+
+import 'test_lib.dart';
 
 /**
  * Doc comment for class [B].
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
index 7cb6fab..bf5e551 100644
--- a/pkg/docgen/test/multi_library_test.dart
+++ b/pkg/docgen/test/multi_library_test.dart
@@ -1,3 +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.
+
 library single_library_test;
 
 import 'package:path/path.dart' as p;
@@ -14,7 +18,7 @@
 
   codePath = p.join(codePath, 'lib');
 
-  return ['temp.dart', 'temp2.dart', 'temp3.dart']
+  return ['test_lib.dart', 'test_lib_bar.dart', 'test_lib_foo.dart']
       .map((name) => p.join(codePath, name))
       .map(p.toUri)
       .toList();
@@ -26,14 +30,14 @@
       var files = _writeLibFiles();
       return getMirrorSystem(files)
         .then((mirrorSystem) {
-          var testLibraryUri = files[0];
-          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
+          var test_libraryUri = files[0];
+          var library = new Library(mirrorSystem.libraries[test_libraryUri]);
 
           /// Testing fixReference
           // Testing Doc comment for class [B].
-          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
+          var libraryMirror = mirrorSystem.libraries[test_libraryUri];
           var classDocComment = library.fixReference('B').children.first.text;
-          expect(classDocComment, 'testLib.B');
+          expect(classDocComment, 'test_lib.B');
 
           // Test for linking to parameter [c]
           var importedLib = libraryMirror.libraryDependencies.firstWhere(
@@ -41,7 +45,7 @@
           var aClassMirror =
               dart2js_util.classesOf(importedLib.declarations).first;
           expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'testLib2.foo.B');
+                 'test_lib.foo.B');
           var exportedClass = Indexable.getDocgenObject(aClassMirror, library);
           expect(exportedClass is Class, isTrue);
 
@@ -50,17 +54,17 @@
           expect(method is Method, isTrue);
           var methodParameterDocComment = method.fixReference(
               'c').children.first.text;
-          expect(methodParameterDocComment, 'testLib.B.doThis.c');
+          expect(methodParameterDocComment, 'test_lib.B.doThis.c');
 
 
-          expect(method.fixReference('A').children.first.text, 'testLib.A');
+          expect(method.fixReference('A').children.first.text, 'test_lib.A');
           // Testing trying to refer to doThis function
           expect(method.fixReference('doThis').children.first.text,
-              'testLib.B.doThis');
+              'test_lib.B.doThis');
 
           // Testing trying to refer to doThis function
           expect(method.fixReference('doElse').children.first.text,
-              'testLib.B.doElse');
+              'test_lib.B.doElse');
 
 
           // Test a third library referencing another exported library in a
@@ -68,21 +72,21 @@
           importedLib = libraryMirror.libraryDependencies.firstWhere(
             (dep) => dep.isImport &&
                      dart2js_util.qualifiedNameOf(dep.targetLibrary) ==
-            'testLib.bar').targetLibrary;
+            'test_lib.bar').targetLibrary;
           aClassMirror = dart2js_util.classesOf(importedLib.declarations).first;
           expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'testLib.bar.C');
+                 'test_lib.bar.C');
           exportedClass = Indexable.getDocgenObject(aClassMirror, library);
           expect(exportedClass is Class, isTrue);
-          expect(exportedClass.docName, 'testLib.C');
+          expect(exportedClass.docName, 'test_lib.C');
 
           methodParameterDocComment = exportedClass.fixReference(
               'B').children.first.text;
-          expect(methodParameterDocComment, 'testLib.B');
+          expect(methodParameterDocComment, 'test_lib.B');
 
           methodParameterDocComment = exportedClass.fixReference(
               'testFunc').children.first.text;
-          expect(methodParameterDocComment, 'testLib.testFunc');
+          expect(methodParameterDocComment, 'test_lib.testFunc');
 
         });
     });
diff --git a/pkg/docgen/test/only_lib_content_in_pkg_test.dart b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
new file mode 100644
index 0000000..6df4a74
--- /dev/null
+++ b/pkg/docgen/test/only_lib_content_in_pkg_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.
+
+library docgen.test.only_lib_content_in_pkg;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import '../lib/docgen.dart' as dg;
+import 'util.dart';
+
+void main() {
+
+  setUp(() {
+    scheduleTempDir();
+  });
+
+  test('exclude non-lib code from package docs', () {
+    schedule(() {
+      var thisScript = Platform.script;
+      var thisPath = p.fromUri(thisScript);
+      expect(p.basename(thisPath), 'only_lib_content_in_pkg_test.dart');
+      expect(p.dirname(thisPath), endsWith('test'));
+
+
+      var codeDir = p.normalize(p.join(thisPath, '..', '..'));
+      print(codeDir);
+      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+    });
+
+    d.dir('docs', [
+        d.dir('docgen', [
+          d.matcherFile('docgen.json',  isJsonMap)
+        ]),
+        d.matcherFile('index.json', isJsonMap),
+        d.matcherFile('index.txt', hasSortedLines),
+        d.matcherFile('library_list.json', isJsonMap),
+        d.nothing('test_lib.json'),
+        d.nothing('test_lib-bar.json'),
+        d.nothing('test_lib-foo.json')
+    ]).validate();
+
+  });
+}
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
index 1d7ded5..11b226b 100644
--- a/pkg/docgen/test/single_library_test.dart
+++ b/pkg/docgen/test/single_library_test.dart
@@ -1,3 +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.
+
 library single_library_test;
 
 import 'dart:io';
diff --git a/pkg/docgen/test/typedef_test.dart b/pkg/docgen/test/typedef_test.dart
new file mode 100644
index 0000000..5defa66
--- /dev/null
+++ b/pkg/docgen/test/typedef_test.dart
@@ -0,0 +1,66 @@
+// 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 docgen.test.typedef;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import 'util.dart';
+import '../lib/docgen.dart' as dg;
+
+void main() {
+
+  setUp(() {
+    scheduleTempDir();
+  });
+
+  test('typedef gen', () {
+    schedule(() {
+      var codeDir = getMultiLibraryCodePath();
+      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
+    });
+
+    schedule(() {
+      var path = p.join(d.defaultRoot, 'docs', 'test_lib-bar.json');
+      var dartCoreJson = new File(path).readAsStringSync();
+
+      var testLibBar = JSON.decode(dartCoreJson) as Map<String, dynamic>;
+
+      //
+      // Validate function doc references
+      //
+      var generateFoo = testLibBar['functions']['methods']['generateFoo']
+          as Map<String, dynamic>;
+
+      expect(generateFoo['comment'], '<p><a>test_lib-bar.generateFoo.input</a> '
+          'is of type <a>test_lib-bar.C</a> returns an <a>test_lib.A</a>.</p>');
+
+      var classes = testLibBar['classes'] as Map<String, dynamic>;
+
+      expect(classes, hasLength(3));
+
+      expect(classes['class'], isList);
+      expect(classes['error'], isList);
+
+      var typeDefs = classes['typedef'] as Map<String, dynamic>;
+      var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
+
+      var expectedPreview = '<p>Processes a [C] instance for testing.</p>';
+
+      expect(comparator['preview'], expectedPreview);
+
+      var expectedComment = expectedPreview + '\n'
+          '<p>To eliminate import warnings for [A] and to test typedefs.</p>';
+
+      expect(comparator['comment'], expectedComment);
+    });
+  });
+}
diff --git a/pkg/docgen/test/util.dart b/pkg/docgen/test/util.dart
index fad786d..3f7f2ed 100644
--- a/pkg/docgen/test/util.dart
+++ b/pkg/docgen/test/util.dart
@@ -1,5 +1,31 @@
+// 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 docgen.test.util;
+
+import 'dart:convert';
 import 'dart:io';
 import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+void scheduleTempDir() {
+  var tempDir;
+  schedule(() {
+    return Directory.systemTemp
+        .createTemp('docgen_test-')
+        .then((dir) {
+      tempDir = dir;
+      d.defaultRoot = tempDir.path;
+    });
+  });
+
+  currentSchedule.onComplete.schedule(() {
+    d.defaultRoot = null;
+    return tempDir.delete(recursive: true);
+  });
+}
 
 String getMultiLibraryCodePath() {
   var currentScript = p.fromUri(Platform.script);
@@ -9,3 +35,20 @@
 
   return codeDir;
 }
+
+final Matcher hasSortedLines = predicate((String input) {
+  var lines = new LineSplitter().convert(input);
+
+  var sortedLines = new List.from(lines)..sort();
+
+  var orderedMatcher = orderedEquals(sortedLines);
+  return orderedMatcher.matches(lines, {});
+}, 'String has sorted lines');
+
+final Matcher isJsonMap = predicate((input) {
+  try {
+    return JSON.decode(input) is Map;
+  } catch (e) {
+    return false;
+  }
+}, 'Output is JSON encoded Map');
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
new file mode 100644
index 0000000..0a9b4ba
--- /dev/null
+++ b/pkg/http/CHANGELOG.md
@@ -0,0 +1,9 @@
+## 0.10.0
+
+* Make `BaseRequest.contentLength` and `BaseResponse.contentLength` use `null`
+  to indicate an unknown content length rather than -1.
+
+* The `contentLength` parameter to `new BaseResponse` is now named rather than
+  positional.
+
+* Make request headers case-insensitive.
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index dab055b..a52b9c2 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -27,12 +27,17 @@
   /// The URL to which the request will be sent.
   final Uri url;
 
-  /// The size of the request body, in bytes. This defaults to -1, which
-  /// indicates that the size of the request is not known in advance.
+  /// The size of the request body, in bytes.
+  ///
+  /// This defaults to `null`, which indicates that the size of the request is
+  /// not known in advance.
   int get contentLength => _contentLength;
-  int _contentLength = -1;
+  int _contentLength;
 
   set contentLength(int value) {
+    if (value != null && value < 0) {
+      throw new ArgumentError("Invalid content length $value.");
+    }
     _checkFinalized();
     _contentLength = value;
   }
@@ -110,10 +115,12 @@
     var client = new Client();
     return client.send(this).then((response) {
       var stream = onDone(response.stream, client.close);
+      var contentLength = response.contentLength < 0 ?
+          null : response.contentLength;
       return new StreamedResponse(
           new ByteStream(stream),
           response.statusCode,
-          response.contentLength,
+          contentLength: contentLength,
           request: response.request,
           headers: response.headers,
           isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/base_response.dart b/pkg/http/lib/src/base_response.dart
index df0edb4..f222596 100644
--- a/pkg/http/lib/src/base_response.dart
+++ b/pkg/http/lib/src/base_response.dart
@@ -20,8 +20,9 @@
   /// The reason phrase associated with the status code.
   final String reasonPhrase;
 
-  /// The size of the response body, in bytes. If the size of the request is not
-  /// known in advance, this is -1.
+  /// The size of the response body, in bytes.
+  ///
+  /// If the size of the request is not known in advance, this is `null`.
   final int contentLength;
 
   // TODO(nweiz): automatically parse cookies from headers
@@ -39,10 +40,16 @@
   /// Creates a new HTTP response.
   BaseResponse(
       this.statusCode,
-      this.contentLength,
-      {this.request,
+      {this.contentLength,
+       this.request,
        this.headers: const {},
        this.isRedirect: false,
        this.persistentConnection: true,
-       this.reasonPhrase});
+       this.reasonPhrase}) {
+    if (statusCode < 100) {
+      throw new ArgumentError("Invalid status code $statusCode.");
+    } else if (contentLength != null && contentLength < 0) {
+      throw new ArgumentError("Invalid content length $contentLength.");
+    }
+  }
 }
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index c12cac2..112607d 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -27,10 +27,12 @@
 
     return Chain.track(_inner.openUrl(request.method, request.url))
         .then((ioRequest) {
+      var contentLength = request.contentLength == null ?
+          -1 : request.contentLength;
       ioRequest
           ..followRedirects = request.followRedirects
           ..maxRedirects = request.maxRedirects
-          ..contentLength = request.contentLength
+          ..contentLength = contentLength
           ..persistentConnection = request.persistentConnection;
       request.headers.forEach((name, value) {
         ioRequest.headers.set(name, value);
@@ -42,10 +44,12 @@
         headers[key] = values.join(',');
       });
 
+      var contentLength = response.contentLength == -1 ?
+          null : response.contentLength;
       return new StreamedResponse(
           response,
           response.statusCode,
-          response.contentLength,
+          contentLength: contentLength,
           request: request,
           headers: headers,
           isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index 5d29545..35a710d 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -46,7 +46,7 @@
         return new StreamedResponse(
             new ByteStream.fromBytes(response.bodyBytes),
             response.statusCode,
-            response.contentLength,
+            contentLength: response.contentLength,
             request: baseRequest,
             headers: response.headers,
             isRedirect: response.isRedirect,
@@ -63,7 +63,7 @@
         return new StreamedResponse(
             response.stream,
             response.statusCode,
-            response.contentLength,
+            contentLength: response.contentLength,
             request: request,
             headers: response.headers,
             isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
index 435027d..afbb714 100644
--- a/pkg/http/lib/src/response.dart
+++ b/pkg/http/lib/src/response.dart
@@ -57,7 +57,7 @@
     : bodyBytes = toUint8List(bodyBytes),
       super(
         statusCode,
-        bodyBytes.length,
+        contentLength: bodyBytes.length,
         request: request,
         headers: headers,
         isRedirect: isRedirect,
diff --git a/pkg/http/lib/src/streamed_response.dart b/pkg/http/lib/src/streamed_response.dart
index f82c964..21c7d9a 100644
--- a/pkg/http/lib/src/streamed_response.dart
+++ b/pkg/http/lib/src/streamed_response.dart
@@ -23,15 +23,15 @@
   StreamedResponse(
       Stream<List<int>> stream,
       int statusCode,
-      int contentLength,
-      {BaseRequest request,
+      {int contentLength,
+       BaseRequest request,
        Map<String, String> headers: const {},
        bool isRedirect: false,
        bool persistentConnection: true,
        String reasonPhrase})
     : super(
         statusCode,
-        contentLength,
+        contentLength: contentLength,
         request: request,
         headers: headers,
         isRedirect: isRedirect,
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 3821bb0..75b4e54 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.9.3-dev
+version: 0.10.0-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index ac0eeee..5c1cbf0 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -40,7 +40,7 @@
           controller.close();
         });
 
-        return new http.StreamedResponse(controller.stream, 200, -1);
+        return new http.StreamedResponse(controller.stream, 200);
       });
     });
 
diff --git a/pkg/http/test/response_test.dart b/pkg/http/test/response_test.dart
index bc1f33d..52efa2c 100644
--- a/pkg/http/test/response_test.dart
+++ b/pkg/http/test/response_test.dart
@@ -52,9 +52,9 @@
     test('sets body', () {
       var controller = new StreamController(sync: true);
       var streamResponse = new http.StreamedResponse(
-          controller.stream, 200, 13);
+          controller.stream, 200, contentLength: 13);
       var future = http.Response.fromStream(streamResponse)
-        .then((response) => response.body);
+          .then((response) => response.body);
       expect(future, completion(equals("Hello, world!")));
 
       controller.add([72, 101, 108, 108, 111, 44, 32]);
@@ -64,9 +64,10 @@
 
     test('sets bodyBytes', () {
       var controller = new StreamController(sync: true);
-      var streamResponse = new http.StreamedResponse(controller.stream, 200, 5);
+      var streamResponse = new http.StreamedResponse(
+          controller.stream, 200, contentLength: 5);
       var future = http.Response.fromStream(streamResponse)
-        .then((response) => response.bodyBytes);
+          .then((response) => response.bodyBytes);
       expect(future, completion(equals([104, 101, 108, 108, 111])));
 
       controller.add([104, 101, 108, 108, 111]);
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index 56c9252..761102c 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -4,17 +4,58 @@
 
 library streamed_request_test;
 
+import 'dart:convert';
+
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
 
 void main() {
-  test('#finalize freezes contentLength', () {
-    var request = new http.StreamedRequest('POST', dummyUrl);
-    request.finalize();
+  group('contentLength', () {
+    test('defaults to null', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      expect(request.contentLength, isNull);
+    });
 
-    expect(request.contentLength, equals(-1));
-    expect(() => request.contentLength = 10, throwsStateError);
+    test('disallows negative values', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      expect(() => request.contentLength = -1, throwsArgumentError);
+    });
+
+    test('controls the Content-Length header', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.contentLength = 10;
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                containsPair('content-length', ['10'])))));
+      }).whenComplete(stopServer);
+    });
+
+    test('defaults to sending no Content-Length', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                isNot(contains('content-length'))))));
+      }).whenComplete(stopServer);
+    });
+
+    test('is frozen by finalize()', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      request.finalize();
+      expect(() => request.contentLength = 10, throwsStateError);
+    });
   });
 }
\ No newline at end of file
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index c3dad6e..61c4f52 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -9,6 +9,6 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  http: '>=0.9.2 <0.10.0'
+  http: '>=0.9.2 <0.11.0'
 dev_dependencies:
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
new file mode 100644
index 0000000..f51ca6a
--- /dev/null
+++ b/pkg/observe/CHANGELOG.md
@@ -0,0 +1,13 @@
+# changelog
+
+This file contains highlights of what changes on each version of the observe
+package.
+
+#### Pub version 0.10.0-dev
+  * package:observe no longer declares @MirrorsUsed. The package uses mirrors
+    for development time, but assumes frameworks (like polymer) and apps that
+    use it directly will either generate code that replaces the use of mirrors,
+    or add the @MirrorsUsed declaration themselves. For convinience, you can
+    import 'package:observe/mirrors_used.dart', and that will add a @MirrorsUsed
+    annotation that preserves properties and classes labeled with @reflectable
+    and properties labeled with @observable.
diff --git a/pkg/observe/lib/mirrors_used.dart b/pkg/observe/lib/mirrors_used.dart
new file mode 100644
index 0000000..b3d3f43
--- /dev/null
+++ b/pkg/observe/lib/mirrors_used.dart
@@ -0,0 +1,18 @@
+// 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.
+
+/// An empty library that declares what needs to be retained with [MirrorsUsed]
+/// if you were to use observables together with mirrors. By default this is not
+/// included because frameworks using this package also use code generation to
+/// avoid using mirrors at deploy time.
+library observe.mirrors_used;
+
+// Note: ObservableProperty is in this list only for the unusual use case of
+// invoking dart2js without running this package's transformers. The
+// transformer in `lib/transformer.dart` will replace @observable with the
+// @reflectable annotation.
+@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
+    override: 'smoke.mirrors')
+import 'dart:mirrors' show MirrorsUsed;
+import 'package:observe/observe.dart' show Reflectable, ObservableProperty;
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index 3b7c138..bce717e 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -12,6 +12,9 @@
 /// You can provide an observable object in two ways. The simplest way is to
 /// use dirty checking to discover changes automatically:
 ///
+///     import 'package:observe/observe.dart';
+///     import 'package:observe/mirrors_used.dart'; // for smaller code
+///
 ///     class Monster extends Unit with Observable {
 ///       @observable int health = 100;
 ///
@@ -40,6 +43,9 @@
 /// manually. This avoids the potentially expensive [Observable.dirtyCheck]
 /// operation, but requires more work in the object:
 ///
+///     import 'package:observe/observe.dart';
+///     import 'package:observe/mirrors_used.dart'; // for smaller code
+///
 ///     class Monster extends Unit with ChangeNotifier {
 ///       int _health = 100;
 ///       @reflectable get health => _health;
@@ -66,9 +72,24 @@
 ///       print('done!');
 ///     }
 ///
-/// *Note*: it is good practice to keep `@reflectable` annotation on
-/// getters/setters so they are accessible via reflection. This will preserve
-/// them from tree-shaking. You can also put this annotation on the class and it
+/// **Note**: by default this package uses mirrors to access getters and setters
+/// marked with `@reflectable`. Dart2js disables tree-shaking if there are any
+/// uses of mirrors, unless you declare how mirrors are used (via the
+/// [MirrorsUsed](https://api.dartlang.org/apidocs/channels/stable/#dart-mirrors.MirrorsUsed)
+/// annotation).
+///
+/// As of version 0.10.0, this package doesn't declare `@MirrorsUsed`. This is
+/// because we intend to use mirrors for development time, but assume that
+/// frameworks and apps that use this pacakge will either generate code that
+/// replaces the use of mirrors, or add the `@MirrorsUsed` declaration
+/// themselves.  For convenience, you can import
+/// `package:observe/mirrors_used.dart` as shown on the first example above.
+/// That will add a `@MirrorsUsed` annotation that preserves properties and
+/// classes labeled with `@reflectable` and properties labeled with
+/// `@observable`.
+///
+/// If you are using the `package:observe/mirrors_used.dart` import, you can
+/// also make use of `@reflectable` on your own classes and dart2js will
 /// preserve all of its members for reflection.
 ///
 /// [Tools](https://www.dartlang.org/polymer-dart/) exist to convert the first
diff --git a/pkg/observe/lib/src/observable.dart b/pkg/observe/lib/src/observable.dart
index a1c7b65..eee62f2 100644
--- a/pkg/observe/lib/src/observable.dart
+++ b/pkg/observe/lib/src/observable.dart
@@ -7,14 +7,6 @@
 import 'dart:async';
 import 'dart:collection';
 
-// TODO(sigmund): figure out how to remove this annotation entirely
-// Note: ObservableProperty is in this list only for the unusual use case of
-// dart2js without deploy tool. The deploy tool (see "transformer.dart") will
-// add the @reflectable annotation, which makes it work with Polymer's
-// @published.
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
-    override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:observe/observe.dart';
 
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index be55102..0d631a0 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -7,13 +7,9 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math' show min;
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
-    override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
 
 import 'package:logging/logging.dart' show Logger, Level;
 import 'package:observe/observe.dart';
-import 'package:observe/src/observable.dart' show objectType;
 import 'package:smoke/smoke.dart' as smoke;
 
 /// A data-bound path starting from a view-model or model object, for example
@@ -128,7 +124,7 @@
     for (var segment in path.trim().split('.')) {
       if (segment == '') continue;
       var index = int.parse(segment, radix: 10, onError: (_) => null);
-      segments.add(index != null ? index : new Symbol(segment));
+      segments.add(index != null ? index : smoke.nameToSymbol(segment));
     }
 
     // TODO(jmesserly): we could use an UnmodifiableListView here, but that adds
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index fdb276a..85feca4 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.0-pre.2
+version: 0.10.0-pre.3.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -9,13 +9,13 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.6"
-  barback: ">=0.9.0 <0.13.0"
-  logging: ">=0.9.0 <0.10.0"
-  path: ">=0.9.0 <2.0.0"
-  smoke: ">=0.1.0-pre.0 <0.2.0"
-  source_maps: ">=0.9.0 <0.10.0"
+  analyzer: 0.13.0-dev.6
+  barback: '>=0.9.0 <0.13.0'
+  logging: '>=0.9.0 <0.10.0'
+  path: '>=0.9.0 <2.0.0'
+  smoke: '>=0.1.0-pre.0 <0.2.0'
+  source_maps: '>=0.9.0 <0.10.0'
 dev_dependencies:
-  unittest: ">=0.10.0 <0.11.0"
+  unittest: '>=0.10.0 <0.11.0'
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/observe/test/observe_test.dart b/pkg/observe/test/observe_test.dart
index f973db9..802e4d1 100644
--- a/pkg/observe/test/observe_test.dart
+++ b/pkg/observe/test/observe_test.dart
@@ -43,7 +43,7 @@
       var maxNumIterations = dirty_check.MAX_DIRTY_CHECK_CYCLES;
 
       var x = new WatcherModel(0);
-      var sub = x.changes.listen(expectAsync1((_) { x.value++; },
+      var sub = x.changes.listen(expectAsync((_) { x.value++; },
           count: maxNumIterations));
       x.value = 1;
       Observable.dirtyCheck();
@@ -82,7 +82,7 @@
   });
 
   test('handle future result', () {
-    var callback = expectAsync0((){});
+    var callback = expectAsync((){});
     return new Future(callback);
   });
 
@@ -106,7 +106,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync1((records) {
+    subs.add(t.changes.listen(expectAsync((records) {
       called++;
       expectPropertyChanges(records, watch ? 1 : 2);
     })));
@@ -120,7 +120,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync1((records) {
+    subs.add(t.changes.listen(expectAsync((records) {
       called++;
       expectPropertyChanges(records, 1);
       if (called == 1) {
@@ -139,8 +139,8 @@
       expectPropertyChanges(records, watch ? 1 : 2);
     };
 
-    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
-    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
 
     t.value = 41;
     t.value = 42;
@@ -173,7 +173,7 @@
   test('cancel listening', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync1((records) {
+    sub = t.changes.listen(expectAsync((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
       t.value = 777;
@@ -185,12 +185,12 @@
   test('cancel and reobserve', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync1((records) {
+    sub = t.changes.listen(expectAsync((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
 
-      scheduleMicrotask(expectAsync0(() {
-        subs.add(t.changes.listen(expectAsync1((records) {
+      scheduleMicrotask(expectAsync(() {
+        subs.add(t.changes.listen(expectAsync((records) {
           expectPropertyChanges(records, 1);
         })));
         t.value = 777;
diff --git a/pkg/observe/test/observe_test_utils.dart b/pkg/observe/test/observe_test_utils.dart
index 02a88e2..07f4488 100644
--- a/pkg/observe/test/observe_test_utils.dart
+++ b/pkg/observe/test/observe_test_utils.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // to make tests smaller
 import 'package:unittest/unittest.dart';
 export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 0993c69..8d71680 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -201,7 +201,7 @@
   test('Path Value With Indices', () {
     var model = toObservable([]);
     var path = new PathObserver(model, '0');
-    path.open(expectAsync1((x) {
+    path.open(expectAsync((x) {
       expect(path.value, 123);
       expect(x, 123);
     }));
@@ -214,7 +214,7 @@
       var path = new PathObserver(model, 'isNotEmpty');
       expect(path.value, false);
 
-      path.open(expectAsync1((_) {
+      path.open(expectAsync((_) {
         expect(path.value, true);
       }));
       model.add(123);
@@ -225,7 +225,7 @@
       var path = new PathObserver(model, 'isEmpty');
       expect(path.value, true);
 
-      path.open(expectAsync1((_) {
+      path.open(expectAsync((_) {
         expect(path.value, false);
       }));
       model.add(123);
diff --git a/pkg/observe/test/transformer_test.dart b/pkg/observe/test/transformer_test.dart
index 1687d8a..0da84a5 100644
--- a/pkg/observe/test/transformer_test.dart
+++ b/pkg/observe/test/transformer_test.dart
@@ -164,6 +164,7 @@
 
   readInput(id) => throw new UnimplementedError();
   readInputAsString(id, {encoding}) => throw new UnimplementedError();
+  hasInput(id) => throw new UnimplementedError();
 
   static void _mockLogFn(AssetId asset, LogLevel level, String message,
                          span) {
diff --git a/pkg/path/CHANGELOG.md b/pkg/path/CHANGELOG.md
new file mode 100644
index 0000000..0d48c07
--- /dev/null
+++ b/pkg/path/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 1.1.0
+
+* `path.fromUri` now accepts strings as well as `Uri` objects.
diff --git a/pkg/path/lib/path.dart b/pkg/path/lib/path.dart
index 7ff858c..524f16d 100644
--- a/pkg/path/lib/path.dart
+++ b/pkg/path/lib/path.dart
@@ -322,23 +322,27 @@
 ///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
 String withoutExtension(String path) => _context.withoutExtension(path);
 
-/// Returns the path represented by [uri].
+/// Returns the path represented by [uri], which may be a [String] or a [Uri].
 ///
 /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
 /// style, this will just convert [uri] to a string.
 ///
 ///     // POSIX
-///     path.fromUri(Uri.parse('file:///path/to/foo'))
+///     context.fromUri('file:///path/to/foo')
 ///       // -> '/path/to/foo'
 ///
 ///     // Windows
-///     path.fromUri(Uri.parse('file:///C:/path/to/foo'))
+///     context.fromUri('file:///C:/path/to/foo')
 ///       // -> r'C:\path\to\foo'
 ///
 ///     // URL
-///     path.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+///     context.fromUri('http://dartlang.org/path/to/foo')
 ///       // -> 'http://dartlang.org/path/to/foo'
-String fromUri(Uri uri) => _context.fromUri(uri);
+///
+/// If [uri] is relative, a relative path will be returned.
+///
+///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+String fromUri(uri) => _context.fromUri(uri);
 
 /// Returns the URI that represents [path].
 ///
diff --git a/pkg/path/lib/src/context.dart b/pkg/path/lib/src/context.dart
index b897c8b..9c8e1e4 100644
--- a/pkg/path/lib/src/context.dart
+++ b/pkg/path/lib/src/context.dart
@@ -423,23 +423,30 @@
     return parsed.toString();
   }
 
-  /// Returns the path represented by [uri].
+  /// Returns the path represented by [uri], which may be a [String] or a [Uri].
   ///
   /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
   /// style, this will just convert [uri] to a string.
   ///
   ///     // POSIX
-  ///     context.fromUri(Uri.parse('file:///path/to/foo'))
+  ///     context.fromUri('file:///path/to/foo')
   ///       // -> '/path/to/foo'
   ///
   ///     // Windows
-  ///     context.fromUri(Uri.parse('file:///C:/path/to/foo'))
+  ///     context.fromUri('file:///C:/path/to/foo')
   ///       // -> r'C:\path\to\foo'
   ///
   ///     // URL
-  ///     context.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+  ///     context.fromUri('http://dartlang.org/path/to/foo')
   ///       // -> 'http://dartlang.org/path/to/foo'
-  String fromUri(Uri uri) => style.pathFromUri(uri);
+  ///
+  /// If [uri] is relative, a relative path will be returned.
+  ///
+  ///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+  String fromUri(uri) {
+    if (uri is String) uri = Uri.parse(uri);
+    return style.pathFromUri(uri);
+  }
 
   /// Returns the URI that represents [path].
   ///
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index 3b555a1..8095c88 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 1.0.0
+version: 1.1.0
 author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
diff --git a/pkg/path/test/posix_test.dart b/pkg/path/test/posix_test.dart
index 83a473e..9da97c9 100644
--- a/pkg/path/test/posix_test.dart
+++ b/pkg/path/test/posix_test.dart
@@ -474,19 +474,26 @@
     expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
-    expect(context.fromUri(Uri.parse('file:///')), '/');
-    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
-        '/path/to/foo#bar');
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_{_}_`_^_ _"_%_');
-    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
-        throwsArgumentError);
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo/')),
+          '/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///')), '/');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
+          '/path/to/foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///path/to/foo'), '/path/to/foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/path/test/url_test.dart b/pkg/path/test/url_test.dart
index e149b4f..58c7b92 100644
--- a/pkg/path/test/url_test.dart
+++ b/pkg/path/test/url_test.dart
@@ -700,20 +700,28 @@
     expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
-        'http://dartlang.org/path/to/foo');
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
-        'http://dartlang.org/path/to/foo/');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo')),
-        'file:///path/to/foo');
-    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
-        'http://dartlang.org/path/to/foo%23bar');
-    // Since the resulting "path" is also a URL, special characters should
-    // remain percent-encoded in the result.
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
+          'http://dartlang.org/path/to/foo');
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
+          'http://dartlang.org/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')),
+          'file:///path/to/foo');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(context.fromUri(
+          Uri.parse('http://dartlang.org/path/to/foo%23bar')),
+          'http://dartlang.org/path/to/foo%23bar');
+      // Since the resulting "path" is also a URL, special characters should
+      // remain percent-encoded in the result.
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('http://dartlang.org/path/to/foo'),
+          'http://dartlang.org/path/to/foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/path/test/windows_test.dart b/pkg/path/test/windows_test.dart
index e5dcac4..d194663 100644
--- a/pkg/path/test/windows_test.dart
+++ b/pkg/path/test/windows_test.dart
@@ -590,27 +590,35 @@
     expect(context.withoutExtension(r'a\b.c\'), r'a\b\');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
-        r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
-        r'\\server\share\path\to\foo');
-    expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
-    expect(context.fromUri(Uri.parse('file://server/share')),
-        r'\\server\share');
-    expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
-    expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
-        r'\\server\share\path\to\foo');
-    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
-        r'C:\path\to\foo#bar');
-    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo%23bar')),
-        r'\\server\share\path\to\foo#bar');
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_{_}_`_^_ _"_%_');
-    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
-        throwsArgumentError);
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
+          r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
+      expect(context.fromUri(Uri.parse('file://server/share')),
+          r'\\server\share');
+      expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
+      expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('///C:/path/to/foo')),
+          r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
+          r'C:\path\to\foo#bar');
+      expect(context.fromUri(
+          Uri.parse('file://server/share/path/to/foo%23bar')),
+          r'\\server\share\path\to\foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///C:/path/to/foo'), r'C:\path\to\foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 152c39b..c6a89c0 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -17,7 +17,22 @@
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 polymer/test/event_path_test: Pass, Fail # Issue 15766
-docgen/test/generate_json_test: Skip # Issue 17430
+
+[ $compiler == dart2js && $mode == debug ]
+docgen/test/generate_json_test: Skip # Way too slow
+docgen/test/multi_library_test: Skip # Way too slow
+docgen/test/single_library_test: Skip # Way too slow
+docgen/test/typedef_test: Skip # Way too slow
+
+[ $runtime == vm ]
+docgen/test/only_lib_content_in_pkg_test: Fail, Timeout # Issue 17597
+
+[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+docgen/test/only_lib_content_in_pkg_test: Skip # slow
+docgen/test/typedef_test: Skip # slow
+
+[ $runtime == vm && $arch == ia32 && $mode == debug ]
+docgen/test/generate_json_test: Skip # Issue 17602
 
 [ $compiler == dart2js ]
 collection/test/equality_test/01: Fail # Issue 1533
@@ -118,6 +133,7 @@
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
+smoke/test/codegen/end_to_end_test: Fail # Issue 17600
 
 [ $compiler == dartanalyzer ]
 # These tests are runtime negative but statically positive, so we skip
@@ -212,6 +228,8 @@
 observe/test/transformer_test: Fail, OK # Uses dart:io.
 path/test/io_test: Fail, OK # Uses dart:io.
 polymer/test/build/*: Fail, OK # Uses dart:io.
+smoke/test/codegen/recorder_test: Skip # Uses dart:io.
+smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
 third_party/angular_tests/vm_test: Skip # Uses dart:io
 third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
 watcher/test/*: Fail, OK # Uses dart:io.
@@ -305,10 +323,8 @@
 [ $runtime == safari || $runtime == ie9 || $runtime == ie10 ]
 polymer_expressions/test/globals_test: Fail # Issue 16568
 
-[ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
-docgen/test/generate_json_test: Skip  # Uses dart:io
-docgen/test/single_library_test: Skip # Uses dart:io
-docgen/test/multi_library_test: Skip # Uses dart:io
+[ $browser ]
+docgen/test/*: Skip  # Uses dart:io
 scheduled_test/test/scheduled_server_test: Skip # Uses dart:io
 
 [ $browser || $runtime == vm ]
@@ -320,8 +336,10 @@
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 docgen/test/generate_json_test: StaticWarning # Issue 16950
-docgen/test/single_library_test: StaticWarning # Issue 16950
 docgen/test/multi_library_test: StaticWarning # Issue 16950
+docgen/test/only_lib_content_in_pkg_test: StaticWarning # Issue 16950
+docgen/test/single_library_test: StaticWarning # Issue 16950
+docgen/test/typedef_test: StaticWarning # Issue 16950
 unittest/test/matchers_test: StaticWarning, OK # testing error creating abstract class
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
diff --git a/pkg/polymer/example/canonicalization2/lib/g.html b/pkg/polymer/example/canonicalization2/lib/g.html
index 1b9e8d2..3897dba 100644
--- a/pkg/polymer/example/canonicalization2/lib/g.html
+++ b/pkg/polymer/example/canonicalization2/lib/g.html
@@ -5,6 +5,6 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization2/b.html'.
  -->
-<link rel="import" href="../packages/canonicalization/b.html">
+<link rel="import" href="../packages/canonicalization2/b.html">
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
index d467d03..2612a8f 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
@@ -3,17 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests how canonicalization works when using the deployed app.
-library canonicalization.dev3_test;
+library canonicalization.dev2_test;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization2/a.dart';
+import 'packages/canonicalization2/b.dart';
+import 'package:canonicalization2/c.dart';
+import 'package:canonicalization2/d.dart' as d1;
+import 'packages/canonicalization2/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
index 4db4438..bac8aba 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization2/a.html">
+    <link rel="import" href="packages/canonicalization2/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
index 3d6f1fe..f3df1c3 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization2/a.dart';
+import 'packages/canonicalization2/b.dart';
+import 'package:canonicalization2/c.dart';
+import 'package:canonicalization2/d.dart' as d1;
+import 'packages/canonicalization2/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
index a5c2d28..83313ee 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization2/a.html">
+    <link rel="import" href="packages/canonicalization2/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/example/canonicalization3/lib/g.html
index af83397..ab73db5 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/example/canonicalization3/lib/g.html
@@ -5,6 +5,6 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization3/b.html'.
  -->
-<link rel="import" href="packages/canonicalization/b.html">
+<link rel="import" href="packages/canonicalization3/b.html">
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
index d467d03..574c472 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization3/a.dart';
+import 'packages/canonicalization3/b.dart';
+import 'package:canonicalization3/c.dart';
+import 'package:canonicalization3/d.dart' as d1;
+import 'packages/canonicalization3/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
index 4db4438..21448a6 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization3/a.html">
+    <link rel="import" href="packages/canonicalization3/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
index 3d6f1fe..afb2ab7 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization3/a.dart';
+import 'packages/canonicalization3/b.dart';
+import 'package:canonicalization3/c.dart';
+import 'package:canonicalization3/d.dart' as d1;
+import 'packages/canonicalization3/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
index a5c2d28..72f7574 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization3/a.html">
+    <link rel="import" href="packages/canonicalization3/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.dart b/pkg/polymer/example/component/news/test/news_index_test.dart
index 4825b83..6e0c660 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.dart
+++ b/pkg/polymer/example/component/news/test/news_index_test.dart
@@ -16,13 +16,13 @@
       .map((n) => n.query('a').href.split('/').last).toList();
 
   test('initial state', () {
-    final listComp = query('ul');
-    final items = listComp.queryAll('li');
+    final listComp = querySelector('ul');
+    final items = listComp.querySelectorAll('li');
     expect(items.length, 6);
     expect(extractLinks(items), ['1', '2', '3', '4', '4', '5']);
     expect(listComp is Polymer, true, reason: 'x-news should be created');
 
-    final contents = listComp.shadowRoot.queryAll('content');
+    final contents = listComp.shadowRoot.querySelectorAll('content');
     expect(contents.length, 2, reason: 'news has 2 content tags');
     expect(extractLinks(contents[0].getDistributedNodes()),
         ['3', '5'], reason: 'breaking stories first');
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index fa1c0f7..9cf811a 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -78,7 +78,6 @@
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:smoke/mirrors.dart' as smoke;
 import 'package:template_binding/template_binding.dart';
-import 'package:web_components/polyfill.dart' show customElementsReady;
 
 import 'deserialize.dart' as deserialize;
 import 'src/mirror_loader.dart' as loader; // ** see important note above
diff --git a/pkg/polymer/lib/polymer_element.dart b/pkg/polymer/lib/polymer_element.dart
index c004985..ac98793 100644
--- a/pkg/polymer/lib/polymer_element.dart
+++ b/pkg/polymer/lib/polymer_element.dart
@@ -4,4 +4,4 @@
 
 library polymer.polymer_element;
 
-export 'polymer.dart' show PolymerElement, registerPolymerElement;
+export 'polymer.dart' show PolymerElement;
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 5862562..2510742 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -136,93 +136,6 @@
 List<List<Transformer>> get phasesForPolymer =>
     [[new ObservableTransformer(['lib/src/instance.dart'])]];
 
-/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
-/// is used to resolve relative urls that occur in HTML assets, including
-/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
-/// urls are not resolved unless [source] is Dart file (has a .dart extension).
-// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
-AssetId resolve(AssetId source, String url, TransformLogger logger, Span span,
-    {bool allowAbsolute: false}) {
-  if (url == null || url == '') return null;
-  var uri = Uri.parse(url);
-  var urlBuilder = path.url;
-  if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
-    if (source.extension == '.dart' && uri.scheme == 'package') {
-      var index = uri.path.indexOf('/');
-      if (index != -1) {
-        return new AssetId(uri.path.substring(0, index),
-            'lib${uri.path.substring(index)}');
-      }
-    }
-
-    if (!allowAbsolute) {
-      logger.error('absolute paths not allowed: "$url"', span: span);
-    }
-    return null;
-  }
-
-  var targetPath = urlBuilder.normalize(
-      urlBuilder.join(urlBuilder.dirname(source.path), url));
-  var segments = urlBuilder.split(targetPath);
-  var sourceSegments = urlBuilder.split(source.path);
-  assert (sourceSegments.length > 0);
-  var topFolder = sourceSegments[0];
-  var entryFolder = topFolder != 'lib' && topFolder != 'asset';
-
-  // Find the first 'packages/'  or 'assets/' segment:
-  var packagesIndex = segments.indexOf('packages');
-  var assetsIndex = segments.indexOf('assets');
-  var index = (packagesIndex >= 0 && assetsIndex >= 0)
-      ? min(packagesIndex, assetsIndex)
-      : max(packagesIndex, assetsIndex);
-  if (index > -1) {
-    if (entryFolder) {
-      // URLs of the form "packages/foo/bar" seen under entry folders (like
-      // web/, test/, example/, etc) are resolved as an asset in another
-      // package. 'packages' can be used anywhere, there is no need to walk up
-      // where the entrypoint file was.
-      return _extractOtherPackageId(index, segments, logger, span);
-    } else if (index == 1 && segments[0] == '..') {
-      // Relative URLs of the form "../../packages/foo/bar" in an asset under
-      // lib/ or asset/ are also resolved as an asset in another package, but we
-      // check that the relative path goes all the way out where the packages
-      // folder lives (otherwise the app would not work in Dartium). Since
-      // [targetPath] has been normalized, "packages" or "assets" should be at
-      // index 1.
-      return _extractOtherPackageId(1, segments, logger, span);
-    } else {
-      var prefix = segments[index];
-      var fixedSegments = [];
-      fixedSegments.addAll(sourceSegments.map((_) => '..'));
-      fixedSegments.addAll(segments.sublist(index));
-      var fixedUrl = urlBuilder.joinAll(fixedSegments);
-      logger.error('Invalid url to reach to another package: $url. Path '
-          'reaching to other packages must first reach up all the '
-          'way to the $prefix folder. For example, try changing the url above '
-          'to: $fixedUrl', span: span);
-      return null;
-    }
-  }
-
-  // Otherwise, resolve as a path in the same package.
-  return new AssetId(source.package, targetPath);
-}
-
-AssetId _extractOtherPackageId(int index, List segments,
-    TransformLogger logger, Span span) {
-  if (index >= segments.length) return null;
-  var prefix = segments[index];
-  if (prefix != 'packages' && prefix != 'assets') return null;
-  var folder = prefix == 'packages' ? 'lib' : 'asset';
-  if (segments.length < index + 3) {
-    logger.error("incomplete $prefix/ path. It should have at least 3 "
-        "segments $prefix/name/path-from-name's-$folder-dir", span: span);
-    return null;
-  }
-  return new AssetId(segments[index + 1],
-      path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
-}
-
 /// Generate the import url for a file described by [id], referenced by a file
 /// with [sourceId].
 // TODO(sigmund): this should also be in barback (dartbug.com/12610)
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index abaa275..992ae78 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -10,6 +10,7 @@
 
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as path;
 import 'package:html5lib/dom.dart' show
     Document, DocumentFragment, Element, Node;
@@ -80,8 +81,8 @@
 
       // Note: URL has already been normalized so use docId.
       var href = tag.attributes['href'];
-      var id = resolve(docId, href, transform.logger, tag.sourceSpan,
-          allowAbsolute: rel == 'stylesheet');
+      var id = uriToAssetId(docId, href, transform.logger, tag.sourceSpan,
+          errorOnAbsolute: rel != 'stylesheet');
 
       if (rel == 'import') {
         changed = true;
@@ -162,7 +163,7 @@
       if (script.attributes['type'] == TYPE_DART) {
         script.remove();
         var src = script.attributes['src'];
-        scriptIds.add(resolve(docId, src, logger, script.sourceSpan));
+        scriptIds.add(uriToAssetId(docId, src, logger, script.sourceSpan));
 
         // only the first script needs to be added.
         // others are already removed by _extractScripts
@@ -318,8 +319,8 @@
         var uri = directive.uri.stringValue;
         var span = _getSpan(file, directive.uri);
 
-        var id = resolve(sourceId, uri, transform.logger, span,
-            allowAbsolute: true);
+        var id = uriToAssetId(sourceId, uri, transform.logger, span,
+            errorOnAbsolute: false);
         if (id == null) continue;
 
         var primaryId = transform.primaryInput.id;
@@ -345,7 +346,7 @@
     if (uri.path.isEmpty) return href;  // Implies standalone ? or # in URI.
     if (path.isAbsolute(href)) return href;
 
-    var id = resolve(sourceId, href, transform.logger, span);
+    var id = uriToAssetId(sourceId, href, transform.logger, span);
     if (id == null) return href;
     var primaryId = transform.primaryInput.id;
 
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index acd9c63..df33318 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -9,6 +9,7 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/dom_parsing.dart';
 import 'package:source_maps/span.dart';
@@ -74,7 +75,7 @@
       if (tag.attributes['rel'] != 'import') continue;
       var href = tag.attributes['href'];
       var span = tag.sourceSpan;
-      var id = resolve(sourceId, href, logger, span);
+      var id = uriToAssetId(sourceId, href, logger, span);
       if (id == null ||
           (id.package == 'polymer' && id.path == 'lib/init.html')) continue;
       importIds.add(assetExists(id, transform).then((exists) {
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index fe85e8f..61a6b71 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -11,6 +11,7 @@
 import 'package:html5lib/dom.dart' show Document, Element;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/span.dart' show SourceFile;
 
@@ -102,7 +103,7 @@
         tag.remove();
         continue;
       }
-      mainLibraryId = resolve(docId, src, logger, tag.sourceSpan);
+      mainLibraryId = uriToAssetId(docId, src, logger, tag.sourceSpan);
       mainScriptTag = tag;
     }
   }
@@ -171,7 +172,7 @@
       return Future.forEach(unit.directives, (directive) {
         // Include anything from parts.
         if (directive is PartDirective) {
-          var targetId = resolve(dartLibrary, directive.uri.stringValue,
+          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
           return _initializersOf(targetId).then(result.addAll);
         }
@@ -179,7 +180,7 @@
         // Similarly, include anything from exports except what's filtered by
         // the show/hide combinators.
         if (directive is ExportDirective) {
-          var targetId = resolve(dartLibrary, directive.uri.stringValue,
+          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
           return _initializersOf(targetId).then(
             (r) => _processExportDirective(directive, r, result));
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 54533c9..60bf2fe 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -81,13 +81,9 @@
   polymerJs.callMethod('whenPolymerReady',
       [zone.bindCallback(() => Polymer._ready.complete())]);
 
-  var jsPolymer = new JsObject.fromBrowserObject(
-      document.createElement('polymer-element'));
-
-  var proto = js.context['Object'].callMethod('getPrototypeOf', [jsPolymer]);
-  if (proto is Node) {
-    proto = new JsObject.fromBrowserObject(proto);
-  }
+  var polyElem = document.createElement('polymer-element');
+  var proto = new JsObject.fromBrowserObject(polyElem)['__proto__'];
+  if (proto is Node) proto = new JsObject.fromBrowserObject(proto);
 
   JsFunction originalRegister = proto['register'];
   if (originalRegister == null) {
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index d9d226f..c0a70ed 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.2
+version: 0.10.0-pre.4
 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
@@ -7,20 +7,23 @@
   browsers.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.6"
-  args: ">=0.10.0 <0.11.0"
-  barback: ">=0.9.0 <0.13.0"
-  browser: ">=0.10.0 <0.11.0"
-  html5lib: ">=0.9.2 <0.10.0"
-  logging: ">=0.9.0 <0.10.0"
-  observe: ">=0.10.0-pre.0 <0.11.0"
-  path: ">=0.9.0 <2.0.0"
-  polymer_expressions: ">=0.10.0-pre.0 <0.11.0"
-  smoke: ">=0.1.0-pre.0 <0.2.0"
-  source_maps: ">=0.9.0 <0.10.0"
-  template_binding: ">=0.10.0-pre.0 <0.11.0"
-  web_components: ">=0.3.2 <0.4.0"
-  yaml: ">=0.9.0 <0.10.0"
+  analyzer: '>=0.13.0-dev.6 <0.14.0'
+  args: '>=0.10.0 <0.11.0'
+  barback: '>=0.9.0 <0.13.0'
+  browser: '>=0.10.0 <0.11.0'
+  code_transformers: '>=0.0.1-dev.4 <0.1.0'
+  html5lib: '>=0.9.2 <0.10.0'
+  logging: '>=0.9.0 <0.10.0'
+  observe: '>=0.10.0-pre.0 <0.11.0'
+  path: '>=0.9.0 <2.0.0'
+  polymer_expressions: '>=0.10.0-pre.0 <0.11.0'
+  smoke: '>=0.1.0-pre.0 <0.2.0'
+  source_maps: '>=0.9.0 <0.10.0'
+  template_binding: '>=0.10.0-pre.0 <0.11.0'
+  web_components: '>=0.3.2 <0.4.0'
+  yaml: '>=0.9.0 <0.10.0'
+dev_dependencies:
+  unittest: '>=0.10.0 <0.11.0'
 transformers:
 # TODO(sigmund): uncomment when full codegen is ready.
 #- polymer/src/build/remove_mirrors
@@ -30,7 +33,5 @@
     # TODO(sigmund): uncomment once $include is available in the stable channel
     # (1.3.0) or when we really need a dependency on the latest dev channel.
     # $include: lib/src/instance.dart
-dev_dependencies:
-  unittest: ">=0.10.0 <0.11.0"
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/polymer/test/bind_mdv_test.dart b/pkg/polymer/test/bind_mdv_test.dart
index a47bfc2..d30bc66 100644
--- a/pkg/polymer/test/bind_mdv_test.dart
+++ b/pkg/polymer/test/bind_mdv_test.dart
@@ -8,6 +8,7 @@
 import 'dart:html';
 import 'package:template_binding/template_binding.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 import 'package:web_components/polyfill.dart';
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index 60d6c84..fbbda2e 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -5,7 +5,6 @@
 library polymer.test.property_change_test;
 
 import 'dart:async';
-import 'dart:html';
 import 'package:polymer/polymer.dart';
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 209012d..c9321f3 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -9,6 +9,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart' show templateBind;
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
index 952e78e..1f4bee6 100644
--- a/pkg/polymer_expressions/test/eval_test.dart
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -15,6 +15,7 @@
 import 'package:polymer_expressions/parser.dart';
 import 'package:unittest/unittest.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 
 main() {
   reflectClass(Object); // suppress unused import warning
diff --git a/pkg/polymer_expressions/test/globals_test.dart b/pkg/polymer_expressions/test/globals_test.dart
index 9690baf..433cd08 100644
--- a/pkg/polymer_expressions/test/globals_test.dart
+++ b/pkg/polymer_expressions/test/globals_test.dart
@@ -6,6 +6,7 @@
 import 'dart:html';
 
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart';
 import 'package:unittest/unittest.dart';
diff --git a/pkg/polymer_expressions/test/syntax_test.dart b/pkg/polymer_expressions/test/syntax_test.dart
index 50972e3..b7e6592 100644
--- a/pkg/polymer_expressions/test/syntax_test.dart
+++ b/pkg/polymer_expressions/test/syntax_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart';
 import 'package:unittest/html_config.dart';
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index 46bb5b6..c99cf06 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -185,8 +185,8 @@
     });
   }
 
-  /// Converts a stream of bytes to a stream of lines and returns that along
-  /// with a [StreamCanceller] controlling it.
+  /// Converts a stream of byte lists to a stream of lines and returns that
+  /// along with a [StreamCanceller] controlling it.
   Pair<Stream<String>, StreamCanceller> _lineStreamWithCanceller(
       Future<Stream<List<int>>> streamFuture) {
     return streamWithCanceller(futureStream(streamFuture)
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 55fea14..8e8462e 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -10,7 +10,7 @@
   read like synchronous, linear code, despite executing asynchronously.
 
 dependencies:
-  http: ">=0.9.0 <0.10.0"
+  http: ">=0.9.0 <0.11.0"
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <0.10.0"
   unittest: ">=0.9.0 <0.11.0"
diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
new file mode 100644
index 0000000..06313f7
--- /dev/null
+++ b/pkg/smoke/lib/codegen/generator.dart
@@ -0,0 +1,445 @@
+// 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 to generate code that can initialize the `StaticConfiguration` in
+/// `package:smoke/static.dart`.
+///
+/// This library doesn't have any specific logic to extract information from
+/// Dart source code. To extract code using the analyzer, take a look at the
+/// `smoke.codegen.recorder` library.
+library smoke.codegen.generator;
+
+import 'dart:collection' show SplayTreeMap, SplayTreeSet;
+
+/// Collects the necessary information and generates code to initialize a
+/// `StaticConfiguration`. After setting up the generator by calling
+/// [addGetter], [addSetter], [addSymbol], and [addDeclaration], you can
+/// retrieve the generated code using the following three methods:
+///
+///   * [writeImports] writes a list of imports directives,
+///   * [writeTopLevelDeclarations] writes additional declarations used to
+///     represent mixin classes by name in the generated code.
+///   * [writeInitCall] writes the actual code that allocates the static
+///     configuration.
+///
+/// You'd need to include all three in your generated code, since the
+/// initialization code refers to symbols that are only available from the
+/// generated imports or the generated top-level declarations.
+class SmokeCodeGenerator {
+  // Note: we use SplayTreeSet/Map here and below to keep generated code sorted.
+  /// Names used as getters via smoke.
+  final Set<String> _getters = new SplayTreeSet();
+
+  /// Names used as setters via smoke.
+  final Set<String> _setters = new SplayTreeSet();
+
+  /// Subclass relations needed to run smoke queries.
+  final Map<TypeIdentifier, TypeIdentifier> _parents = new SplayTreeMap();
+
+  /// Declarations requested via `smoke.getDeclaration or `smoke.query`.
+  final Map<TypeIdentifier, Map<String, _DeclarationCode>> _declarations =
+      new SplayTreeMap();
+
+  /// Names that are used both as strings and symbols.
+  final Set<String> _names = new SplayTreeSet();
+
+  /// Prefixes associated with imported libraries.
+  final Map<String, String> _libraryPrefix = {};
+
+  /// Register that [name] is used as a getter in the code.
+  void addGetter(String name) { _getters.add(name); }
+
+  /// Register that [name] is used as a setter in the code.
+  void addSetter(String name) { _setters.add(name); }
+
+  /// Register that [name] might be needed as a symbol.
+  void addSymbol(String name) { _names.add(name); }
+
+  int _mixins = 0;
+
+  /// Creates a new type to represent a mixin. Use [comment] to help users
+  /// figure out what mixin is being represented.
+  TypeIdentifier createMixinType([String comment = '']) =>
+      new TypeIdentifier(null, '_M${_mixins++}', comment);
+
+  /// Register that we care to know that [child] extends [parent].
+  void addParent(TypeIdentifier child, TypeIdentifier parent) {
+    var existing = _parents[child];
+    if (existing != null) {
+      if (existing == parent) return;
+      throw new StateError('$child already has a different parent associated'
+          '($existing instead of $parent)');
+    }
+    _addLibrary(child.importUrl);
+    _addLibrary(parent.importUrl);
+    _parents[child] = parent;
+  }
+
+  /// Register a declaration of a field, property, or method. Note that one and
+  /// only one of [isField], [isMethod], or [isProperty] should be set at a
+  /// given time.
+  void addDeclaration(TypeIdentifier cls, String name, TypeIdentifier type,
+      {bool isField: false, bool isProperty: false, bool isMethod: false,
+      bool isFinal: false, bool isStatic: false,
+      List<ConstExpression> annotations: const []}) {
+    final count = (isField ? 1 : 0) + (isProperty ? 1 : 0) + (isMethod ? 1 : 0);
+    if (count != 1) {
+      throw new ArgumentError('Declaration must be one (and only one) of the '
+          'following: a field, a property, or a method.');
+    }
+    var kind = isField ? 'FIELD' : isProperty ? 'PROPERTY' : 'METHOD';
+    _declarations.putIfAbsent(cls,
+        () => new SplayTreeMap<String, _DeclarationCode>());
+    _addLibrary(cls.importUrl);
+    var map = _declarations[cls];
+
+    for (var exp in annotations) {
+      for (var lib in exp.librariesUsed) {
+        _addLibrary(lib);
+      }
+    }
+
+    _addLibrary(type.importUrl);
+    var decl = new _DeclarationCode(name, type, kind, isFinal, isStatic,
+        annotations);
+    if (map.containsKey(name) && map[name] != decl) {
+      throw new StateError('$type.$name already has a different declaration'
+          ' (${map[name]} instead of $decl).');
+    }
+    map[name] = decl;
+  }
+
+  /// Register that we might try to read declarations of [type], even if no
+  /// declaration exists. This informs the smoke system that querying for a
+  /// member in this class might be intentional and not an error.
+  void addEmptyDeclaration(TypeIdentifier type) {
+    _addLibrary(type.importUrl);
+    _declarations.putIfAbsent(type,
+        () => new SplayTreeMap<String, _DeclarationCode>());
+  }
+
+  /// Writes to [buffer] a line for each import that is needed by the generated
+  /// code. The code added by [writeInitCall] depends on these imports.
+  void writeImports(StringBuffer buffer) {
+    DEFAULT_IMPORTS.forEach((i) => buffer.writeln(i));
+    _libraryPrefix.forEach((url, prefix) {
+      buffer.writeln("import '$url' as $prefix;");
+    });
+  }
+
+  /// Writes to [buffer] top-level declarations that are used by the code
+  /// generated in [writeInitCall]. These are typically declarations of empty
+  /// classes that are then used as placeholders for mixin superclasses.
+  void writeTopLevelDeclarations(StringBuffer buffer) {
+    var types = new Set()
+        ..addAll(_parents.keys)
+        ..addAll(_parents.values)
+        ..addAll(_declarations.keys)
+        ..addAll(_declarations.values.expand(
+              (m) => m.values.map((d) => d.type)))
+        ..removeWhere((t) => t.importUrl != null);
+    for (var type in types) {
+      buffer.write('abstract class ${type.name} {}');
+      if (type.comment != null) buffer.write(' // ${type.comment}');
+      buffer.writeln();
+    }
+  }
+
+  /// Appends to [buffer] code that will initialize smoke's static
+  /// configuration. For example, the code might be of the form:
+  ///
+  ///    useGeneratedCode(new StaticConfiguration(
+  ///      getters: {
+  ///         #i: (o) => o.i,
+  ///         ...
+  ///      names: {
+  ///         #i: "i",
+  ///      }));
+  ///
+  /// The optional [indent] argument is used for formatting purposes. All
+  /// entries in each map (getters, setters, names, declarations, parents) are
+  /// sorted alphabetically.
+  ///
+  /// **Note**: this code assumes that imports from [writeImports] and top-level
+  /// declarations from [writeTopLevelDeclarations] are included in the same
+  /// library where this code will live.
+  void writeInitCall(StringBuffer buffer, [int indent = 2]) {
+    final spaces = new List.filled(indent, ' ').join('');
+    var args = {};
+
+    if (_getters.isNotEmpty) {
+      args['getters'] = _getters.map((n) => '#$n: (o) => o.$n');
+    }
+    if (_setters.isNotEmpty) {
+      args['setters'] = _setters.map((n) => '#$n: (o, v) { o.$n = v; }');
+    }
+
+    if (_parents.isNotEmpty) {
+      var parentsMap = [];
+      _parents.forEach((child, parent) {
+        var parent = _parents[child];
+        parentsMap.add('${child.asCode(_libraryPrefix)}: '
+          '${parent.asCode(_libraryPrefix)}');
+      });
+      args['parents'] = parentsMap;
+    }
+
+    if (_declarations.isNotEmpty) {
+      var declarations = [];
+      _declarations.forEach((type, members) {
+        final sb = new StringBuffer()
+            ..write(type.asCode(_libraryPrefix))
+            ..write(': ');
+        if (members.isEmpty) {
+          sb.write('const {}');
+        } else {
+          sb.write('{\n');
+          members.forEach((name, decl) {
+            var decl = members[name].asCode(_libraryPrefix);
+            sb.write('$spaces        #$name: $decl,\n');
+          });
+          sb.write('$spaces      }');
+        }
+        declarations.add(sb.toString());
+      });
+      args['declarations'] = declarations;
+    }
+
+    if (_names.isNotEmpty) {
+      args['names'] = _names.map((n) => "#$n: '$n'");
+    }
+
+    buffer..write(spaces)
+        ..writeln('useGeneratedCode(new StaticConfiguration(')
+        ..write('$spaces    checkedMode: false');
+
+    args.forEach((name, mapContents) {
+      buffer.writeln(',');
+      // TODO(sigmund): use const map when Type can be keys (dartbug.com/17123)
+      buffer.writeln('$spaces    $name: {');
+      for (var entry in mapContents) {
+        buffer.writeln('$spaces      $entry,');
+      }
+      buffer.write('$spaces    }');
+    });
+    buffer.writeln('));');
+  }
+
+  /// Adds a library that needs to be imported.
+  void _addLibrary(String url) {
+    if (url == null || url == 'dart:core') return;
+    _libraryPrefix.putIfAbsent(url, () => 'smoke_${_libraryPrefix.length}');
+  }
+}
+
+/// Information used to generate code that allocates a `Declaration` object.
+class _DeclarationCode extends ConstExpression {
+  final String name;
+  final TypeIdentifier type;
+  final String kind;
+  final bool isFinal;
+  final bool isStatic;
+  final List<ConstExpression> annotations;
+
+  _DeclarationCode(this.name, this.type, this.kind, this.isFinal, this.isStatic,
+      this.annotations);
+
+  List<String> get librariesUsed => []
+      ..addAll(type.librariesUsed)
+      ..addAll(annotations.expand((a) => a.librariesUsed));
+
+  String asCode(Map<String, String> libraryPrefixes) {
+    var sb = new StringBuffer();
+    sb.write("const Declaration(#$name, ${type.asCode(libraryPrefixes)}");
+    if (kind != 'FIELD') sb.write(', kind: $kind');
+    if (isFinal) sb.write(', isFinal: true');
+    if (isStatic) sb.write(', isStatic: true');
+    if (annotations != null && annotations.isNotEmpty) {
+      sb.write(', annotations: const [');
+      bool first = true;
+      for (var e in annotations) {
+        if (!first) sb.write(', ');
+        first = false;
+        sb.write(e.asCode(libraryPrefixes));
+      }
+      sb.write(']');
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+
+  String toString() =>
+      '(decl: $type.$name - $kind, $isFinal, $isStatic, $annotations)';
+  operator== (other) => other is _DeclarationCode && name == other.name && 
+      type == other.type && kind == other.kind && isFinal == other.isFinal &&
+      isStatic == other.isStatic &&
+      _compareLists(annotations, other.annotations);
+  int get hashCode => name.hashCode + (31 * type.hashCode);
+}
+
+/// A constant expression that can be used as an annotation.
+abstract class ConstExpression {
+
+  /// Returns the library URLs that needs to be imported for this
+  /// [ConstExpression] to be a valid annotation.
+  List<String> get librariesUsed;
+
+  /// Return a string representation of the code in this expression.
+  /// [libraryPrefixes] describes what prefix has been associated with each
+  /// import url mentioned in [libraryUsed].
+  String asCode(Map<String, String> libraryPrefixes);
+
+  ConstExpression();
+
+  /// Create a string expression of the form `'string'`, where [string] is
+  /// normalized so we can correctly wrap it in single quotes.
+  factory ConstExpression.string(String string) {
+    var value = string.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
+    return new CodeAsConstExpression("'$value'");
+  }
+
+  /// Create an expression of the form `prefix.variable_name`.
+  factory ConstExpression.identifier(String importUrl, String name) =>
+      new TopLevelIdentifier(importUrl, name);
+
+  /// Create an expression of the form `prefix.Constructor(v1, v2, p3: v3)`.
+  factory ConstExpression.constructor(String importUrl, String name,
+      List<ConstExpression> positionalArgs,
+      Map<String, ConstExpression> namedArgs) =>
+      new ConstructorExpression(importUrl, name, positionalArgs, namedArgs);
+}
+
+/// A constant expression written as a String. Used when the code is self
+/// contained and it doesn't depend on any imported libraries.
+class CodeAsConstExpression extends ConstExpression {
+  String code;
+  List<String> get librariesUsed => const [];
+
+  CodeAsConstExpression(this.code);
+
+  String asCode(Map<String, String> libraryPrefixes) => code;
+
+  String toString() => '(code: $code)';
+  operator== (other) => other is CodeAsConstExpression && code == other.code;
+  int get hashCode => code.hashCode;
+}
+
+/// Describes a reference to some symbol that is exported from a library. This
+/// is typically used to refer to a type or a top-level variable from that
+/// library.
+class TopLevelIdentifier extends ConstExpression {
+  final String importUrl;
+  final String name;
+  TopLevelIdentifier(this.importUrl, this.name);
+
+  List<String> get librariesUsed => [importUrl];
+  String asCode(Map<String, String> libraryPrefixes) {
+    if (importUrl == 'dart:core' || importUrl == null) return name;
+    return '${libraryPrefixes[importUrl]}.$name';
+  }
+
+  String toString() => '(identifier: $importUrl, $name)';
+  operator== (other) => other is TopLevelIdentifier && name == other.name
+      && importUrl == other.importUrl;
+  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+/// Represents an expression that invokes a const constructor.
+class ConstructorExpression extends ConstExpression {
+  final String importUrl;
+  final String name;
+  final List<ConstExpression> positionalArgs;
+  final Map<String, ConstExpression> namedArgs;
+  ConstructorExpression(this.importUrl, this.name, this.positionalArgs,
+      this.namedArgs);
+
+  List<String> get librariesUsed => [importUrl]
+      ..addAll(positionalArgs.expand((e) => e.librariesUsed))
+      ..addAll(namedArgs.values.expand((e) => e.librariesUsed));
+
+  String asCode(Map<String, String> libraryPrefixes) {
+    var sb = new StringBuffer();
+    sb.write('const ');
+    if (importUrl != 'dart:core' && importUrl != null) {
+      sb.write('${libraryPrefixes[importUrl]}.');
+    }
+    sb.write('$name(');
+    bool first = true;
+    for (var e in positionalArgs) {
+      if (!first) sb.write(', ');
+      first = false;
+      sb.write(e.asCode(libraryPrefixes));
+    }
+    namedArgs.forEach((name, value) {
+      if (!first) sb.write(', ');
+      first = false;
+      sb.write('$name: ');
+      sb.write(value.asCode(libraryPrefixes));
+    });
+    sb.write(')');
+    return sb.toString();
+  }
+
+  String toString() => '(ctor: $importUrl, $name, $positionalArgs, $namedArgs)';
+  operator== (other) => other is ConstructorExpression && name == other.name
+      && importUrl == other.importUrl &&
+      _compareLists(positionalArgs, other.positionalArgs) &&
+      _compareMaps(namedArgs, other.namedArgs);
+  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+
+/// Describes a type identifier, with the library URL where the type is defined.
+// TODO(sigmund): consider adding support for imprecise TypeIdentifiers, which
+// may be used by tools that want to generate code without using the analyzer
+// (they can syntactically tell the type comes from one of N imports).
+class TypeIdentifier extends TopLevelIdentifier
+    implements Comparable<TypeIdentifier> {
+  final String comment;
+  TypeIdentifier(importUrl, typeName, [this.comment])
+      : super(importUrl, typeName);
+
+  // We implement [Comparable] to sort out entries in the generated code.
+  int compareTo(TypeIdentifier other) {
+    if (importUrl == null && other.importUrl != null) return 1;
+    if (importUrl != null && other.importUrl == null) return -1;
+    var c1 = importUrl == null ? 0 : importUrl.compareTo(other.importUrl);
+    return c1 != 0 ? c1 : name.compareTo(other.name);
+  }
+
+  String toString() => '(type-identifier: $importUrl, $name, $comment)';
+  bool operator ==(other) => other is TypeIdentifier &&
+      importUrl == other.importUrl && name == other.name &&
+      comment == other.comment;
+  int get hashCode => super.hashCode;
+}
+
+/// Default set of imports added by [SmokeCodeGenerator].
+const DEFAULT_IMPORTS = const [
+    "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;",
+    "import 'package:smoke/static.dart' show "
+        "useGeneratedCode, StaticConfiguration;",
+  ];
+
+/// Shallow comparison of two lists.
+bool _compareLists(List a, List b) {
+  if (a == null && b != null) return false;
+  if (a != null && b == null) return false;
+  if (a.length != b.length) return false;
+  for (int i = 0; i < a.length; i++) {
+    if (a[i] != b[i]) return false;
+  }
+  return true;
+}
+
+/// Shallow comparison of two maps.
+bool _compareMaps(Map a, Map b) {
+  if (a == null && b != null) return false;
+  if (a != null && b == null) return false;
+  if (a.length != b.length) return false;
+  for (var k in a.keys) {
+    if (!b.containsKey(k) || a[k] != b[k]) return false;
+  }
+  return true;
+}
diff --git a/pkg/smoke/lib/codegen/recorder.dart b/pkg/smoke/lib/codegen/recorder.dart
new file mode 100644
index 0000000..be4c96b
--- /dev/null
+++ b/pkg/smoke/lib/codegen/recorder.dart
@@ -0,0 +1,349 @@
+// 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.
+
+/// Records accesses to Dart program declarations and generates code that will
+/// allow to do the same accesses at runtime using `package:smoke/static.dart`.
+/// Internally, this library relies on the `analyzer` to extract data from the
+/// program, and then uses [SmokeCodeGenerator] to produce the code needed by
+/// the smoke system.
+///
+/// This library only uses the analyzer to consume data previously produced by
+/// running the resolver. This library does not provide any hooks to integrate
+/// running the analyzer itself. See `package:code_transformers` to integrate
+/// the analyzer into pub transformers.
+library smoke.codegen.recorder;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'generator.dart';
+
+typedef String ImportUrlResolver(LibraryElement lib);
+
+/// A recorder that tracks how elements are accessed in order to generate code
+/// that replicates those accesses with the smoke runtime.
+class Recorder {
+  /// Underlying code generator.
+  SmokeCodeGenerator generator;
+
+  /// Function that provides the import url for a library element. This may
+  /// internally use the resolver to resolve the import url.
+  ImportUrlResolver importUrlFor;
+
+  Recorder(this.generator, this.importUrlFor);
+
+  /// Stores mixins that have been recorded and associates a type identifier
+  /// with them. Mixins don't have an associated identifier in the code, so we
+  /// generate a unique identifier for them and use it throughout the code.
+  Map<TypeIdentifier, Map<ClassElement, TypeIdentifier>> _mixins = {};
+
+  /// Adds the superclass information of [type] (including intermediate mixins).
+  /// This will not generate data for direct subtypes of Object, as that is
+  /// considered redundant information.
+  void lookupParent(ClassElement type) {
+    var parent = type.supertype;
+    var mixins = type.mixins;
+    if (parent == null && mixins.isEmpty) return; // type is Object
+    var baseType = parent.element;
+    var baseId = _typeFor(baseType);
+    if (mixins.isNotEmpty) {
+      _mixins.putIfAbsent(baseId, () => {});
+      for (var m in mixins) {
+        var mixinType = m.element;
+        var mixinId = _mixins[baseId].putIfAbsent(mixinType, () {
+          var comment = '${baseId.name} & ${mixinType.name}';
+          return generator.createMixinType(comment);
+        });
+        if (!baseType.type.isObject) generator.addParent(mixinId, baseId);
+        baseType = mixinType;
+        baseId = mixinId;
+        _mixins.putIfAbsent(mixinId, () => {});
+      }
+    }
+    if (!baseType.type.isObject) generator.addParent(_typeFor(type), baseId);
+  }
+
+  TypeIdentifier _typeFor(ClassElement type) =>
+      new TypeIdentifier(importUrlFor(type.library), type.displayName);
+
+  /// Adds any declaration and superclass information that is needed to answer a
+  /// query on [type] that matches [options].
+  void runQuery(ClassElement type, QueryOptions options) {
+    if (type.type.isObject) return; // We don't include Object in query results.
+    var id = _typeFor(type);
+    var parent = type.supertype != null ? type.supertype.element : null;
+    if (options.includeInherited && parent != null &&
+        parent != options.includeUpTo) {
+      lookupParent(type);
+      runQuery(parent, options);
+      var parentId = _typeFor(parent);
+      for (var m in type.mixins) {
+        var mixinClass = m.element;
+        var mixinId = _mixins[parentId][mixinClass];
+        _runQueryInternal(mixinClass, mixinId, options);
+        parentId = mixinId;
+      }
+    }
+    _runQueryInternal(type, id, options);
+  }
+
+  /// Helper for [runQuery]. This runs the query only on a specific [type],
+  /// which could be a class or a mixin labeled by [id].
+  // TODO(sigmund): currently we materialize mixins in smoke/static.dart,
+  // we should consider to include the mixin declaration information directly,
+  // and remove the duplication we have for mixins today.
+  void _runQueryInternal(ClassElement type, TypeIdentifier id,
+      QueryOptions options) {
+
+    skipBecauseOfAnnotations(Element e) {
+      if (options.withAnnotations == null) return false;
+      return !_matchesAnnotation(e.metadata, options.withAnnotations);
+    }
+
+    if (options.includeFields) {
+      for (var f in type.fields) {
+        if (f.isStatic) continue;
+        if (f.isSynthetic) continue; // exclude getters
+        if (options.excludeFinal && f.isFinal) continue;
+        if (skipBecauseOfAnnotations(f)) continue;
+        generator.addDeclaration(id, f.displayName, _typeFor(f.type.element),
+            isField: true, isFinal: f.isFinal,
+            annotations: _copyAnnotations(f));
+      }
+    }
+
+    if (options.includeProperties) {
+      for (var a in type.accessors) {
+        if (a is! PropertyAccessorElement) continue;
+        if (a.isStatic || !a.isGetter) continue;
+        var v = a.variable;
+        if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+        if (options.excludeFinal && v.isFinal) continue;
+        if (skipBecauseOfAnnotations(v)) continue;
+        generator.addDeclaration(id, v.displayName, _typeFor(v.type.element),
+            isProperty: true, isFinal: v.isFinal,
+            annotations: _copyAnnotations(a));
+      }
+    }
+
+    if (options.includeMethods) {
+      for (var m in type.methods) {
+        if (m.isStatic) continue;
+        if (skipBecauseOfAnnotations(m)) continue;
+        generator.addDeclaration(id, m.displayName,
+            new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+            annotations: _copyAnnotations(m));
+      }
+    }
+  }
+
+  /// Adds the declaration of [name] if it was found in [type]. If [recursive]
+  /// is true, then we continue looking up [name] in the parent classes until we
+  /// find it or we reach Object.
+  void lookupMember(ClassElement type, String name, {bool recursive: false}) {
+    _lookupMemberInternal(type, _typeFor(type), name, recursive);
+  }
+
+  /// Helper for [lookupMember] that walks up the type hierarchy including mixin
+  /// classes.
+  bool _lookupMemberInternal(ClassElement type, TypeIdentifier id, String name,
+      bool recursive) {
+    // Exclude members from [Object].
+    if (type.type.isObject) return false;
+    generator.addEmptyDeclaration(id);
+    for (var f in type.fields) {
+      if (f.displayName != name) continue;
+      if (f.isSynthetic) continue; // exclude getters
+      generator.addDeclaration(id, f.displayName,
+          _typeFor(f.type.element), isField: true, isFinal: f.isFinal,
+          isStatic: f.isStatic, annotations: _copyAnnotations(f));
+      return true;
+    }
+
+    for (var a in type.accessors) {
+      if (a is! PropertyAccessorElement) continue;
+      // TODO(sigmund): support setters without getters.
+      if (!a.isGetter) continue;
+      if (a.displayName != name) continue;
+      var v = a.variable;
+      if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+      generator.addDeclaration(id, v.displayName,
+          _typeFor(v.type.element), isProperty: true, isFinal: v.isFinal,
+          isStatic: v.isStatic, annotations: _copyAnnotations(a));
+      return true;
+    }
+
+    for (var m in type.methods) {
+      if (m.displayName != name) continue;
+      generator.addDeclaration(id, m.displayName,
+          new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+          isStatic: m.isStatic, annotations: _copyAnnotations(m));
+      return true;
+    }
+
+    if (recursive) {
+      lookupParent(type);
+      var parent = type.supertype != null ? type.supertype.element : null;
+      if (parent == null) return false;
+      var parentId = _typeFor(parent);
+      for (var m in type.mixins) {
+        var mixinClass = m.element;
+        var mixinId = _mixins[parentId][mixinClass];
+        if (_lookupMemberInternal(mixinClass, mixinId, name, false)) {
+          return true;
+        }
+        parentId = mixinId;
+      }
+      return _lookupMemberInternal(parent, parentId, name, true);
+    }
+    return false;
+  }
+
+
+  /// Copy metadata associated with the declaration of [target].
+  List<ConstExpression> _copyAnnotations(Element target) {
+    var node = target.node;
+    // [node] is the initialization expression, we walk up to get to the actual
+    // member declaration where the metadata is attached to.
+    while (node is! ClassMember) node = node.parent;
+    return node.metadata.map(_convertAnnotation).toList();
+  }
+
+  /// Converts annotations into [ConstExpression]s supported by the codegen
+  /// library.
+  ConstExpression _convertAnnotation(Annotation annotation) {
+    var element = annotation.element;
+    if (element is ConstructorElement) {
+      if (!element.name.isEmpty) {
+        throw new UnimplementedError(
+            'named constructors are not implemented in smoke.codegen.recorder');
+      }
+
+      var positionalArgs = [];
+      for (var arg in annotation.arguments.arguments) {
+        if (arg is NamedExpression) {
+          throw new UnimplementedError(
+              'named arguments in constructors are not implemented in '
+              'smoke.codegen.recorder');
+        }
+        positionalArgs.add(_convertExpression(arg));
+      }
+
+      return new ConstructorExpression(importUrlFor(element.library),
+          element.enclosingElement.name, positionalArgs, const {});
+    }
+
+    if (element is PropertyAccessorElement) {
+      return new TopLevelIdentifier(
+          importUrlFor(element.library), element.name);
+    }
+
+    throw new UnsupportedError('unsupported annotation $annotation');
+  }
+
+  /// Converts [expression] into a [ConstExpression].
+  ConstExpression _convertExpression(Expression expression) {
+    if (expression is StringLiteral) {
+      return new ConstExpression.string(expression.stringValue);
+    }
+
+    if (expression is BooleanLiteral || expression is DoubleLiteral ||
+        expression is IntegerLiteral || expression is NullLiteral) {
+      return new CodeAsConstExpression("${(expression as dynamic).value}");
+    }
+
+    if (expression is Identifier) {
+      var element = expression.bestElement;
+      if (element == null || !element.isPublic) {
+        throw new UnsupportedError('private constants are not supported');
+      }
+
+      var url = importUrlFor(element.library);
+      if (element is ClassElement) {
+        return new TopLevelIdentifier(url, element.name);
+      }
+
+      if (element is PropertyAccessorElement) {
+        var variable = element.variable;
+        if (variable is FieldElement) {
+          var cls = variable.enclosingElement;
+          return new TopLevelIdentifier(url, '${cls.name}.${variable.name}');
+        } else if (variable is TopLevelVariableElement) {
+          return new TopLevelIdentifier(url, variable.name);
+        }
+      }
+    }
+
+    throw new UnimplementedError('expression convertion not implemented in '
+        'smoke.codegen.recorder (${expression.runtimeType} $expression)');
+  }
+}
+
+/// Returns whether [metadata] contains any annotation that is either equal to
+/// an annotation in [queryAnnotations] or whose type is a subclass of a type
+/// listed in [queryAnnotations]. This is equivalent to the check done in
+/// `src/common.dart#matchesAnnotation`, except that this is applied to
+/// static metadata as it was provided by the analyzer.
+bool _matchesAnnotation(Iterable<ElementAnnotation> metadata,
+    Iterable<Element> queryAnnotations) {
+  for (var meta in metadata) {
+    var element = meta.element;
+    var exp;
+    var type;
+    if (element is PropertyAccessorElement) {
+      exp = element.variable;
+      type = exp.evaluationResult.value.type;
+    } else if (element is ConstructorElement) {
+      exp = element;
+      type = element.enclosingElement.type;
+    } else {
+      throw new UnimplementedError('Unsupported annotation: ${meta}');
+    }
+    for (var queryMeta in queryAnnotations) {
+      if (exp == queryMeta) return true;
+      if (queryMeta is ClassElement && type.isSubtypeOf(queryMeta.type)) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+/// Options equivalent to `smoke.dart#QueryOptions`, except that type
+/// information and annotations are denoted by resolver's elements.
+class QueryOptions {
+  /// Whether to include fields (default is true).
+  final bool includeFields;
+
+  /// Whether to include getters and setters (default is true). Note that to
+  /// include fields you also need to enable [includeFields].
+  final bool includeProperties;
+
+  /// Whether to include symbols from the given type and its superclasses
+  /// (except [Object]).
+  final bool includeInherited;
+
+  /// If [includeInherited], walk up the type hierarchy up to this type
+  /// (defaults to [Object]).
+  final ClassElement includeUpTo;
+
+  /// Whether to include final fields and getter-only properties.
+  final bool excludeFinal;
+
+  /// Whether to include methods (default is false).
+  final bool includeMethods;
+
+  /// If [withAnnotation] is not null, then it should be a list of types, so
+  /// only symbols that are annotated with instances of those types are
+  /// included.
+  final List<Element> withAnnotations;
+
+  const QueryOptions({
+      this.includeFields: true,
+      this.includeProperties: true,
+      this.includeInherited: true,
+      this.includeUpTo: null,
+      this.excludeFinal: false,
+      this.includeMethods: false,
+      this.withAnnotations: null});
+}
diff --git a/pkg/smoke/lib/static.dart b/pkg/smoke/lib/static.dart
index 4b276fc..3c8d59c 100644
--- a/pkg/smoke/lib/static.dart
+++ b/pkg/smoke/lib/static.dart
@@ -37,9 +37,15 @@
 
   /// A map from strings to symbols (the reverse of [names]).
   final Map<String, Symbol> symbols;
+
+  /// Whether to check for missing declarations, otherwise, return default
+  /// values (for example a missing parent class can be treated as Object)
+  final bool checkedMode;
+
   StaticConfiguration({
       this.getters: const {}, this.setters: const {}, this.parents: const {},
-      this.declarations: const {}, this.names: const {}})
+      this.declarations: const {}, this.names: const {},
+      this.checkedMode: true})
       : this.symbols = {} {
     names.forEach((k, v) { symbols[v] = k; });
   }
@@ -120,6 +126,7 @@
       var parentType = _configuration.parents[type];
       if (parentType == supertype) return true;
       if (parentType == null) {
+        if (!_configuration.checkedMode) return false;
         throw new MissingCodeException('superclass of "$type" ($parentType)');
       }
       type = parentType;
@@ -147,6 +154,7 @@
   bool hasStaticMethod(Type type, Symbol name) {
     final map = _configuration.declarations[type];
     if (map == null) {
+      if (!_configuration.checkedMode) return false;
       throw new MissingCodeException('declarations for $type');
     }
     final decl = map[name];
@@ -156,25 +164,27 @@
   Declaration getDeclaration(Type type, Symbol name) {
     var decl = _findDeclaration(type, name);
     if (decl == null) {
+      if (!_configuration.checkedMode) return null;
       throw new MissingCodeException('declaration for $type.$name');
     }
     return decl;
   }
 
   List<Declaration> query(Type type, QueryOptions options) {
-    var result;
+    var result = [];
     if (options.includeInherited) {
       var superclass = _configuration.parents[type];
       if (superclass == null) {
-        throw new MissingCodeException('superclass of "$type"');
+        if (_configuration.checkedMode) {
+          throw new MissingCodeException('superclass of "$type"');
+        }
+      } else if (superclass != options.includeUpTo) {
+        result = query(superclass, options);
       }
-      result = (superclass == options.includeUpTo) ? []
-          : query(superclass, options);
-    } else {
-      result = [];
     }
     var map = _configuration.declarations[type];
     if (map == null) {
+      if (!_configuration.checkedMode) return result;
       throw new MissingCodeException('declarations for $type');
     }
     for (var decl in map.values) {
@@ -218,6 +228,7 @@
     }
     var parentType = _configuration.parents[type];
     if (parentType == null) {
+      if (!_configuration.checkedMode) return null;
       throw new MissingCodeException('superclass of "$type"');
     }
     type = parentType;
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 4332d339..c20c690 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -9,11 +9,16 @@
 dependencies:
   barback: ">=0.9.0 <0.12.0"
   logging: ">=0.9.0 <0.10.0"
-#TODO(sigmund): uncomment this once we have some easier way to do global
+# TODO(sigmund): uncomment this once we have some easier way to do global
 # app-level transformers or a way to enable this selectively from the
 # application package.
-#transformers: [smoke/src/default_transformer]
+#transformers:
+#- smoke/src/default_transformer
+#    # TODO(sigmund): include this once this feature is available in the stable
+#    # channel, or when we really need some other feature in the dev channel.
+#    # $include: lib/src/implementation.dart
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
+  path: ">=1.0.0 <2.0.0"
 environment:
   sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/smoke/test/codegen/common.dart b/pkg/smoke/test/codegen/common.dart
new file mode 100644
index 0000000..a7a4c4c
--- /dev/null
+++ b/pkg/smoke/test/codegen/common.dart
@@ -0,0 +1,25 @@
+// 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 smoke.test.codegen.common;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+checkResults(SmokeCodeGenerator generator, {List<String> imports: const [],
+    String topLevel: '', String initCall}) {
+  var allImports = []..addAll(DEFAULT_IMPORTS)..addAll(imports)..add('');
+  var genImports = new StringBuffer();
+  generator.writeImports(genImports);
+  expect(genImports.toString(), allImports.join('\n'));
+
+  var genTopLevel = new StringBuffer();
+  generator.writeTopLevelDeclarations(genTopLevel);
+  expect(genTopLevel.toString(), topLevel);
+
+  var indentedCode = initCall.replaceAll("\n", "\n  ").trim();
+  var genInitCall = new StringBuffer();
+  generator.writeInitCall(genInitCall);
+  expect(genInitCall.toString(), '  $indentedCode\n');
+}
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart
new file mode 100644
index 0000000..37a627a
--- /dev/null
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart
@@ -0,0 +1,147 @@
+// 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.
+
+/// And end-to-end test that generates code and checks that the output matches
+/// the code in `static_test.dart`. Techincally we could run the result in an
+/// isolate, but instead we decided to split that up in two tests. This test
+/// ensures that we generate the code as it was written in static_test, and
+/// separately static_test ensures that the smoke.static library behaves as
+/// expected.
+library smoke.test.codegen.end_to_end_test;
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main(args) {
+  final updateStaticTest = args.length > 0 && args[0] == '--update_static_test';
+
+  test('static_test is up to date', () {
+    var scriptPath = Platform.script.path;
+    var testDir = path.posix.dirname(path.posix.dirname(scriptPath));
+    var commonPath = path.posix.join(testDir, 'common.dart');
+    var testCode = new File('$commonPath').readAsStringSync();
+    var lib = initAnalyzer({'common.dart' : testCode})
+        .libraryFor('common.dart');
+    var coreLib = lib.visibleLibraries.firstWhere(
+        (l) => l.displayName == 'dart.core');
+    var generator = new SmokeCodeGenerator();
+    var recorder = new Recorder(generator, resolveImportUrl);
+
+    // Record all getters and setters we use in the tests.
+    generator.addGetter("i");
+    generator.addGetter("j");
+    generator.addGetter("j2");
+    generator.addGetter("inc0");
+    generator.addGetter("inc1");
+    generator.addGetter("inc2");
+    generator.addSetter("i");
+    generator.addSetter("j2");
+
+    // Record symbol convertions.
+    generator.addSymbol('i');
+
+    /// Record all parent-class relations that we explicitly request for 
+    recorder.lookupParent(lib.getType('AnnotB'));
+    recorder.lookupParent(lib.getType('A'));
+    recorder.lookupParent(lib.getType('B'));
+    recorder.lookupParent(lib.getType('D'));
+    recorder.lookupParent(lib.getType('H'));
+
+    // Record members for which we implicitly request their declaration in
+    // has-getter and has-setter tests.
+    recorder.lookupMember(lib.getType('A'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "j2", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "inc2", recursive: true);
+    recorder.lookupMember(lib.getType('B'), "a", recursive: true);
+    recorder.lookupMember(lib.getType('B'), "f", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "y", recursive: true);
+
+    // Record also lookups for non-exisiting members.
+    recorder.lookupMember(lib.getType('B'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "x", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "z", recursive: true);
+
+    // Record members for which we explicitly request their declaration.
+    recorder.lookupMember(lib.getType('B'), "a");
+    recorder.lookupMember(lib.getType('B'), "w");
+    recorder.lookupMember(lib.getType('A'), "inc1");
+    recorder.lookupMember(lib.getType('F'), "staticMethod");
+    recorder.lookupMember(lib.getType('G'), "b");
+    recorder.lookupMember(lib.getType('G'), "d");
+
+    // Lookups from no-such-method test.
+    recorder.lookupMember(lib.getType('A'), "noSuchMethod", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "noSuchMethod", recursive: true);
+    recorder.lookupMember(lib.getType('E2'), "noSuchMethod", recursive: true);
+
+    // Lookups from has-instance-method and has-static-method tests.
+    recorder.lookupMember(lib.getType('A'), "inc0", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "inc3", recursive: true);
+    recorder.lookupMember(lib.getType('C'), "inc", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "inc", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "inc0", recursive: true);
+    recorder.lookupMember(lib.getType('F'), "staticMethod", recursive: true);
+    recorder.lookupMember(lib.getType('F2'), "staticMethod", recursive: true);
+
+    // Record all queries done by the test.
+    recorder.runQuery(lib.getType('A'), new QueryOptions());
+    recorder.runQuery(lib.getType('D'),
+        new QueryOptions(includeInherited: true));
+
+    var vars = lib.definingCompilationUnit.topLevelVariables;
+    expect(vars[0].name, 'a1');
+    expect(vars[1].name, 'a2');
+    var options = new QueryOptions(includeInherited: true,
+        withAnnotations: [vars[0], vars[1], lib.getType('Annot')]);
+    recorder.runQuery(lib.getType('H'), options);
+
+    var code = _createEntrypoint(generator);
+    var staticTestFile = new File(path.posix.join(testDir, 'static_test.dart'));
+    var existingCode = staticTestFile.readAsStringSync();
+    if (!updateStaticTest) {
+      expect(code, existingCode);
+    } else if (code == existingCode) {
+      print('static_test.dart is already up to date');
+    } else {
+      staticTestFile.writeAsStringSync(code);
+      print('static_test.dart has been updated.');
+    }
+  });
+}
+
+_createEntrypoint(SmokeCodeGenerator generator) {
+  var sb = new StringBuffer()
+      ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------')
+      ..writeln('/// To update this test file, call:')
+      ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test')
+      ..writeln('/// --------------------------------------------------------');
+  sb.write('\nlibrary smoke.test.static_test;\n\n');
+  sb.writeln("import 'package:unittest/unittest.dart';");
+  generator.writeImports(sb);
+  sb.writeln("import 'common.dart' as common show main;\n");
+  generator.writeTopLevelDeclarations(sb);
+  sb.writeln('\n_configure() {');
+  generator.writeInitCall(sb);
+  sb.writeln('}\n');
+  sb.writeln('main() {');
+  sb.writeln('  setUp(_configure);');
+  sb.writeln('  common.main();');
+  sb.writeln('}');
+  return sb.toString();
+}
+
+
+resolveImportUrl(LibraryElement lib) {
+  if (lib.isDartCore) return 'dart:core';
+  if (lib.displayName == 'smoke.test.common') return 'common.dart';
+  return 'unknown.dart';
+}
diff --git a/pkg/smoke/test/codegen/generator_test.dart b/pkg/smoke/test/codegen/generator_test.dart
new file mode 100644
index 0000000..dcd4c55
--- /dev/null
+++ b/pkg/smoke/test/codegen/generator_test.dart
@@ -0,0 +1,181 @@
+// 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 smoke.test.codegen.generator_test;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+
+main() {
+  test('getters', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('i');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #i: (o) => o.i,\n'
+        '    }));\n');
+
+    generator.addGetter('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #foo: (o) => o.foo,\n'
+        '      #i: (o) => o.i,\n'
+        '    }));\n');
+  });
+
+  test('setters', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addSetter('i');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    setters: {\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    }));\n');
+
+    generator.addSetter('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    setters: {\n'
+        '      #foo: (o, v) { o.foo = v; },\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    }));\n');
+  });
+
+  test('names/symbols', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addSymbol('i');
+    generator.addSymbol('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    names: {\n'
+        '      #foo: \'foo\',\n'
+        '      #i: \'i\',\n'
+        '    }));\n');
+  });
+
+  test('getters, setters, and names', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('i');
+    generator.addSetter('i');
+    generator.addSetter('foo');
+    generator.addSymbol('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #i: (o) => o.i,\n'
+        '    },\n'
+        '    setters: {\n'
+        '      #foo: (o, v) { o.foo = v; },\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    },\n'
+        '    names: {\n'
+        '      #foo: \'foo\',\n'
+        '    }));\n');
+  });
+
+  test('parents', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addParent(new TypeIdentifier('a.dart', 'A'),
+        new TypeIdentifier('b.dart', 'B'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    checkResults(generator,
+        imports: [
+          "import 'a.dart' as smoke_0;",
+          "import 'b.dart' as smoke_1;"
+        ],
+        initCall:
+          'useGeneratedCode(new StaticConfiguration(\n'
+          '    checkedMode: false,\n'
+          '    parents: {\n'
+          '      smoke_0.A: smoke_1.B,\n'
+          '      smoke_0.C: smoke_0.A,\n'
+          '    }));\n');
+  });
+
+  test('declarations', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'bar',
+        new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+        annotations: [new ConstExpression.constructor(null, 'Annotation',
+          [new ConstExpression.string("hi")], const {})]);
+    checkResults(generator,
+        imports: ["import 'a.dart' as smoke_0;"],
+        initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #bar: const Declaration(#bar, Function, kind: METHOD, '
+                           'annotations: const [const Annotation(\'hi\')]),\n'
+            '        #foo: const Declaration(#foo, int, isFinal: true),\n'
+            '      },\n'
+            '    }));\n');
+  });
+
+  test('repeated entries appear only once', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('a');
+    generator.addGetter('a');
+    generator.addSetter('b');
+    generator.addSetter('b');
+    generator.addSymbol('d');
+    generator.addSymbol('d');
+    generator.addSymbol('c');
+    generator.addSymbol('c');
+    generator.addSymbol('c');
+
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+
+    checkResults(generator,
+        imports: [
+          "import 'a.dart' as smoke_0;",
+        ],
+        initCall:
+          'useGeneratedCode(new StaticConfiguration(\n'
+          '    checkedMode: false,\n'
+          '    getters: {\n'
+          '      #a: (o) => o.a,\n'
+          '    },\n'
+          '    setters: {\n'
+          '      #b: (o, v) { o.b = v; },\n'
+          '    },\n'
+          '    parents: {\n'
+          '      smoke_0.C: smoke_0.A,\n'
+          '    },\n'
+          '    declarations: {\n'
+          '      smoke_0.A: {\n'
+          '        #foo: const Declaration(#foo, int, isFinal: true),\n'
+          '      },\n'
+          '    },\n'
+          '    names: {\n'
+          '      #c: \'c\',\n'
+          '      #d: \'d\',\n'
+          '    }));\n');
+  });
+}
diff --git a/pkg/smoke/test/codegen/recorder_test.dart b/pkg/smoke/test/codegen/recorder_test.dart
new file mode 100644
index 0000000..33698c9
--- /dev/null
+++ b/pkg/smoke/test/codegen/recorder_test.dart
@@ -0,0 +1,554 @@
+// 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 smoke.test.codegen.recorder_test;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main() {
+  var provider = initAnalyzer(_SOURCES);
+  var generator;
+  var recorder;
+  setUp(() {
+    generator = new SmokeCodeGenerator();
+    recorder = new Recorder(generator, resolveImportUrl);
+  });
+
+  group('parents', () {
+    test('simple subclassing', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('A'));
+      recorder.lookupParent(lib.getType('C'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+            "import '/b.dart' as smoke_1;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.A: smoke_1.B,\n'
+            '      smoke_0.C: smoke_0.A,\n'
+            '    }));\n');
+    });
+
+    test('single mixin', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('E'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // A & D1\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.E: _M0,\n'
+            '      _M0: smoke_0.A,\n'
+            '    }));\n');
+    });
+
+    test('multiple mixins', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('F'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+          ],
+          topLevel: 
+            'abstract class _M0 {} // A & D1\n'
+            'abstract class _M1 {} // _M0 & D2\n'
+            'abstract class _M2 {} // _M1 & D3\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.F: _M2,\n'
+            '      _M0: smoke_0.A,\n'
+            '      _M1: _M0,\n'
+            '      _M2: _M1,\n'
+            '    }));\n');
+    });
+
+    test('same as common_test', () {
+      var lib = provider.libraryFor('/common.dart');
+      recorder.lookupParent(lib.getType('Annot'));
+      recorder.lookupParent(lib.getType('AnnotB'));
+      recorder.lookupParent(lib.getType('A'));
+      recorder.lookupParent(lib.getType('B'));
+      recorder.lookupParent(lib.getType('C'));
+      recorder.lookupParent(lib.getType('D'));
+      recorder.lookupParent(lib.getType('E'));
+      recorder.lookupParent(lib.getType('E2'));
+      recorder.lookupParent(lib.getType('F'));
+      recorder.lookupParent(lib.getType('F2'));
+      recorder.lookupParent(lib.getType('G'));
+      recorder.lookupParent(lib.getType('H'));
+      var coreLib = lib.visibleLibraries.firstWhere(
+          (l) => l.displayName == 'dart.core');
+      recorder.lookupParent(coreLib.getType('int'));
+      recorder.lookupParent(coreLib.getType('num'));
+
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel:
+            'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.AnnotB: smoke_0.Annot,\n'
+            '      smoke_0.D: _M0,\n'
+            '      smoke_0.E2: smoke_0.E,\n'
+            '      smoke_0.F2: smoke_0.F,\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '      int: num,\n'
+            '      _M0: smoke_0.C,\n'
+            '    }));\n');
+    });
+  });
+
+  group('lookup member', () {
+    var lib;
+    setUp(() {
+      lib = provider.libraryFor('/common.dart');
+    });
+
+    test('missing declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'q');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: const {},\n'
+            '    }));\n');
+    });
+
+    test('field declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'i');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('property declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'j2');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('method declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'inc0');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('inherited field - not recursive', () {
+      recorder.lookupMember(lib.getType('D'), 'i');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.D: const {},\n'
+            '    }));\n');
+    });
+
+    test('inherited field - recursive', () {
+      recorder.lookupMember(lib.getType('D'), 'i', recursive: true);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.D: _M0,\n'
+            '      _M0: smoke_0.C,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.D: const {},\n'
+            '      _M0: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '      },\n'
+            '    }));\n');
+    });
+  });
+
+  group('query', () {
+    test('default query', () {
+      var options = new QueryOptions();
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('only fields', () {
+      var options = new QueryOptions(includeProperties: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('only properties', () {
+      var options = new QueryOptions(includeFields: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('fields, properties, and and methods', () {
+      var options = new QueryOptions(includeMethods: true);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+            '        #inc1: const Declaration(#inc1, Function, kind: METHOD),\n'
+            '        #inc2: const Declaration(#inc2, Function, kind: METHOD),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('exclude inherited', () {
+      var options = new QueryOptions(includeInherited: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('D'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.D: {\n'
+            '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('include inherited', () {
+      var options = new QueryOptions(includeInherited: true);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('D'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.D: _M0,\n'
+            '      _M0: smoke_0.C,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.C: {\n'
+            '        #b: const Declaration(#b, smoke_0.B),\n'
+            '        #x: const Declaration(#x, int),\n'
+            '        #y: const Declaration(#y, String),\n'
+            '      },\n'
+            '      smoke_0.D: {\n'
+            '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '      },\n'
+            '      _M0: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('exact annotation', () {
+      var lib = provider.libraryFor('/common.dart');
+      var vars = lib.definingCompilationUnit.topLevelVariables;
+      expect(vars[0].name, 'a1');
+      var options = new QueryOptions(includeInherited: true,
+          withAnnotations: [vars[0]]);
+      recorder.runQuery(lib.getType('H'), options);
+      final annot = 'annotations: const [smoke_0.a1]';
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.G: {\n'
+            '        #b: const Declaration(#b, int, $annot),\n'
+            '      },\n'
+            '      smoke_0.H: {\n'
+            '        #f: const Declaration(#f, int, $annot),\n'
+            '        #g: const Declaration(#g, int, $annot),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('type annotation', () {
+      var lib = provider.libraryFor('/common.dart');
+      var options = new QueryOptions(includeInherited: true,
+          withAnnotations: [lib.getType('Annot')]);
+      recorder.runQuery(lib.getType('H'), options);
+      final a1Annot = 'annotations: const [smoke_0.a1]';
+      final a3Annot = 'annotations: const [smoke_0.a3]';
+      final exprAnnot = 'annotations: const [const smoke_0.Annot(1)]';
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.G: {\n'
+            '        #b: const Declaration(#b, int, $a1Annot),\n'
+            '      },\n'
+            '      smoke_0.H: {\n'
+            '        #f: const Declaration(#f, int, $a1Annot),\n'
+            '        #g: const Declaration(#g, int, $a1Annot),\n'
+            '        #i: const Declaration(#i, int, $a3Annot),\n'
+            '        #j: const Declaration(#j, int, $exprAnnot),\n'
+            '      },\n'
+            '    }));\n');
+    });
+  });
+}
+
+const _SOURCES = const {
+  '/a.dart': '''
+      library a;
+      import '/b.dart';
+
+      class Annot { const Annot(); }
+      const annot = const Annot();
+
+      class A extends B {}
+      class C extends A {}
+      class D1 {
+        int d1;
+      }
+      class D2 {
+        int d2;
+      }
+      class D3 {
+        int d3;
+      }
+      class E extends A with D1 {
+        int e1;
+      }
+      class F extends A with D1, D2, D3 {
+        int f1;
+      }
+      ''',
+
+  '/b.dart': '''
+      library b;
+
+      class B {}
+      ''',
+  '/common.dart': '''
+      library common;
+
+      class A {
+        int i = 42;
+        int j = 44;
+        int get j2 => j;
+        void set j2(int v) { j = v; }
+        void inc0() { i++; }
+        void inc1(int v) { i = i + (v == null ? -10 : v); }
+        void inc2([int v]) { i = i + (v == null ? -10 : v); }
+      }
+
+      class B {
+        final int f = 3;
+        int _w;
+        int get w => _w;
+        set w(int v) { _w = v; }
+
+        String z;
+        A a;
+
+        B(this._w, this.z, this.a);
+      }
+
+      class C {
+        int x;
+        String y;
+        B b;
+
+        inc(int n) {
+          x = x + n;
+        }
+        dec(int n) {
+          x = x - n;
+        }
+
+        C(this.x, this.y, this.b);
+      }
+
+
+      class D extends C with A {
+        int get x2 => x;
+        int get i2 => i;
+
+        D(x, y, b) : super(x, y, b);
+      }
+
+      class E {
+        set x(int v) { }
+        int get y => 1;
+
+        noSuchMethod(i) => y;
+      }
+
+      class E2 extends E {}
+
+      class F {
+        static int staticMethod(A a) => a.i;
+      }
+
+      class F2 extends F {}
+
+      class Annot { const Annot(int ignore); }
+      class AnnotB extends Annot { const AnnotB(); }
+      const a1 = const Annot(0);
+      const a2 = 32;
+      const a3 = const AnnotB();
+
+
+      class G {
+        int a;
+        @a1 int b;
+        int c;
+        @a2 int d;
+      }
+
+      class H extends G {
+        int e;
+        @a1 int f;
+        @a1 int g;
+        @a2 int h;
+        @a3 int i;
+        @Annot(1) int j;
+      }
+      '''
+};
+
+resolveImportUrl(LibraryElement lib) =>
+    lib.isDartCore ? 'dart:core' : '/${lib.displayName}.dart';
diff --git a/pkg/smoke/test/codegen/testing_resolver_utils.dart b/pkg/smoke/test/codegen/testing_resolver_utils.dart
new file mode 100644
index 0000000..7a76614
--- /dev/null
+++ b/pkg/smoke/test/codegen/testing_resolver_utils.dart
@@ -0,0 +1,97 @@
+// 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.
+
+/// Utility functions to test the code generation tools with the resolver.
+// Note, this is just for simple tests, so we restricted the logic to only
+// support root-relative imports. For more sophisticated stuff, you should be
+// using the test helpers in `package:code_transformers`.
+library smoke.test.codegen.testing_resolver_utils;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
+
+class LibraryProvider {
+  final AnalysisContext _analyzer;
+  final Map<String, Source> _allSources;
+  LibraryProvider(this._analyzer, this._allSources);
+  LibraryElement libraryFor(String uri) =>
+      _analyzer.computeLibraryElement(_allSources[uri]);
+}
+
+LibraryProvider initAnalyzer(Map<String, String> contents) {
+  var analyzer = AnalysisEngine.instance.createAnalysisContext();
+  var options = new AnalysisOptionsImpl()
+      ..cacheSize = 256
+      ..preserveComments = false
+      ..analyzeFunctionBodies = false;
+  analyzer.analysisOptions = options;
+  var sdk = new DirectoryBasedDartSdk(new JavaFile(testingDartSdkDirectory));
+  sdk.context.analysisOptions = options;
+  var changes = new ChangeSet();
+  var allSources = {};
+  contents.forEach((url, code) { 
+    var source = new _SimpleSource(url, code, allSources);
+    allSources[url] = source;
+    changes.addedSource(source);
+  });
+  analyzer.applyChanges(changes);
+
+  analyzer.sourceFactory = new SourceFactory([
+      new DartUriResolver(sdk),
+      new _SimpleUriResolver(allSources)]);
+
+  return new LibraryProvider(analyzer, allSources);
+}
+
+class _SimpleUriResolver implements UriResolver {
+  final Map<String, Source> allSources;
+  _SimpleUriResolver(this.allSources);
+
+  Source resolveAbsolute(Uri uri) => allSources['$uri'];
+
+  Source fromEncoding(UriKind kind, Uri uri) =>
+      throw new UnimplementedError('fromEncoding not implemented');
+
+  Uri restoreAbsolute(Source source) =>
+      throw new UnimplementedError('restoreAbsolute not implemented');
+}
+
+class _SimpleSource extends Source {
+  final String path;
+  final String rawContents;
+  final Map<String, Source> allSources;
+
+  _SimpleSource(this.path, this.rawContents, this.allSources);
+
+  operator ==(other) => other is _SimpleSource &&
+      rawContents == other.rawContents;
+  int get hashCode => rawContents.hashCode;
+
+  bool exists() => true;
+  String get encoding => '$uriKind/$path';
+  String get fullName => path;
+  TimestampedData<String> get contents =>
+      new TimestampedData<String>(modificationStamp, rawContents);
+
+  int get modificationStamp => 1;
+  String get shortName => path;
+  UriKind get uriKind => UriKind.FILE_URI;
+  final bool isInSystemLibrary = false;
+
+  // Since this is just for simple tests we just restricted this mock
+  // to root-relative imports. For more sophisticated stuff, you should be
+  // using the test helpers in `package:code_transformers`.
+  Source resolveRelative(Uri uri) {
+    if (uri.path.startsWith('/')) return allSources['${uri.path}'];
+    throw new UnimplementedError('relative URIs not supported: $uri');
+  }
+
+  void getContentsToReceiver(Source_ContentReceiver receiver) {
+    receiver.accept(rawContents, modificationStamp);
+  }
+}
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index d60679f..35d2248 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -215,72 +215,76 @@
   });
 
   group('query', () {
+    _checkQuery(result, names) {
+      expect(result.map((e) => e.name), unorderedEquals(names));
+    }
+
     test('default', () {
       var options = new smoke.QueryOptions();
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j, #j2]);
+      _checkQuery(res, [#i, #j, #j2]);
     });
 
     test('only fields', () {
       var options = new smoke.QueryOptions(includeProperties: false);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j]);
+      _checkQuery(res, [#i, #j]);
     });
 
     test('only properties', () {
       var options = new smoke.QueryOptions(includeFields: false);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#j2]);
+      _checkQuery(res, [#j2]);
     });
 
     test('properties and methods', () {
       var options = new smoke.QueryOptions(includeMethods: true);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j, #j2, #inc0, #inc1, #inc2]);
+      _checkQuery(res, [#i, #j, #j2, #inc0, #inc1, #inc2]);
     });
 
     test('inherited properties and fields', () {
       var options = new smoke.QueryOptions(includeInherited: true);
       var res = smoke.query(D, options);
-      expect(res.map((e) => e.name), [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
+      _checkQuery(res, [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
     });
 
     test('inherited fields only', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           includeProperties: false);
       var res = smoke.query(D, options);
-      expect(res.map((e) => e.name), [#x, #y, #b, #i, #j]);
+      _checkQuery(res, [#x, #y, #b, #i, #j]);
     });
 
     test('exact annotation', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a1]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #f, #g]);
+      _checkQuery(res, [#b, #f, #g]);
 
       options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a2]);
       res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#d, #h]);
+      _checkQuery(res, [#d, #h]);
 
       options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a1, a2]);
       res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #d, #f, #g, #h]);
+      _checkQuery(res, [#b, #d, #f, #g, #h]);
     });
 
     test('type annotation', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [Annot]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #f, #g, #i]);
+      _checkQuery(res, [#b, #f, #g, #i]);
     });
 
     test('mixed annotations (type and exact)', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a2, Annot]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #d, #f, #g, #h, #i]);
+      _checkQuery(res, [#b, #d, #f, #g, #h, #i]);
     });
 
     test('symbol to name', () {
diff --git a/pkg/smoke/test/static_test.dart b/pkg/smoke/test/static_test.dart
index 9ede138..a92adc4 100644
--- a/pkg/smoke/test/static_test.dart
+++ b/pkg/smoke/test/static_test.dart
@@ -1,113 +1,98 @@
-// 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.
+/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------
+/// To update this test file, call:
+/// > dart codegen/end_to_end_test.dart --update_static_test
+/// --------------------------------------------------------
 
 library smoke.test.static_test;
 
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart';
 import 'package:unittest/unittest.dart';
-import 'common.dart' hide main;
+import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
+import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
+import 'common.dart' as smoke_0;
 import 'common.dart' as common show main;
 
-// Abstract class used to represent the mixing C&A in the smoke configuration.
-abstract class C_with_A {}
+abstract class _M0 {} // C & A
 
-// Static configuration that declares only the symbols, getters, methods, and
-// super-class relationships we want to preserve. This and the class above
-// should be automatically generated by transformers using smoke.
-var _config = new StaticConfiguration(
-    getters: {
-      #i: (o) => o.i,
-      #j: (o) => o.j,
-      #j2: (o) => o.j2,
-      #inc0: (o) => o.inc0,
-      #inc1: (o) => o.inc1,
-      #inc2: (o) => o.inc2,
-    },
-    setters: {
-      #i: (o, v) { o.i = v; },
-      #j2: (o, v) { o.j2 = v; },
-    },
-    // TODO(sigmund): this could be a const map, but that triggers
-    // dartbug.com/17123
-    // TODO(sigmund): before doing codegen for this, consider changing smoke's
-    // defaults so we don't need to specify obvious things like `int`, or `*:
-    // Object`.
-    parents: {
-      Annot: Object,
-      AnnotB: Annot,
-      A: Object,
-      B: Object,
-      C: Object,
-      C_with_A: C,
-      D: C_with_A,
-      E: Object,
-      E2: E,
-      F: Object,
-      F2: F,
-      G: Object,
-      H: G,
-      int: Object,
-    },
-    declarations: { 
-      B: {
-        #a: const Declaration(#a, A),
-        #w: const Declaration(#w, int, kind: PROPERTY),
-        #f: const Declaration(#f, int, isFinal: true),
+_configure() {
+  useGeneratedCode(new StaticConfiguration(
+      checkedMode: false,
+      getters: {
+        #i: (o) => o.i,
+        #inc0: (o) => o.inc0,
+        #inc1: (o) => o.inc1,
+        #inc2: (o) => o.inc2,
+        #j: (o) => o.j,
+        #j2: (o) => o.j2,
       },
-      A: {
-        #i: const Declaration(#i, int),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #inc1: const Declaration(#inc1, Function, kind: METHOD),
-        #inc2: const Declaration(#inc2, Function, kind: METHOD),
+      setters: {
+        #i: (o, v) { o.i = v; },
+        #j2: (o, v) { o.j2 = v; },
       },
-      C: {
-        #x: const Declaration(#x, int),
-        #y: const Declaration(#y, String),
-        #b: const Declaration(#b, B),
-        #inc: const Declaration(#inc, Function, kind: METHOD),
+      parents: {
+        smoke_0.AnnotB: smoke_0.Annot,
+        smoke_0.D: _M0,
+        smoke_0.E2: smoke_0.E,
+        smoke_0.F2: smoke_0.F,
+        smoke_0.H: smoke_0.G,
+        _M0: smoke_0.C,
       },
-      C_with_A: {
-        #i: const Declaration(#i, int),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #inc1: const Declaration(#inc1, Function, kind: METHOD),
-        #inc2: const Declaration(#inc2, Function, kind: METHOD),
+      declarations: {
+        smoke_0.A: {
+          #i: const Declaration(#i, int),
+          #inc0: const Declaration(#inc0, Function, kind: METHOD),
+          #inc1: const Declaration(#inc1, Function, kind: METHOD),
+          #inc2: const Declaration(#inc2, Function, kind: METHOD),
+          #j: const Declaration(#j, int),
+          #j2: const Declaration(#j2, int, kind: PROPERTY),
+        },
+        smoke_0.B: {
+          #a: const Declaration(#a, smoke_0.A),
+          #f: const Declaration(#f, int, isFinal: true),
+          #w: const Declaration(#w, int, kind: PROPERTY),
+        },
+        smoke_0.C: {
+          #b: const Declaration(#b, smoke_0.B),
+          #inc: const Declaration(#inc, Function, kind: METHOD),
+          #x: const Declaration(#x, int),
+          #y: const Declaration(#y, String),
+        },
+        smoke_0.D: {
+          #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
+          #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
+        },
+        smoke_0.E: {
+          #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
+          #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
+        },
+        smoke_0.E2: const {},
+        smoke_0.F: {
+          #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
+        },
+        smoke_0.F2: const {},
+        smoke_0.G: {
+          #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
+          #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
+        },
+        smoke_0.H: {
+          #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
+          #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
+          #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
+          #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
+        },
+        _M0: {
+          #i: const Declaration(#i, int),
+          #inc: const Declaration(#inc, Function, kind: METHOD),
+          #inc0: const Declaration(#inc0, Function, kind: METHOD),
+          #j: const Declaration(#j, int),
+          #j2: const Declaration(#j2, int, kind: PROPERTY),
+        },
       },
-      D: {
-        #x2: const Declaration(#x2, int, kind: PROPERTY),
-        #i2: const Declaration(#i2, int, kind: PROPERTY),
-      },
-      E: {
-        #y: const Declaration(#y, int, isFinal: true, kind: PROPERTY),
-        #noSuchMethod:
-           const Declaration(#noSuchMethody, Function, kind: METHOD),
-      },
-      E2: const {},
-      F: {#staticMethod: const Declaration(#staticMethod, Function,
-             kind: METHOD, isStatic: true)},
-      F2: const {},
-      G: {
-        #a: const Declaration(#a, int),
-        #b: const Declaration(#b, int, annotations: const [a1]),
-        #c: const Declaration(#c, int),
-        #d: const Declaration(#d, int, annotations: const [a2]),
-      },
-      H: {
-        #e: const Declaration(#e, int),
-        #f: const Declaration(#f, int, annotations: const [a1]),
-        #g: const Declaration(#g, int, annotations: const [a1]),
-        #h: const Declaration(#h, int, annotations: const [a2]),
-        #i: const Declaration(#i, int, annotations: const [a3]),
-      },
-    },
-    names: {#i: 'i'});
+      names: {
+        #i: 'i',
+      }));
+}
 
 main() {
-  setUp(() => useGeneratedCode(_config));
+  setUp(_configure);
   common.main();
 }
diff --git a/pkg/template_binding/test/utils.dart b/pkg/template_binding/test/utils.dart
index 35e37b3..d2d7379 100644
--- a/pkg/template_binding/test/utils.dart
+++ b/pkg/template_binding/test/utils.dart
@@ -7,6 +7,10 @@
 import 'dart:async';
 import 'dart:html';
 import 'package:observe/observe.dart';
+
+// Note: tests that import 'utils.dart' rely on the following line to make test
+// smaller for dart2js and prevent timeouts in the test bots.
+import 'package:observe/mirrors_used.dart';
 import 'package:template_binding/template_binding.dart';
 export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index be17c3f..24d6de1 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -79,16 +79,33 @@
   try {
     Uri requestUri = Uri.parse(uri);
     _client.getUrl(requestUri)
-        .then((HttpClientRequest request) => request.close())
+        .then((HttpClientRequest request) {
+          request.persistentConnection = false;
+          return request.close();
+        })
         .then((HttpClientResponse response) {
-          return response
-              .fold(new BytesBuilder(), (b, d) => b..add(d))
-              .then((builder) {
-                _requestCompleted(builder.takeBytes(), response);
-                // This client is only used for a single request. Force closing
-                // it now otherwise we wait around until it times out.
-                _client.close(force:true);
-              });
+          // Only create a ByteBuilder, if multiple chunks are received.
+          var bufferOrBuilder;
+          response.listen(
+            (data) {
+              if (bufferOrBuilder == null) {
+                bufferOrBuilder = data;
+              } else {
+                if (bufferOrBuilder is! BytesBuilder) {
+                  bufferOrBuilder = new BytesBuilder()
+                      ..add(bufferOrBuilder);
+                }
+                bufferOrBuilder.add(data);
+              }
+            },
+            onDone: () {
+              var data = bufferOrBuilder;
+              if (data is BytesBuilder) data = data.takeBytes();
+              _requestCompleted(data, response);
+              // Close the client to stop any timers currently held alive.
+              _client.close();
+            },
+            onError: _requestFailed);
         }).catchError((error) {
           _requestFailed(error);
         });
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 4b4e4cc..2d997bc 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -53,7 +53,6 @@
     'io_buffer.cc',
     'io_buffer.h',
     'isolate_data.h',
-    'signal_blocker.h',
     'thread.h',
     'utils.h',
     'utils_android.cc',
diff --git a/runtime/bin/crypto_android.cc b/runtime/bin/crypto_android.cc
index 61b87a1..8922a5e 100644
--- a/runtime/bin/crypto_android.cc
+++ b/runtime/bin/crypto_android.cc
@@ -11,6 +11,8 @@
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
diff --git a/runtime/bin/crypto_linux.cc b/runtime/bin/crypto_linux.cc
index 849fe71..905bf77 100644
--- a/runtime/bin/crypto_linux.cc
+++ b/runtime/bin/crypto_linux.cc
@@ -10,6 +10,7 @@
 
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -18,8 +19,8 @@
 bool Crypto::GetRandomBytes(intptr_t count, uint8_t* buffer) {
   intptr_t fd = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY));
   if (fd < 0) return false;
-  intptr_t bytes_read = read(fd, buffer, count);
-  close(fd);
+  intptr_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer, count));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return bytes_read == count;
 }
 
diff --git a/runtime/bin/crypto_macos.cc b/runtime/bin/crypto_macos.cc
index 19745fc..36020d4 100644
--- a/runtime/bin/crypto_macos.cc
+++ b/runtime/bin/crypto_macos.cc
@@ -11,6 +11,8 @@
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index f87f882..972b36a 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -523,8 +523,16 @@
   // Handle 'part' of IO library.
   if (is_io_library) {
     if (tag == Dart_kSourceTag) {
+      // Prepend the library URI to form a unique script URI for the part.
+      intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
+      char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
+      snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
+      Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
+      free(part_uri);
       return Dart_LoadSource(
-          library, url, Builtin::PartSource(Builtin::kIOLibrary, url_string));
+          library,
+          part_uri_obj,
+          Builtin::PartSource(Builtin::kIOLibrary, url_string));
     } else {
       ASSERT(tag == Dart_kImportTag);
       return NewError("Unable to import '%s' ", url_string);
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index 92fb7ca5..35154a3 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -15,6 +15,8 @@
 #include "bin/log.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -69,14 +71,14 @@
 
 
 void DebuggerConnectionImpl::SetupPollQueue() {
-  int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
   static const int kEpollInitialSize = 16;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -85,7 +87,7 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.fd = wakeup_fds_[0];
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(
+  int status = NO_RETRY_EXPECTED(epoll_ctl(
                    epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
   if (status == -1) {
     FATAL("Failed adding wakeup fd to epoll instance");
@@ -94,7 +96,7 @@
   // Register the listener_fd with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = DebuggerConnectionHandler::listener_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
                DebuggerConnectionHandler::listener_fd_, &event));
   if (status == -1) {
     FATAL("Failed adding listener fd to epoll instance");
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index 020b8cb..59dbd23 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -10,6 +10,7 @@
 #include <stdlib.h>  // NOLINT
 #include <sys/epoll.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/dbg_connection.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
@@ -69,14 +70,14 @@
 
 
 void DebuggerConnectionImpl::SetupPollQueue() {
-  int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
   static const int kEpollInitialSize = 16;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -85,8 +86,8 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.fd = wakeup_fds_[0];
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(
-                   epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(
+      epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
   if (status == -1) {
     FATAL("Failed adding wakeup fd to epoll instance");
   }
@@ -94,8 +95,8 @@
   // Register the listener_fd with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = DebuggerConnectionHandler::listener_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
-               DebuggerConnectionHandler::listener_fd_, &event));
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+      DebuggerConnectionHandler::listener_fd_, &event));
   if (status == -1) {
     FATAL("Failed adding listener fd to epoll instance");
   }
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index 3ee5bf3..f47755d 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -17,6 +17,7 @@
 #include "bin/fdutils.h"
 #include "bin/log.h"
 #include "bin/socket.h"
+#include "platform/signal_blocker.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
 
@@ -132,20 +133,20 @@
 
 void DebuggerConnectionImpl::SetupPollQueue() {
   int result;
-  result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
-  kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+  kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
   if (kqueue_fd_ == -1) {
     FATAL("Failed creating kqueue\n");
   }
   // Register the wakeup_fd_ with the kqueue.
   struct kevent event;
   EV_SET(&event, wakeup_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
-  int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -156,7 +157,7 @@
   // Register the listening socket.
   EV_SET(&event, DebuggerConnectionHandler::listener_fd_,
          EVFILT_READ, EV_ADD, 0, 0, NULL);
-  status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index e89dd05..60458da 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -17,6 +17,8 @@
 #include "bin/file.h"
 #include "bin/platform.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -104,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                    &entry,
-                                    &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                            &entry,
+                                            &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -132,7 +134,7 @@
         // the file pointed to.
         struct stat entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -151,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat st;
-  if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
+  while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+                                             &entry,
+                                             &result))) == 0 &&
          result != NULL &&
          success) {
     switch (entry.d_type) {
@@ -282,7 +284,7 @@
           success = false;
           break;
         }
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -316,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat entry_info;
-  int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -357,7 +359,7 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
+  int result = NO_RETRY_EXPECTED(chdir(path));
   return result == 0;
 }
 
@@ -365,7 +367,7 @@
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -430,9 +432,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -446,7 +448,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index c37b58b..f6b09c4 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -15,6 +15,7 @@
 #include <sys/stat.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/file.h"
 #include "bin/platform.h"
 
@@ -105,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                   &entry,
-                                   &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                  &entry,
+                                  &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -133,7 +134,7 @@
         // the file pointed to.
         struct stat64 entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat64(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -152,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat64(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -196,7 +197,7 @@
 DirectoryListingEntry::~DirectoryListingEntry() {
   ResetLink();
   if (lister_ != 0) {
-    closedir(reinterpret_cast<DIR*>(lister_));
+    VOID_NO_RETRY_EXPECTED(closedir(reinterpret_cast<DIR*>(lister_)));
   }
 }
 
@@ -217,7 +218,8 @@
 
 static bool DeleteFile(char* file_name,
                        PathBuffer* path) {
-  return path->Add(file_name) && unlink(path->AsString()) == 0;
+  return path->Add(file_name) &&
+      NO_RETRY_EXPECTED(unlink(path->AsString())) == 0;
 }
 
 
@@ -233,10 +235,10 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat64(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-    return (unlink(path->AsString()) == 0);
+    return (NO_RETRY_EXPECTED(unlink(path->AsString())) == 0);
   }
 
   if (!path->Add(File::PathSeparator())) return false;
@@ -258,11 +260,10 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
-         result != NULL &&
-         success) {
+  while ((read = NO_RETRY_EXPECTED(
+      readdir_r(dir_pointer, &entry, &result))) == 0 &&
+                result != NULL &&
+                success) {
     switch (entry.d_type) {
       case DT_DIR:
         success = success && DeleteDir(entry.d_name, path);
@@ -283,7 +284,7 @@
         // readdir_r. For those we use lstat to determine the entry
         // type.
         struct stat64 entry_info;
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat64(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -307,8 +308,8 @@
   }
 
   if ((read != 0) ||
-      (closedir(dir_pointer) == -1) ||
-      (remove(path->AsString()) == -1)) {
+      (NO_RETRY_EXPECTED(closedir(dir_pointer)) == -1) ||
+      (NO_RETRY_EXPECTED(remove(path->AsString())) == -1)) {
     return false;
   }
   return success;
@@ -317,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat64 entry_info;
-  int success = TEMP_FAILURE_RETRY(stat64(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat64(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -361,15 +362,14 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
-  return result == 0;
+  return NO_RETRY_EXPECTED(chdir(path)) == 0;
 }
 
 
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -422,9 +422,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return NO_RETRY_EXPECTED(unlink(dir_name)) == 0;
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return NO_RETRY_EXPECTED(rmdir(dir_name)) == 0;
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -438,7 +438,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return NO_RETRY_EXPECTED(rename(path, new_path)) == 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 94b495d..f75047d 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -17,6 +17,8 @@
 #include "bin/file.h"
 #include "bin/platform.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -104,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                    &entry,
-                                    &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                            &entry,
+                                            &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -132,7 +134,7 @@
         // the file pointed to.
         struct stat entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -151,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat st;
-  if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
+  while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+                                             &entry,
+                                             &result))) == 0 &&
          result != NULL &&
          success) {
     switch (entry.d_type) {
@@ -282,7 +284,7 @@
           success = false;
           break;
         }
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -316,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat entry_info;
-  int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -349,7 +351,7 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
+  int result = NO_RETRY_EXPECTED(chdir(path));
   return result == 0;
 }
 
@@ -357,7 +359,7 @@
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -410,9 +412,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -426,7 +428,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index ce5171a..8600613 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -56,10 +56,10 @@
 
 // Unregister the file descriptor for a SocketData structure with epoll.
 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                    EPOLL_CTL_DEL,
-                                    sd->fd(),
-                                    NULL));
+  VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                   EPOLL_CTL_DEL,
+                                   sd->fd(),
+                                   NULL));
 }
 
 
@@ -67,10 +67,10 @@
   struct epoll_event event;
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            sd->fd(),
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           sd->fd(),
+                                           &event));
   if (status == -1) {
     // Epoll does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -84,7 +84,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -95,7 +95,7 @@
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
   static const int kEpollInitialSize = 64;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -104,7 +104,7 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.ptr = NULL;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
                                             EPOLL_CTL_ADD,
                                             interrupt_fds_[0],
                                             &event));
@@ -115,8 +115,8 @@
 
 
 EventHandlerImplementation::~EventHandlerImplementation() {
-  TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
-  TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
 }
 
 
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 2647164..6b1bec6 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -10,11 +10,13 @@
 #error use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/epoll.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -40,7 +42,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index f87c1a4..d44486e 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -20,7 +20,7 @@
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "platform/hashmap.h"
+#include "bin/socket.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
 
@@ -49,10 +49,10 @@
 
 // Unregister the file descriptor for a SocketData structure with epoll.
 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                    EPOLL_CTL_DEL,
-                                    sd->fd(),
-                                    NULL));
+  VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                   EPOLL_CTL_DEL,
+                                   sd->fd(),
+                                   NULL));
 }
 
 
@@ -60,10 +60,10 @@
   struct epoll_event event;
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            sd->fd(),
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           sd->fd(),
+                                           &event));
   if (status == -1) {
     // Epoll does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -77,7 +77,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -88,7 +88,7 @@
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
   static const int kEpollInitialSize = 64;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL1("Failed creating epoll file descriptor: %i", errno);
   }
@@ -97,24 +97,24 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.ptr = NULL;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            interrupt_fds_[0],
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           interrupt_fds_[0],
+                                           &event));
   if (status == -1) {
     FATAL("Failed adding interrupt fd to epoll instance");
   }
-  timer_fd_ = TEMP_FAILURE_RETRY(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
+  timer_fd_ = NO_RETRY_EXPECTED(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
   if (timer_fd_ == -1) {
     FATAL1("Failed creating timerfd file descriptor: %i", errno);
   }
   // Register the timer_fd_ with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = timer_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                        EPOLL_CTL_ADD,
-                                        timer_fd_,
-                                        &event));
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                       EPOLL_CTL_ADD,
+                                       timer_fd_,
+                                       &event));
   if (status == -1) {
     FATAL2(
         "Failed adding timerfd fd(%i) to epoll instance: %i", timer_fd_, errno);
@@ -184,7 +184,8 @@
         it.it_value.tv_sec = millis / 1000;
         it.it_value.tv_nsec = (millis % 1000) * 1000000;
       }
-      timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL);
+      VOID_NO_RETRY_EXPECTED(
+          timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL));
     } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
@@ -192,11 +193,11 @@
       if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
-        shutdown(sd->fd(), SHUT_RD);
+        VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
       } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
-        shutdown(sd->fd(), SHUT_WR);
+        VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_WR));
       } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources and move on to
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index 9341cd1..54f02509 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -9,11 +9,13 @@
 #error Do not include eventhandler_linux.h directly; use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/epoll.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -38,7 +40,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 8024e1c..beeae4b 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -49,9 +49,9 @@
   static const intptr_t kMaxChanges = 2;
   struct kevent events[kMaxChanges];
   EV_SET(events, sd->fd(), EVFILT_READ, EV_DELETE, 0, 0, NULL);
-  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+  VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
   EV_SET(events, sd->fd(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
-  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+  VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
   sd->set_tracked_by_kqueue(false);
 }
 
@@ -88,7 +88,7 @@
   ASSERT(changes > 0);
   ASSERT(changes <= kMaxChanges);
   int status =
-      TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
+      NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
   if (status == -1) {
     // kQueue does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -104,7 +104,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -113,7 +113,7 @@
   FDUtils::SetCloseOnExec(interrupt_fds_[1]);
   shutdown_ = false;
 
-  kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+  kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
   if (kqueue_fd_ == -1) {
     FATAL("Failed creating kqueue");
   }
@@ -121,7 +121,7 @@
   // Register the interrupt_fd with the kqueue.
   struct kevent event;
   EV_SET(&event, interrupt_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
-  int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index 70a103c..18e463b 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -9,11 +9,13 @@
 #error Do not include eventhandler_macos.h directly; use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/event.h>  // NOLINT
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -44,7 +46,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index 2048667..ba28199 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -12,18 +12,20 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +34,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +58,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +69,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index 3bb1ce1..e8984dd 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -11,6 +11,7 @@
 #include <sys/ioctl.h>  // NOLINT
 
 #include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -18,12 +19,12 @@
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +33,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +57,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +68,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index bbc442d..2ecf600 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -12,18 +12,20 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +34,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +58,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +69,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 6c740c5..fb3a616 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -17,7 +17,8 @@
 
 #include "bin/builtin.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -52,7 +53,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_message[kBufferSize];
@@ -71,47 +72,44 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), 0, SEEK_CUR);
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
 }
 
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
 }
 
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd()) != -1);
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -121,7 +119,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (!S_ISREG(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
       return NULL;
@@ -135,7 +133,7 @@
     flags = flags | O_TRUNC;
   }
   flags |= O_CLOEXEC;
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
@@ -157,7 +155,7 @@
 
 bool File::Exists(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -166,9 +164,7 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name,
-                                                 O_RDONLY | O_CREAT | O_CLOEXEC,
-                                                 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
@@ -177,7 +173,7 @@
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+  int status = NO_RETRY_EXPECTED(symlink(target, name));
   return (status == 0);
 }
 
@@ -185,7 +181,7 @@
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -198,7 +194,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -208,7 +204,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -221,7 +217,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -235,25 +231,24 @@
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
     struct stat st;
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(old_path, &st)) != 0) {
+    if (NO_RETRY_EXPECTED(stat(old_path, &st)) != 0) {
       return false;
     }
-    int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(old_path,
-                                                       O_RDONLY | O_CLOEXEC));
+    int old_fd = TEMP_FAILURE_RETRY(open(old_path, O_RDONLY | O_CLOEXEC));
     if (old_fd < 0) {
       return false;
     }
-    int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    int new_fd = TEMP_FAILURE_RETRY(
         open(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
     if (new_fd < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
       return false;
     }
     off_t offset = 0;
     int result = 1;
     while (result > 0) {
       // Loop to ensure we copy everything, and not only up to 2GB.
-      result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      result = NO_RETRY_EXPECTED(
           sendfile(new_fd, old_fd, &offset, kMaxUint32));
     }
     // From sendfile man pages:
@@ -262,10 +257,9 @@
     if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
       const intptr_t kBufferSize = 8 * KB;
       uint8_t buffer[kBufferSize];
-      while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      while ((result = TEMP_FAILURE_RETRY(
           read(old_fd, buffer, kBufferSize))) > 0) {
-        int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
-                                                           result));
+        int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
         if (wrote != result) {
           result = -1;
           break;
@@ -274,9 +268,9 @@
     }
     if (result < 0) {
       int e = errno;
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(new_fd));
+      VOID_NO_RETRY_EXPECTED(unlink(new_path));
       errno = e;
       return false;
     }
@@ -292,7 +286,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -301,7 +295,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -324,7 +318,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -406,11 +400,9 @@
   struct stat entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
-                                                         &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
-                                                          &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -423,8 +415,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat file_1_info;
   struct stat file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 2e79248..92c5637 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -15,9 +15,9 @@
 #include <unistd.h>  // NOLINT
 #include <libgen.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/builtin.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 
 
 namespace dart {
@@ -52,7 +52,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_buf[kBufferSize];
@@ -70,47 +70,44 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), 0, SEEK_CUR);
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
 }
 
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
 }
 
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate64(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate64(handle_->fd(), length) != -1);
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat64(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat64(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -120,7 +117,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,12 +132,12 @@
     flags = flags | O_TRUNC;
   }
   flags |= O_CLOEXEC;
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open64(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int64_t position = lseek64(fd, 0, SEEK_END);
+    int64_t position = NO_RETRY_EXPECTED(lseek64(fd, 0, SEEK_END));
     if (position < 0) {
       return NULL;
     }
@@ -157,7 +154,7 @@
 
 bool File::Exists(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -166,25 +163,24 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  int fd = TEMP_FAILURE_RETRY(
       open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
-  return (close(fd) == 0);
+  return (TEMP_FAILURE_RETRY(close(fd)) == 0);
 }
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
-  return (status == 0);
+  return NO_RETRY_EXPECTED(symlink(target, name)) == 0;
 }
 
 
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -197,7 +193,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -207,7 +203,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -220,7 +216,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -234,25 +230,24 @@
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
     struct stat64 st;
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(old_path, &st)) != 0) {
+    if (NO_RETRY_EXPECTED(stat64(old_path, &st)) != 0) {
       return false;
     }
-    int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(old_path,
-                                                         O_RDONLY | O_CLOEXEC));
+    int old_fd = TEMP_FAILURE_RETRY(open64(old_path, O_RDONLY | O_CLOEXEC));
     if (old_fd < 0) {
       return false;
     }
-    int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    int new_fd = TEMP_FAILURE_RETRY(
         open64(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
     if (new_fd < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
       return false;
     }
     int64_t offset = 0;
     intptr_t result = 1;
     while (result > 0) {
       // Loop to ensure we copy everything, and not only up to 2GB.
-      result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      result = NO_RETRY_EXPECTED(
           sendfile64(new_fd, old_fd, &offset, kMaxUint32));
     }
     // From sendfile man pages:
@@ -261,10 +256,9 @@
     if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
       const intptr_t kBufferSize = 8 * KB;
       uint8_t buffer[kBufferSize];
-      while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      while ((result = TEMP_FAILURE_RETRY(
           read(old_fd, buffer, kBufferSize))) > 0) {
-        int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
-                                                           result));
+        int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
         if (wrote != result) {
           result = -1;
           break;
@@ -273,9 +267,9 @@
     }
     if (result < 0) {
       int e = errno;
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(new_fd));
+      VOID_NO_RETRY_EXPECTED(unlink(new_path));
       errno = e;
       return false;
     }
@@ -291,7 +285,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -300,7 +294,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -323,7 +317,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -332,14 +326,15 @@
 
 char* File::LinkTarget(const char* pathname) {
   struct stat64 link_stats;
-  if (lstat64(pathname, &link_stats) != 0) return NULL;
+  if (NO_RETRY_EXPECTED(lstat64(pathname, &link_stats)) != 0) return NULL;
   if (!S_ISLNK(link_stats.st_mode)) {
     errno = ENOENT;
     return NULL;
   }
   size_t target_size = link_stats.st_size;
   char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
-  size_t read_size = readlink(pathname, target_name, target_size + 1);
+  size_t read_size = NO_RETRY_EXPECTED(
+      readlink(pathname, target_name, target_size + 1));
   if (read_size != target_size) {
     free(target_name);
     return NULL;
@@ -379,7 +374,7 @@
 File::StdioHandleType File::GetStdioHandleType(int fd) {
   ASSERT(0 <= fd && fd <= 2);
   struct stat64 buf;
-  int result = fstat64(fd, &buf);
+  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
   if (result == -1) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -398,11 +393,9 @@
   struct stat64 entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(pathname,
-                                                           &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat64(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(pathname,
-                                                            &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat64(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -415,8 +408,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat64 file_1_info;
   struct stat64 file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat64(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat64(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 46017fb..b5a1dd0 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -18,7 +18,8 @@
 #include "bin/builtin.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 namespace dart {
 namespace bin {
@@ -52,7 +53,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    intptr_t err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    intptr_t err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_message[kBufferSize];
@@ -71,15 +72,13 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
@@ -97,21 +96,20 @@
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length)) != -1;
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -121,7 +119,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,7 +133,7 @@
   if ((mode & kTruncate) != 0) {
     flags = flags | O_TRUNC;
   }
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
@@ -158,7 +156,7 @@
 
 bool File::Exists(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -167,8 +165,7 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, O_RDONLY | O_CREAT,
-                                                 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT, 0666));
   if (fd < 0) {
     return false;
   }
@@ -177,7 +174,7 @@
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+  int status = NO_RETRY_EXPECTED(symlink(target, name));
   return (status == 0);
 }
 
@@ -185,7 +182,7 @@
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -198,7 +195,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -208,7 +205,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -221,7 +218,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -246,7 +243,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -255,7 +252,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -278,7 +275,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -359,11 +356,9 @@
   struct stat entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
-                                                         &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
-                                                          &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -376,8 +371,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat file_1_info;
   struct stat file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_system_watcher_android.cc b/runtime/bin/file_system_watcher_android.cc
index 96fd325..ac2ad5f 100644
--- a/runtime/bin/file_system_watcher_android.cc
+++ b/runtime/bin/file_system_watcher_android.cc
@@ -12,6 +12,8 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -22,7 +24,7 @@
 
 
 intptr_t FileSystemWatcher::Init() {
-  int id = TEMP_FAILURE_RETRY(inotify_init());
+  int id = NO_RETRY_EXPECTED(inotify_init());
   if (id < 0 || !FDUtils::SetCloseOnExec(id)) {
     return -1;
   }
@@ -48,7 +50,7 @@
   if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
   if (events & kDelete) list_events |= IN_DELETE;
   if (events & kMove) list_events |= IN_MOVE;
-  int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+  int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
   if (path_id < 0) {
     return -1;
   }
@@ -57,7 +59,7 @@
 
 
 void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
-  VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+  VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
 }
 
 
diff --git a/runtime/bin/file_system_watcher_linux.cc b/runtime/bin/file_system_watcher_linux.cc
index 2a5fee5..9261426 100644
--- a/runtime/bin/file_system_watcher_linux.cc
+++ b/runtime/bin/file_system_watcher_linux.cc
@@ -13,6 +13,8 @@
 #include "bin/fdutils.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -23,7 +25,7 @@
 
 
 intptr_t FileSystemWatcher::Init() {
-  int id = TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
+  int id = NO_RETRY_EXPECTED(inotify_init1(IN_CLOEXEC));
   if (id < 0) return -1;
   // Some systems dosn't support setting this as non-blocking. Since watching
   // internals are kept away from the user, we know it's possible to continue,
@@ -47,7 +49,7 @@
   if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
   if (events & kDelete) list_events |= IN_DELETE;
   if (events & kMove) list_events |= IN_MOVE;
-  int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+  int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
   if (path_id < 0) {
     return -1;
   }
@@ -56,7 +58,7 @@
 
 
 void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
-  VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+  VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
 }
 
 
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 30322c8..88d98d4 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -18,6 +18,8 @@
 #include "bin/socket.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
 
 #ifndef MAC_OS_X_VERSION_10_7
 enum {
@@ -71,7 +73,7 @@
 
     ~Node() {
       Stop();
-      close(write_fd_);
+      VOID_TEMP_FAILURE_RETRY(close(write_fd_));
       CFRelease(path_ref_);
     }
 
@@ -261,7 +263,7 @@
 
   Node* AddPath(const char* path, int events, bool recursive) {
     int fds[2];
-    VOID_TEMP_FAILURE_RETRY(pipe(fds));
+    VOID_NO_RETRY_EXPECTED(pipe(fds));
     Socket::SetNonBlocking(fds[0]);
     Socket::SetBlocking(fds[1]);
 
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 7fe5839..86d7c2d 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -48,6 +48,7 @@
   V(Process_Wait, 5)                                                           \
   V(Process_Kill, 3)                                                           \
   V(Process_SetExitCode, 1)                                                    \
+  V(Process_GetExitCode, 0)                                                    \
   V(Process_Exit, 1)                                                           \
   V(Process_Sleep, 1)                                                          \
   V(Process_Pid, 1)                                                            \
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 09476b9..5d392d2 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -221,6 +221,11 @@
 }
 
 
+void FUNCTION_NAME(Process_GetExitCode)(Dart_NativeArguments args) {
+  Dart_SetReturnValue(args, Dart_NewInteger(Process::GlobalExitCode()));
+}
+
+
 void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
   int64_t milliseconds = 0;
   // Ignore result if passing invalid argument and just set exit code to 0.
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 18e4b59..fafd749 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -18,9 +18,10 @@
 
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
 
 extern char **environ;
 
@@ -151,7 +152,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -251,7 +252,7 @@
     FDUtils::WriteToBlocking(
         exec_control_fd, os_error_message, strlen(os_error_message) + 1);
   }
-  TEMP_FAILURE_RETRY(close(exec_control_fd));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
   exit(1);
 }
 
@@ -286,8 +287,8 @@
   result = TEMP_FAILURE_RETRY(pipe(read_err));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -296,10 +297,10 @@
   result = TEMP_FAILURE_RETRY(pipe(write_out));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -308,12 +309,12 @@
   result = TEMP_FAILURE_RETRY(pipe(exec_control));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -322,14 +323,14 @@
 
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     Log::PrintErr("fcntl failed: %s\n", *os_error_message);
     return errno;
   }
@@ -350,18 +351,18 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -372,25 +373,25 @@
       exit(1);
     }
 
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
     if (working_directory != NULL &&
         TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
@@ -419,12 +420,12 @@
   result = TEMP_FAILURE_RETRY(pipe(event_fds));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -445,7 +446,7 @@
   // Read exec result from child. If no data is returned the exec was
   // successful and the exec call closed the pipe. Otherwise the errno
   // is written to the pipe.
-  TEMP_FAILURE_RETRY(close(exec_control[1]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -461,22 +462,22 @@
     message[kMaxMessageSize - 1] = '\0';
     *os_error_message = message;
   }
-  TEMP_FAILURE_RETRY(close(exec_control[0]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
   if (bytes_read != 0) {
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
     // Since exec() failed, we're not interested in the exit code.
     // We close the reading side of the exit code pipe here.
     // GetProcessExitCodes will get a broken pipe error when it tries to write
     // to the writing side of the pipe and it will ignore the error.
-    TEMP_FAILURE_RETRY(close(*exit_event));
+    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
     *exit_event = -1;
 
     if (bytes_read == -1) {
@@ -488,13 +489,13 @@
 
   FDUtils::SetNonBlocking(read_in[0]);
   *in = read_in[0];
-  TEMP_FAILURE_RETRY(close(read_in[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
   FDUtils::SetNonBlocking(write_out[1]);
   *out = write_out[1];
-  TEMP_FAILURE_RETRY(close(write_out[0]));
+  VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
   FDUtils::SetNonBlocking(read_err[0]);
   *err = read_err[0];
-  TEMP_FAILURE_RETRY(close(read_err[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
   *id = pid;
   return 0;
@@ -674,12 +675,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -701,11 +702,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    int status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -742,7 +742,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
 }
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index e2810fc..844d09e 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -16,9 +16,9 @@
 #include <sys/wait.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
 
@@ -151,7 +151,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -250,7 +250,7 @@
     FDUtils::WriteToBlocking(
         exec_control_fd, os_error_message, strlen(os_error_message) + 1);
   }
-  TEMP_FAILURE_RETRY(close(exec_control_fd));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
   exit(1);
 }
 
@@ -274,7 +274,7 @@
   int exec_control[2];  // Pipe to get the result from exec.
   int result;
 
-  result = TEMP_FAILURE_RETRY(pipe(read_in));
+  result = pipe(read_in);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
@@ -282,37 +282,37 @@
   }
   FDUtils::SetCloseOnExec(read_in[0]);
 
-  result = TEMP_FAILURE_RETRY(pipe(read_err));
+  result = pipe(read_err);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(read_err[0]);
 
-  result = TEMP_FAILURE_RETRY(pipe(write_out));
+  result = pipe(write_out);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(write_out[1]);
 
-  result = TEMP_FAILURE_RETRY(pipe(exec_control));
+  result = pipe(exec_control);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -321,14 +321,14 @@
 
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     Log::PrintErr("fcntl failed: %s\n", *os_error_message);
     return errno;
   }
@@ -349,18 +349,18 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -371,28 +371,27 @@
       exit(1);
     }
 
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
-    if (working_directory != NULL &&
-        TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
+    if (working_directory != NULL && chdir(working_directory) == -1) {
       ReportChildError(exec_control[1]);
     }
 
@@ -400,8 +399,7 @@
       environ = program_environment;
     }
 
-    TEMP_FAILURE_RETRY(
-        execvp(path, const_cast<char* const*>(program_arguments)));
+    execvp(path, const_cast<char* const*>(program_arguments));
 
     ReportChildError(exec_control[1]);
   }
@@ -415,15 +413,15 @@
   delete[] program_environment;
 
   int event_fds[2];
-  result = TEMP_FAILURE_RETRY(pipe(event_fds));
+  result = pipe(event_fds);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -444,7 +442,7 @@
   // Read exec result from child. If no data is returned the exec was
   // successful and the exec call closed the pipe. Otherwise the errno
   // is written to the pipe.
-  TEMP_FAILURE_RETRY(close(exec_control[1]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -460,22 +458,22 @@
     message[kMaxMessageSize - 1] = '\0';
     *os_error_message = message;
   }
-  TEMP_FAILURE_RETRY(close(exec_control[0]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
   if (bytes_read != 0) {
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
     // Since exec() failed, we're not interested in the exit code.
     // We close the reading side of the exit code pipe here.
     // GetProcessExitCodes will get a broken pipe error when it tries to write
     // to the writing side of the pipe and it will ignore the error.
-    TEMP_FAILURE_RETRY(close(*exit_event));
+    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
     *exit_event = -1;
 
     if (bytes_read == -1) {
@@ -487,13 +485,13 @@
 
   FDUtils::SetNonBlocking(read_in[0]);
   *in = read_in[0];
-  TEMP_FAILURE_RETRY(close(read_in[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
   FDUtils::SetNonBlocking(write_out[1]);
   *out = write_out[1];
-  TEMP_FAILURE_RETRY(close(write_out[0]));
+  VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
   FDUtils::SetNonBlocking(read_err[0]);
   *err = read_err[0];
-  TEMP_FAILURE_RETRY(close(read_err[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
   *id = pid;
   return 0;
@@ -618,7 +616,7 @@
 
 
 bool Process::Kill(intptr_t id, int signal) {
-  return (TEMP_FAILURE_RETRY(kill(id, signal)) != -1);
+  return kill(id, signal) != -1;
 }
 
 
@@ -673,12 +671,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (pipe(fds) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -700,11 +698,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    int status = sigaction(signal, &act, NULL);
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -741,7 +738,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    sigaction(signal, &act, NULL);
   }
 }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 5c85d9a..0e82ce2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -18,9 +18,11 @@
 
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
+
 extern char **environ;
 
 
@@ -150,7 +152,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -349,7 +351,7 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
@@ -717,12 +719,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -744,11 +746,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    intptr_t status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    intptr_t status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -787,7 +788,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
 }
 
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 02a5e86..bb6461e 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -125,6 +125,7 @@
   /* patch */ static void _exit(int status) native "Process_Exit";
   /* patch */ static void _setExitCode(int status)
       native "Process_SetExitCode";
+  /* patch */ static int _getExitCode() native "Process_GetExitCode";
   /* patch */ static void _sleep(int millis) native "Process_Sleep";
   /* patch */ static int _pid(Process process) native "Process_Pid";
   /* patch */ static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 0e5de6b..92cb2d9 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -16,9 +16,10 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -36,13 +37,13 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+                                    salen,
+                                    address,
+                                    len,
+                                    NULL,
+                                    0,
+                                    NI_NUMERICHOST)) != 0) {
     return false;
   }
   return true;
@@ -57,8 +58,7 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -74,14 +74,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -105,8 +103,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -121,9 +118,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -135,8 +131,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -150,10 +145,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+             &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -168,10 +162,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
@@ -186,10 +177,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -272,7 +260,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -307,24 +295,23 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  if (NO_RETRY_EXPECTED(
           bind(fd,
                &addr->addr,
                SocketAddress::GetAddrLength(addr))) < 0) {
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -348,28 +335,27 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   int optval = 1;
-  TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  if (NO_RETRY_EXPECTED(
           bind(fd,
                &addr.addr,
                SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -379,14 +365,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -409,7 +394,7 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+  socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
   if (socket == -1) {
     if (IsTemporaryAcceptError(errno)) {
       // We need to signal to the caller that this is actually not an
@@ -427,7 +412,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -450,11 +435,11 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         IPPROTO_TCP,
+                                         TCP_NODELAY,
+                                         reinterpret_cast<void *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -464,11 +449,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      IPPROTO_TCP,
+                                      TCP_NODELAY,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -478,11 +463,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&on),
+                                   &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -495,25 +480,24 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
-
 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
   uint8_t v;
   socklen_t len = sizeof(v);
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&v),
+                                   &len)) == 0) {
     *value = v;
     return true;
   }
@@ -526,22 +510,22 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&v),
+                                      sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         SOL_SOCKET,
+                                         SO_BROADCAST,
+                                         reinterpret_cast<char *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -551,11 +535,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      SOL_SOCKET,
+                                      SO_BROADCAST,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -565,7 +549,7 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+  return NO_RETRY_EXPECTED(setsockopt(
       fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
@@ -576,7 +560,7 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+  return NO_RETRY_EXPECTED(setsockopt(
       fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 2c05324..e650c68 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -18,8 +18,8 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
+#include "platform/signal_blocker.h"
 #include "vm/thread.h"
 
 
@@ -39,13 +39,8 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(
+        &addr->addr, salen, address, len, NULL, 0, NI_NUMERICHOST) != 0)) {
     return false;
   }
   return true;
@@ -60,8 +55,8 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
+  fd = NO_RETRY_EXPECTED(
+      socket(addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -75,14 +70,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -103,8 +96,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -119,9 +111,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -133,8 +124,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -148,10 +138,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+          &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -166,10 +155,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
     Log::PrintErr("Error getsockname: %s\n",
@@ -184,10 +170,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -198,11 +181,8 @@
 void Socket::GetError(intptr_t fd, OSError* os_error) {
   int len = sizeof(errno);
   int err = 0;
-  getsockopt(fd,
-             SOL_SOCKET,
-             SO_ERROR,
-             &err,
-             reinterpret_cast<socklen_t*>(&len));
+  VOID_NO_RETRY_EXPECTED(getsockopt(
+      fd, SOL_SOCKET, SO_ERROR, &err, reinterpret_cast<socklen_t*>(&len)));
   errno = err;
   os_error->SetCodeAndMessage(OSError::kSystem, errno);
 }
@@ -210,7 +190,7 @@
 
 int Socket::GetType(intptr_t fd) {
   struct stat64 buf;
-  int result = fstat64(fd, &buf);
+  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
   if (result == -1) return -1;
   if (S_ISCHR(buf.st_mode)) return File::kTerminal;
   if (S_ISFIFO(buf.st_mode)) return File::kPipe;
@@ -235,12 +215,12 @@
   hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
   hints.ai_protocol = IPPROTO_TCP;
   struct addrinfo* info = NULL;
-  int status = getaddrinfo(host, 0, &hints, &info);
+  int status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
   if (status != 0) {
     // We failed, try without AI_ADDRCONFIG. This can happen when looking up
     // e.g. '::1', when there are no global IPv6 addresses.
     hints.ai_flags = AI_V4MAPPED;
-    status = getaddrinfo(host, 0, &hints, &info);
+    status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
     if (status != 0) {
       ASSERT(*os_error == NULL);
       *os_error = new OSError(status,
@@ -271,7 +251,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -293,10 +273,11 @@
 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
   int result;
   if (type == SocketAddress::TYPE_IPV4) {
-    result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+    result = NO_RETRY_EXPECTED(inet_pton(AF_INET, address, &addr->in.sin_addr));
   } else {
     ASSERT(type == SocketAddress::TYPE_IPV6);
-    result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+    result = NO_RETRY_EXPECTED(
+        inet_pton(AF_INET6, address, &addr->in6.sin6_addr));
   }
   return result == 1;
 }
@@ -306,24 +287,21 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr->addr.sa_family,
-      SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
-      IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family,
+                         SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+                         IPPROTO_UDP));
   if (fd < 0) return -1;
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr->addr,
-               SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
   return fd;
@@ -350,7 +328,7 @@
     OSError** os_error) {
   struct ifaddrs* ifaddr;
 
-  int status = getifaddrs(&ifaddr);
+  int status = NO_RETRY_EXPECTED(getifaddrs(&ifaddr));
   if (status != 0) {
     ASSERT(*os_error == NULL);
     *os_error = new OSError(status,
@@ -387,26 +365,24 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
+  fd = NO_RETRY_EXPECTED(
+      socket(addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
   if (fd < 0) return -1;
 
   int optval = 1;
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr.addr,
-               SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -416,14 +392,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -445,8 +420,8 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept4(
-        fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
+  socket = TEMP_FAILURE_RETRY(accept4(
+      fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
   if (socket == -1) {
     if (IsTemporaryAcceptError(errno)) {
       // We need to signal to the caller that this is actually not an
@@ -462,7 +437,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -474,11 +449,8 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(
+      fd, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<void *>(&on), &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -488,11 +460,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                           IPPROTO_TCP,
+                           TCP_NODELAY,
+                           reinterpret_cast<char *>(&on),
+                           sizeof(on))) == 0;
 }
 
 
@@ -502,11 +474,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(
+        fd, level, optname, reinterpret_cast<char *>(&on), &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -519,11 +488,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(
+      fd, level, optname, reinterpret_cast<char *>(&on), sizeof(on))) == 0;
 }
 
 
@@ -533,11 +499,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(
+          fd, level, optname, reinterpret_cast<char *>(&v), &len)) == 0) {
     *value = v;
     return true;
   }
@@ -550,22 +513,16 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(
+      fd, level, optname, reinterpret_cast<char *>(&v), sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(
+      fd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char *>(&on), &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -575,11 +532,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                           SOL_SOCKET,
+                           SO_BROADCAST,
+                           reinterpret_cast<char *>(&on),
+                           sizeof(on))) == 0;
 }
 
 
@@ -589,8 +546,8 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
-      fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
+  return NO_RETRY_EXPECTED(
+      setsockopt(fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
 
@@ -600,8 +557,8 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
-      fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
+  return NO_RETRY_EXPECTED(
+      setsockopt(fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 1d0198c..04a1413 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -18,9 +18,10 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -38,13 +39,13 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+                                    salen,
+                                    address,
+                                    len,
+                                    NULL,
+                                    0,
+                                    NI_NUMERICHOST)) != 0) {
     return false;
   }
   return true;
@@ -59,8 +60,7 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -76,14 +76,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -107,8 +105,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -123,9 +120,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -137,8 +133,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -152,10 +147,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+             &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -170,10 +164,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
@@ -188,10 +179,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -267,7 +255,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -302,24 +290,21 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr->addr,
-               SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -385,28 +370,25 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   int optval = 1;
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr.addr,
-               SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -416,14 +398,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -436,7 +417,7 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+  socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
   if (socket == -1) {
     if (errno == EAGAIN) {
       // We need to signal to the caller that this is actually not an
@@ -454,7 +435,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -477,11 +458,11 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         IPPROTO_TCP,
+                                         TCP_NODELAY,
+                                         reinterpret_cast<void *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -491,11 +472,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      IPPROTO_TCP,
+                                      TCP_NODELAY,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -505,11 +486,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&on),
+                                   &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -522,11 +503,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -536,11 +517,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&v),
+                                   &len)) == 0) {
     *value = v;
     return true;
   }
@@ -553,22 +534,22 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&v),
+                                      sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         SOL_SOCKET,
+                                         SO_BROADCAST,
+                                         reinterpret_cast<char *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -578,11 +559,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      SOL_SOCKET,
+                                      SO_BROADCAST,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -601,10 +582,10 @@
             &interface->in.sin_addr,
             SocketAddress::GetInAddrLength(interface));
     if (join) {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
     } else {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
     }
   } else {
@@ -615,10 +596,10 @@
             SocketAddress::GetInAddrLength(addr));
     mreq.ipv6mr_interface = interfaceIndex;
     if (join) {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
     } else {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
     }
   }
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 0edd468..144696d 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -836,7 +836,7 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null && !isClosing && !isClosed) {
+    if (eventPort == null) {
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 77c51ef..da82b27 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -12,6 +12,8 @@
 #include "bin/socket.h"
 #include "bin/utils.h"
 
+#include "vm/thread.h"
+
 
 namespace dart {
 namespace bin {
@@ -217,11 +219,15 @@
 }
 
 
+static Mutex* getaddrinfo_mutex = new Mutex();
 AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
                                                   int type,
                                                   OSError** os_error) {
   Initialize();
 
+  // getaddrinfo is not thread-safe on Windows. Use a mutex to get around it.
+  MutexLocker locker(getaddrinfo_mutex);
+
   // Perform a name lookup for a host name.
   struct addrinfo hints;
   memset(&hints, 0, sizeof(hints));
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index 25d16c3..d0ba85e 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -11,7 +11,8 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -66,8 +67,7 @@
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index 43ece52..dee8c38 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -11,14 +11,15 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
 namespace bin {
 
 int Stdin::ReadByte() {
-  int c = getchar();
+  int c = NO_RETRY_EXPECTED(getchar());
   if (c == EOF) {
     c = -1;
   }
@@ -28,46 +29,45 @@
 
 bool Stdin::GetEchoMode() {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   return (term.c_lflag & ECHO) != 0;
 }
 
 
 void Stdin::SetEchoMode(bool enabled) {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   if (enabled) {
     term.c_lflag |= ECHO|ECHONL;
   } else {
     term.c_lflag &= ~(ECHO|ECHONL);
   }
-  tcsetattr(STDIN_FILENO, TCSANOW, &term);
+  VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
 }
 
 
 bool Stdin::GetLineMode() {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   return (term.c_lflag & ICANON) != 0;
 }
 
 
 void Stdin::SetLineMode(bool enabled) {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   if (enabled) {
     term.c_lflag |= ICANON;
   } else {
     term.c_lflag &= ~(ICANON);
   }
-  tcsetattr(STDIN_FILENO, TCSANOW, &term);
+  VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
 }
 
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w)) == 0 &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index 79e34f8..be736bd 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -11,7 +11,8 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -66,8 +67,7 @@
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 366b9f6..f8fbd36 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -171,10 +171,11 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -227,44 +228,12 @@
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 
 </polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
-  <template>
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-danger">
-        <div class="panel-heading">{{ error.kind }}</div>
-        <div class="panel-body">
-          <p>{{ error.message }}</p>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
-  </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -307,9 +276,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -333,6 +310,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -340,28 +318,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
@@ -369,184 +353,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
-        </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <style>
-      .content {
-        padding-left: 10%;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      h1 {
-        font: 400 18px 'Montserrat', sans-serif;
-      }
-      .member, .memberHeader {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      .monospace {
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: nowrap;
-      }
-    </style>
-    <div class="content">
-      <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tbody><tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
-            <function-ref ref="{{code.function}}">
-            </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </tbody></table>
-    </div>
-    <hr>
-    <div class="content">
-      <template if="{{ code.hasDisassembly }}">
-        <div class="row">
-            <div class="col-md-2 memberHeader">Inclusive</div>
-            <div class="col-md-2 memberHeader">Exclusive</div>
-            <div class="col-md-2 memberHeader">Address</div>
-            <div class="col-md-6 memberHeader">Disassembly</div>
-        </div>
-      </template>
-      <template repeat="{{ instruction in code.instructions }}">
-        <div class="row">
-          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="col-md-6 monospace">{{ instruction.human }}</div>
-        </div>
-      </template>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay" class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
       .textbox {
@@ -627,7 +434,314 @@
 </polymer-element>
 
 
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+  <template if="{{ ref['final'] }}"> final </template>
+  <template if="{{ ref['const'] }}"> const </template>
+  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
+  var
+  </template>
+  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+  </template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+  <template>
+    <div class="well row">
+      <a on-click="toggleDisplay" class="btn muted unselectable">
+           Raw message... <i class="{{ iconClass }}"></i>
+      </a>
+      <div style="display: {{ displayValue }}" class="well">
+        <content></content>
+      </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+  <template>
+    <div class="row">
+    <div class="col-md-8 col-md-offset-2">
+      <div class="panel panel-danger">
+        <div class="panel-heading">{{ error.kind }}</div>
+        <div class="panel-body">
+          <p>{{ error.message }}</p>
+        </div>
+      </div>
+    </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -743,9 +857,26 @@
   </template>
   
 </polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
@@ -762,14 +893,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -812,6 +936,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
@@ -857,6 +982,158 @@
   </template>
   
 </polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -876,12 +1153,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -896,23 +1175,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tbody><tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template="" if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </tbody></table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -921,44 +1202,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
@@ -1005,6 +1292,28 @@
 </polymer-element>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1012,68 +1321,195 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template="" repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal=""></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
   </template>
   
 </polymer-element>
@@ -1085,38 +1521,81 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
+        </tr>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         </tr><tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </tbody></table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   
 </polymer-element>
@@ -1227,9 +1706,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -1241,15 +1728,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
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 74565cd..4cd0dff 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
@@ -8542,7 +8542,7 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
 (function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
 bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},"call$1","guH",2,0,null,132,[]],
 ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
 aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
 Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 $isList:true,
 $isList:true,
 $aszM:null,
@@ -8992,9 +8990,9 @@
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
 return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
 gbx:function(a){return C.O4},
 $isdouble:true,
 $isnum:true},
-vT:{
+x1:{
 "^":"im;"},
 VP:{
-"^":"vT;"},
+"^":"x1;"},
 BQ:{
 "^":"VP;"},
 O:{
@@ -9063,8 +9062,8 @@
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9075,7 +9074,7 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
 if(J.z8(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
 U:[function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
@@ -9126,15 +9117,15 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
 if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
 zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
 ox:[function(){var z=init.globalState.Xz
 z.GL=z.GL-1},"call$0","q4",0,0,null],
 oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
@@ -9208,7 +9205,7 @@
 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))
-else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -9294,21 +9291,21 @@
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
 "^":"Tp:115;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9356,18 +9353,18 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
 iK:[function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
 Hh:[function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
 MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
 Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
 vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
@@ -9388,11 +9385,11 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
 PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
 else this.UM()},"call$0","gi8",0,0,null],
 UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
 if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
-Iy:{
+dq:{
 "^":"a;",
 $isbC:true},
 Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
 zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
@@ -9483,11 +9480,9 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
@@ -9499,19 +9494,17 @@
 y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
 zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 NO:{
 "^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
@@ -9582,19 +9575,19 @@
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
 Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9606,7 +9599,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
 $isEH:true},
 Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9667,7 +9660,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9678,7 +9671,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9692,8 +9685,8 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
 n:[function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
 y=b.ng
 return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,31,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
-if(b!=null){z.a=0+b.length
+if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
 Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
@@ -9877,26 +9868,27 @@
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
 return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
 C.Nm.FV(r,b)
 y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
 if(a=="double")return C.yX
 if(a=="num")return C.oD
 if(a=="bool")return C.Fm
-if(a=="List")return C.l0
+if(a=="List")return C.E3
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"call$1","EN",2,0,null,6,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -9965,7 +9957,7 @@
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -10001,7 +9993,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -10026,7 +10018,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -10037,7 +10029,7 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
@@ -10049,33 +10041,33 @@
 x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
 ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
 KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
 return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
 return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
 uc:[function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10264,10 +10256,10 @@
 else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+else{z=J.x(b)
+if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10277,12 +10269,11 @@
 w=z.vM+w
 z.vM=w
 z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
 "^":"a;"},
 xQ:{
 "^":"a;"},
@@ -10294,8 +10285,8 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
@@ -10304,10 +10295,10 @@
 di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
 t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
 aN:[function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10331,14 +10322,13 @@
 "^":"a;lK,uk,xI,rq,FX,Nc",
 gWa:function(){var z,y,x
 z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+if(!!J.x(z).$iswv)return z
+y=$.bx().t(0,z)
+if(y!=null){x=y.split(":")
+if(0>=x.length)return H.e(x,0)
+z=x[0]}x=new H.GD(z)
+this.lK=x
+return x},
 glT:function(){return this.xI===1},
 ghB:function(){return this.xI===2},
 gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
 BX:[function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
 Fk:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
 KE:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
 e4:[function(a){var z,y,x,w,v,u,t
 z={}
 if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
 call$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a
@@ -10472,18 +10462,18 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
 call$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=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
@@ -10596,11 +10585,9 @@
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
 return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
@@ -10619,11 +10606,11 @@
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
 "^":"a;QW"},
-D2:{
+dN:{
 "^":"a;QW"},
-my:{
+GT:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
 "^":"a;"},
 tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
 return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+if(!!x.$isnr)z.void=true
+else if(!x.$ishJ)z.ret=y.za()
 y=this.Iq
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
@@ -10656,7 +10643,7 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
 hJ:{
-"^":"lb;",
+"^":"lbp;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
 $ishJ:true},
 tu:{
-"^":"lb;oc>",
+"^":"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},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
 za:[function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -10701,7 +10688,7 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
@@ -10720,10 +10707,8 @@
 this.ke=y
 return y},"call$0","gXo",0,0,null],
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
@@ -10733,11 +10718,11 @@
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
 call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
@@ -10758,16 +10743,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10778,13 +10763,13 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
 "^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
@@ -10839,11 +10824,11 @@
 $.NR=z
 return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
 Da:[function(){var z=this.Z6
 z.sec(this)
 z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
 this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
 "^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
 return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
 rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
 df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
 this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
 y=this.Pr()
@@ -10921,10 +10906,10 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -10934,28 +10919,19 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
 F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10990,13 +10967,13 @@
 C.J0.ZL(a)
 C.J0.G6(a)
 return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11011,13 +10988,14 @@
 C.YZ.ZL(a)
 C.YZ.G6(a)
 return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11031,13 +11009,13 @@
 C.kk.ZL(a)
 C.kk.G6(a)
 return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11052,20 +11030,20 @@
 C.IK.ZL(a)
 C.IK.G6(a)
 return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
 J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
 C.YD.ZL(a)
 C.YD.G6(a)
 return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -11104,7 +11082,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11119,29 +11097,29 @@
 C.j8.ZL(a)
 C.j8.G6(a)
 return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
 a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11158,7 +11136,7 @@
 C.O0.ZL(a)
 C.O0.G6(a)
 return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
 if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
 qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
+y=J.x(c)
+if(!y.$isyN)c=y.tt(c,!1)
 y=J.U6(c)
 x=y.gB(c)
 w=a.length
@@ -11220,9 +11199,13 @@
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
 H.qG(a,z,w,a,b)
-for(z=y.gA(c);z.G();b=u){v=z.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[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.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
@@ -11247,7 +11230,7 @@
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){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
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -11357,7 +11340,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
@@ -11414,7 +11397,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
@@ -11479,11 +11462,10 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
 gl:function(){return}},
 SU7:{
 "^":"a;",
 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"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -11579,13 +11564,11 @@
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
 X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
 else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
 if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
 x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
 $.tY[b]=x
-return x}u=H.pL(b)
+return x}u=H.mN(b)
 if(u==null){t=init.functionAliases[b]
 if(t!=null){x=new H.ng(b,null,a)
 x.CM=new H.Ar(init.metadata[t],null,null,null,x)
 $.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
 r=s["@"]
 if(r==null){q=null
 p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
 q=z.t(q,0)}else p=null
 if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
@@ -11657,15 +11638,13 @@
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
 z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
@@ -11686,8 +11665,8 @@
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+if(!!x.$isMs){z.a=y
+break}if(!!x.$isrN)break
 y=y.gXP()}if(b==null)return $.P8()
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
@@ -11696,8 +11675,7 @@
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
 return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
 return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
 if(w===-1)return C.xD;++w
 return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+z=J.x(b)
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -11724,7 +11702,7 @@
 if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
 jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -11776,23 +11754,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
 $isNL:true,
 $isej:true},
 cw:{
 "^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
 gOO:function(){return"LibraryMirror"},
 gUx:function(){return this.If},
 gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+gqh:function(){var z,y,x
 z=this.P8
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
@@ -11847,12 +11822,10 @@
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -11935,7 +11908,6 @@
 this.xO=z
 return z},
 gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isD4:true,
 $isej:true,
 $isNL:true},
@@ -11943,12 +11915,12 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
 "^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
 gJi:function(){return this},
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isMs:true,
 $isej:true,
 $isX9:true,
@@ -11990,7 +11961,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12007,7 +11978,7 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
 return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
 gUx:function(){return this.NK.gUx()},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isbl:true,
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:112;",
@@ -12173,15 +12141,13 @@
 Ax:{
 "^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
 else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
@@ -12211,7 +12177,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12227,7 +12193,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12276,9 +12242,7 @@
 else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
@@ -12310,12 +12274,12 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
 return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
@@ -12336,7 +12300,6 @@
 gw8:function(){return C.hU},
 gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
 return new H.cu(this.Cr,null)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isWf:true,
 $isMs:true,
 $isej:true,
@@ -12346,19 +12309,19 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-Ld:{
+XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
 gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12397,7 +12360,7 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
 return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
 v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+w=J.x(y)
+if(!!w.$isv){u=y.gjm()
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
@@ -12426,7 +12389,6 @@
 y.constructor[z]=s
 return s},
 bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isvr:true,
 $isej:true},
 Zk:{
@@ -12451,10 +12413,7 @@
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
 else{z=this.gXP()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12507,8 +12466,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+if(!!y.$iscw)return H.d(z.Nz)
+if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
 z.fixed$length=init
 return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+if(!!J.x(z).$isb8)return z
+return}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
 $.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
 dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
 b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
 TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
@@ -12761,7 +12720,7 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
 this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
@@ -12866,7 +12825,7 @@
 "^":"Tp;a",
 call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
 b8:{
 "^":"a;",
 $isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[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.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
 E6:[function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12937,26 +12904,26 @@
 z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
 R8:[function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
 P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
 OH:[function(a){var z
 if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
 if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
-z.e=q
-y=q
-continue}else P.A9(q,b)
-else P.k3(q,b)
-return}}if(x.b===!0){p=b.L3()
-b.Am(x.c)}else{p=b.L3()
+y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){r=x.c
+if(!!J.x(r).$isvs)if(r.Gv>=4){b.swG(!0)
+z.e=r
+y=r
+continue}else P.A9(r,b)
+else P.k3(r,b)
+return}}if(x.b===!0){q=b.L3()
+b.Am(x.c)}else{q=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
 da:{
 "^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
 call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
@@ -13040,7 +13004,7 @@
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
 call$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)
@@ -13100,33 +13064,29 @@
 u=this.b
 if(v)u.c=this.c.e.gcG()
 else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
 "^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
 z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+if(!J.x(z.a).$isvs){y=P.Dt(null)
+z.a=y
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
@@ -13280,7 +13240,7 @@
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
@@ -13293,7 +13253,7 @@
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
@@ -13320,13 +13280,11 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
@@ -13338,18 +13296,18 @@
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
 Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
 Vo:{
 "^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 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},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13492,7 +13450,7 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
 CR:{
 "^":"Tp:115;a,b",
 call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
 call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
 GU:{
@@ -13543,8 +13501,8 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
 vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
 nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -13579,7 +13537,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13591,26 +13549,26 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
 tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
 zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
 hk:function(a,b){return this.E2.call$2(a,b)},
 Gr:function(a){return this.cP.call$1(a)},
 FI:function(a,b){return this.Jl.call$2(a,b)},
 mg:function(a,b,c){return this.pU.call$3(a,b,c)},
 Al:function(a){return this.Fh.call$1(a)},
 cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
 wr:function(a){return this.rb.call$1(a)},
 RK:function(a,b){return this.rb.call$2(a,b)},
 uN:function(a,b){return this.Zq.call$2(a,b)},
 Ch:function(a,b){return this.JS.call$1(b)},
 iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -13643,8 +13601,8 @@
 return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
 return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
 return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
 TF:{
 "^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
 call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
@@ -13724,7 +13682,7 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
 mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
 $isEH:true},
 eM:{
 "^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
-W5:{
+nU:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
 Al:function(a){return this.gFh().call$1(a)},
 gXp:function(){return P.zi()},
 cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
 grb:function(){return P.G2()},
 wr:function(a){return this.grb().call$1(a)},
 RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
 mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -13893,7 +13849,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -13920,7 +13876,7 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
@@ -13930,7 +13886,7 @@
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13951,71 +13907,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP: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:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14058,8 +14014,8 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
 FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14102,7 +14058,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -14115,17 +14071,17 @@
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14143,13 +14099,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14159,15 +14115,15 @@
 return z},"call$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -14249,7 +14205,7 @@
 this.DM=null
 return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14300,18 +14256,19 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14381,7 +14338,7 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14426,13 +14383,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14451,7 +14409,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14484,11 +14443,11 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
 return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
 $isQV:true,
 $asQV:null},
@@ -14523,13 +14482,13 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
 this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
 this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
 y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
 return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+UZ:[function(a,b,c){var z
+this.pZ(a,b,c)
+z=c-b
+this.YW(a,b,J.xH(this.gB(a),z),a,c)
+this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
 return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){var z,y
+if(b>=0){z=this.gB(a)
+if(typeof z!=="number")return H.s(z)
+z=b>z}else z=!0
+if(z)throw H.b(P.TE(b,0,this.gB(a)))
+z=J.x(c)
+if(!!z.$isyN)c=z.br(c)
+y=J.q8(c)
+this.sB(a,J.WB(this.gB(a),y))
+if(typeof y!=="number")return H.s(y)
+this.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){var z,y
+z=J.x(c)
+if(!!z.$isList){z=z.gB(c)
+if(typeof z!=="number")return H.s(z)
+this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -14662,14 +14639,14 @@
 $isQV:true,
 $asQV:null},
 ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$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)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+y=J.mQ(J.xH(y,1),this.v5.length-1)
+if(y>=z.length)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -14702,21 +14678,23 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+z=J.x(b)
+if(!!z.$isList){y=z.gB(b)
+x=this.gB(this)
+if(typeof y!=="number")return H.s(y)
+z=x+y
 w=this.v5
 v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -14724,15 +14702,16 @@
 this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=this.eZ+z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+H.qG(t,x,z,b,0)
+this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
+if(typeof z!=="number")return H.s(z)
+s=v-z
+if(y<s){H.qG(w,z,z+y,b,0)
+this.eZ=J.WB(this.eZ,y)}else{r=y-s
+H.qG(w,z,z+s,b,0)
+z=this.v5
+H.qG(z,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
@@ -14747,38 +14726,33 @@
 this.av=0
 this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
 z=this.v5
 y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
 z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
 this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+z=this.v5.length-1
+if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
+if(u<0||u>=w)return H.e(x,u)
+t=x[u]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+this.av=(y+1&z)>>>0
+return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
+this.eZ=y
+for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
+if(s<0||s>=w)return H.e(x,s)
+t=x[s]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+return a}},"call$1","gzv",2,0,null,456,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14793,25 +14767,29 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
 z=this.av
 y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
+if(typeof y!=="number")return H.s(y)
+if(z<=y){x=y-z
+z=this.v5
+y=this.av
+H.qG(a,0,x,z,y)
+return x}else{y=this.v5
+w=y.length-z
+H.qG(a,0,w,y,z)
 z=this.eZ
+if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
 Ba:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
 V1:[function(a){this.aY=null
 this.P6=0
 this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
 An:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14976,7 +14954,7 @@
 return this.Wb(z)},
 p0:[function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
 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)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
 tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
 "^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -15073,12 +15051,12 @@
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
 Cf:{
@@ -15121,7 +15099,7 @@
 this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
 WD:[function(a){var z=this.qi
 if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
 rl:[function(a){var z,y,x,w,v
 if(!this.IS(a)){x=a
 w=this.qi
@@ -15144,7 +15122,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
 z=this.Vy
 z.KF("[")
 if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
 z.vM=z.vM+","
 this.rl(y.t(a,x));++x}}z.KF("]")
 this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
 w=this.Vy
 w.KF("{")
 z.a=!0
@@ -15163,13 +15141,13 @@
 w.KF("}")
 this.qi.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
 new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15178,13 +15156,13 @@
 x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:[function(a){var z,y,x
 z=J.U6(a)
@@ -15193,7 +15171,7 @@
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
 fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
 static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
 Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
 FM:function(a){return new P.HG(a)},
 ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
 NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15336,10 +15314,8 @@
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isiP)return!1
 return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
 iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(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).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15405,32 +15381,30 @@
 return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1","wI",2,0,null,198,[]]}},
 MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
 g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
 return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
 $isa6:true,
 static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
 return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
@@ -15549,7 +15523,7 @@
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15622,7 +15596,7 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
 V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
 Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
 uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15673,12 +15647,12 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15692,8 +15666,8 @@
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)return!1
+z=J.x(b)
+if(!z.$isiD)return!1
 if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
 z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
@@ -15708,7 +15682,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){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,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",hK:[function(a1){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,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -15875,18 +15849,18 @@
 if(q&&!p)z.call$1("expected a part after last `:`")
 if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 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.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
 y.vM=y.vM+u
 z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
 hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$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.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:112;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15938,44 +15912,44 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
 else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
 "^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
 $isEH:true},
 Mx:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
 "^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
 $isEH:true},
 kZ:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$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)
@@ -16023,18 +15997,18 @@
 "^":"Tp:112;c",
 call$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)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
 r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
 It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
 return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
 wi:[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(new P.AT(d))
@@ -16118,7 +16088,7 @@
 return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -16130,12 +16100,10 @@
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAnchorElement"},
 Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
 Fy:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
-$isGv:true,
 "%":"Comment;CharacterData"},
 Yr:{
 "^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16199,10 +16180,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 "%":";DocumentFragment"},
 cm:{
 "^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
 aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
 gLm:function(a){return C.i3.f0(a)},
 ZL:function(a){},
 $iscv:true,
-$isGv:true,
 $isD0:true,
 "%":";Element"},
 Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16293,14 +16282,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16309,9 +16298,9 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
 zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 In:{
 "^":"qE;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
+pL:{
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -16400,16 +16388,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
 "%":"MIDIOutput"},
-ab:{
+tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 $isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
@@ -16423,15 +16412,11 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
 if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,332,[],333,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
 $isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16475,7 +16465,7 @@
 "^":"qE;t5:type%",
 "%":"HTMLOListElement"},
 G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
-ew:{
+kQ:{
 "^":"ea;",
-$isew:true,
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
 j2:{
 "^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -16548,7 +16538,7 @@
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
 "^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
 "%":"StorageEvent"},
 Lx:{
@@ -16579,7 +16569,7 @@
 r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-xV:{
+R0:{
 "^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
@@ -16592,9 +16582,12 @@
 Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
@@ -16619,41 +16612,35 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 $isu9:true,
-$isGv:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16666,14 +16653,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.yg]},
 $isyN:true,
@@ -16681,19 +16668,19 @@
 $asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
-LO:{
+LOx:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.uj]},
 $isyN:true,
@@ -16703,12 +16690,12 @@
 "%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
 To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
 V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -16760,8 +16742,8 @@
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
 return z}}},
 B1:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -16813,11 +16794,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
 $isEH:true},
 bU:{
 "^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+FV:[function(a,b){var z,y,x,w
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+y=this.NL
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+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)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
@@ -16869,15 +16853,16 @@
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
 GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
 $asar:function(){return[W.KV]},
 $aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
 $asQV:function(){return[W.KV]}},
 Ou:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
 V1:[function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
 OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
 xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
@@ -17002,27 +16986,27 @@
 return z}}},
 FK:{
 "^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
 "^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17032,35 +17016,35 @@
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 $isqh:true},
 ie:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Ea:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 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.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17068,16 +17052,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 $isqh:true},
 i2:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 b0:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
 return},"call$0","gZS",0,0,null],
 Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
@@ -17116,19 +17100,21 @@
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -17143,17 +17129,17 @@
 V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){J.wg(this.xa,b)},
 GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
 call$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)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
-$isGv:true,
 static:{P1:[function(a){if(a===window)return a
 else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
@@ -17195,8 +17180,7 @@
 gmH:function(a){return this.WK.href},
 VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -17205,156 +17189,92 @@
 "^":"",
 Dh:{
 "^":"zp;N:target=,mH:href=",
-$isGv:true,
 "%":"SVGAElement"},
 Ue:{
 "^":"Eo;mH:href=",
-$isGv:true,
 "%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
 eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
 "%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
 "^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
 Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
 NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 j24:{
 "^":"d5;t5:type%,mH:href=",
-$isGv:true,
 "%":"SVGScriptElement"},
-Lu:{
+ki:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
@@ -17369,61 +17289,27 @@
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 $isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|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"},
 hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $ishy:true,
-$isGv:true,
 "%":"SVGSVGElement"},
-mq:{
+mHq:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
 "%":"SVGTextPathElement"},
 Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
 wD:{
 "^":"d5;mH:href=",
-$isGv:true,
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
 O7:{
 "^":"As;LO",
 lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
 d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 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},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
 else z=!0
 else z=!0
 if(z)return a
 else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+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($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
@@ -17487,12 +17373,10 @@
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
 return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
 giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
 Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
 $isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
@@ -17519,10 +17402,10 @@
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$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)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
@@ -17607,6 +17488,12 @@
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
 J:[function(a,b){var z
 if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -17624,17 +17511,166 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"a;",
+j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+j1:[function(a){var z,y,x
+if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+z=a-1
+if((a&z)===0){this.o2()
+return(this.Bo&z)>>>0}do{this.o2()
+y=this.Bo
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3: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)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*1037
+t=(v&4294967295)>>>0
+this.Bo=t
+s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Hz=s
+this.Bo=(t^u)>>>0
+this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
+if(this.Hz===0&&this.Bo===0)this.Bo=23063
+this.o2()
+this.o2()
+this.o2()
+this.o2()},
+static:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(0,z),y))},
+g:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.g()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.W()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+U:[function(a,b){var z,y
+z=this.x
+if(typeof z!=="number")return z.U()
+if(typeof b!=="number")return H.s(b)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
 y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -17692,26 +17728,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
 PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
 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]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-aH:{
+us:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
-LZ:{
+b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
 $isQV:true,
 $asQV:function(){return[J.GW]}},
 Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.GW]},
 $isyN:true,
@@ -17936,9 +17971,8 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
 $isQV:true,
 $asQV:function(){return[J.im]}},
 ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.im]},
 $isyN:true,
@@ -17959,12 +17993,12 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17978,29 +18012,29 @@
 C.OD.ZL(a)
 C.OD.G6(a)
 return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
 J.xW(b)
 z=a.fn
 a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
 A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18027,18 +18061,18 @@
 C.Gh.ZL(a)
 C.Gh.G6(a)
 return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:112;a-82",
 call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18053,14 +18087,14 @@
 C.MC.ZL(a)
 C.MC.G6(a)
 return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
 C.LT.ZL(a)
 C.LT.G6(a)
 return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
 static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.lh=!0
+a.qe=!1
+a.zg=!1
 a.Pe=!1
 a.SO=z
 a.B7=y
@@ -18094,13 +18147,16 @@
 C.Xo.ZL(a)
 C.Xo.G6(a)
 return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18114,37 +18170,154 @@
 C.Yu.ZL(a)
 C.Yu.G6(a)
 return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
 a.q3=y
 y.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.q3),"sortColumn",1)
 J.kW(J.wc(a.q3),"sortAscending",!1)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
 a.kg=z
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
 this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
 a.LY.Gl("number","Allocated Since GC (old)")
 a.LY.Gl("number","Total before GC (old)")
 a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
 a.bV.Gl("number","Total before GC")
 a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18289,44 +18459,51 @@
 C.Vc.G6(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ nx":[489],
+"+ nx":[501],
 jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ jm":[489],
+"+ jm":[501],
 ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ ke":[489],
+"+ ke":[501],
 xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18341,19 +18518,19 @@
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 wO:{
 "^":"Tp:115;",
@@ -18368,14 +18545,14 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
 w=this.UI.call$1(x)
 z.a=w
 if(w!=null)return w
@@ -18383,7 +18560,7 @@
 z.a=w
 this.bK.call$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
 "^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 xL:{
 "^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
 As:{
 "^":"a;",
 bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
 aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
 ez:[function(a,b){var z=this.lF()
 return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
 FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
 return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
 aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
 V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
 return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
 Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18592,7 +18772,7 @@
 C.cp.ZL(a)
 C.cp.G6(a)
 return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
 Js:{
 "^":"Tp:112;a-82",
 call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18621,20 +18801,20 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
 return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
 C.b9.ZL(a)
 C.b9.G6(a)
 return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+z=this.B1
+y=J.UQ(z,"threshold")
+x=this.wd
+w=J.U6(x)
+if(J.z8(w.gB(x),0))return
+for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
+r=J.FW(s.gAv(),v.gAv())
+if(typeof y!=="number")return H.s(y)
+if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
+w.h(x,X.SJ(z,t,s,this))}},"call$0","gz7",0,0,null],
 o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
 a.FT=this.ct(a,C.XU,a.FT,z)
 z=x.bu(0)
 a.vk=this.ct(a,C.Dj,a.vk,z)
+z=J.AG(J.UQ(a.pD,"depth"))
+a.M5=this.ct(a,C.bE,a.M5,z)
+w=J.UQ(a.pD,"period")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,z)
+z=J.AG(J.vX(a.XX,100))+"%"
+a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
+J.kW(a.pD,"threshold",a.XX)
 this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
 if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
 "@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.FT=""
 a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
 a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
 C.XH.ZL(a)
 C.XH.G6(a)
 return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
 $isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+static:{Zg:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18787,39 +19041,60 @@
 C.Qt.ZL(a)
 C.Qt.G6(a)
 return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
 yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
 gvc:[function(a){var z,y
 z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18835,13 +19110,13 @@
 C.Yt.ZL(a)
 C.Yt.G6(a)
 return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18856,14 +19131,15 @@
 C.Z3.ZL(a)
 C.Z3.G6(a)
 return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18876,8 +19152,8 @@
 C.MG.ZL(a)
 C.MG.G6(a)
 return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -18896,7 +19172,7 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
@@ -18906,19 +19182,19 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
 IE:[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
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
@@ -18939,10 +19215,8 @@
 qV:{
 "^":"a;oc>,P>",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
 return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:112;",
@@ -18985,22 +19259,22 @@
 A.Ok()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
+jh:{
 "^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
 tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19012,16 +19286,16 @@
 C.kD.ZL(a)
 C.kD.G6(a)
 return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
 aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
 C.SU.ZL(a)
 C.SU.G6(a)
 return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
 "@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19062,27 +19336,27 @@
 C.nn.ZL(a)
 C.nn.G6(a)
 return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
 Ty:[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.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
 wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19096,14 +19370,14 @@
 C.J7.ZL(a)
 C.J7.G6(a)
 return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19118,16 +19392,16 @@
 C.lx.ZL(a)
 C.lx.G6(a)
 return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19142,16 +19416,16 @@
 C.RR.ZL(a)
 C.RR.G6(a)
 return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19166,16 +19440,16 @@
 C.ct.ZL(a)
 C.ct.G6(a)
 return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19190,30 +19464,30 @@
 C.xE.ZL(a)
 C.xE.G6(a)
 return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
 z.pC()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
 z.pC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19227,17 +19501,17 @@
 C.k0.G6(a)
 C.k0.ZB(a)
 return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
 A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"formatSize"],
+at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19287,8 +19561,8 @@
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19306,16 +19580,16 @@
 x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 nq:[function(a,b){if(!this.gnz(a))return
 if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19330,7 +19604,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19381,22 +19655,21 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.BN(0)){if(w)y.push([u,t])
 v=!0}$.tW.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.iU()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
 $.Td=!1},"call$0","D6",0,0,null],
 Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -19418,14 +19691,14 @@
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
 return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -19498,10 +19771,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -19512,7 +19785,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -19562,7 +19835,7 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -19581,7 +19854,8 @@
 y=J.WB(z,J.q8(u.ok.G4))
 x=q.jr
 p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
 z=J.xH(q.dM,J.q8(q.ok.G4))
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -19602,11 +19876,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -19616,7 +19890,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,73,[],255,[]],
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
 d3:{
 "^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
 "^":"",
 xh:{
 "^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",368],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
@@ -19737,7 +19951,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -19765,10 +19979,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19791,7 +20015,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19808,7 +20032,7 @@
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
 if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
 x=c-b
 w=this.h3
@@ -19827,14 +20051,31 @@
 z=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+x=z.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(z,x+y)
+w=z.length
+H.qG(z,b+y,w,this,b)
+H.ed(z,b,c)
+this.nU(x,z.length)
+z=this.xg
+if(z!=null){w=z.iE
+z=w==null?z!=null:w!==z}else z=!1
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
 if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
-if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
 oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -19879,7 +20114,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
 qC:{
 "^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -19923,7 +20158,7 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -19933,7 +20168,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -19950,76 +20185,61 @@
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
+if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+if(!!z.$isqI)return J.de(a.oc,b)
+if(!!z.$isHA){z=J.x(b)
+if(!!z.$iswv)b=z.gfN(b)
+return J.de(a.G3,b)}return!1},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){z.PU(b,c)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
 a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
@@ -20042,7 +20262,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20059,7 +20279,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20102,7 +20322,7 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
 z=this.BK
 if(a>=z.length)return H.e(z,a)
 x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
 w.dB=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
 w.dB=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -20156,16 +20375,16 @@
 call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 Md:{
 "^":"Tp:115;",
@@ -20174,16 +20393,16 @@
 "^":"",
 Jk:[function(a){var z,y,x
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
 km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
 yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.x(y)
+if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -20246,36 +20462,34 @@
 w.send()
 w=w.responseText
 return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
 if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
 a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
 ZI:[function(a,b){var z,y
 if(a==null)return
@@ -20283,25 +20497,23 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20333,14 +20545,14 @@
 return d}if(c.tg(0,a))return d
 c.h(c,a)
 for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+v=J.x(w)
+if(!!v.$isQj)A.GA(w.import,w.href,c,d)
+else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
 d.push(u===""?b:u)
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -20392,12 +20604,11 @@
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();){l=z.gl()
 for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+if(!!J.x(k).$isV3){q=k.ns
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -20421,11 +20632,10 @@
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
 z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?z:M.Ky(z))
+else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
@@ -20452,17 +20662,15 @@
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
 v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},"call$0","gGy",0,0,null],
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -20490,14 +20698,14 @@
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
+x=y.gIf().fN
+w=J.rY(x)
+if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
+x=w.Nj(x,0,J.xH(w.gB(x),7))
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -20567,16 +20774,16 @@
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
 "^":"Tp:112;",
@@ -20587,8 +20794,8 @@
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
 "^":"Tp:115;",
@@ -20597,14 +20804,14 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
 $isEH:true},
 yL:{
-"^":"nd;",
+"^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
 x=null}else x=this.Tp(a,y)
 else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
@@ -20649,14 +20854,13 @@
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=z==null
 if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
 this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+if(!!J.x(d).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
@@ -20762,7 +20963,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -20786,7 +20987,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,583,378,[]],
+ea:[function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
 "^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
 $isEH:true},
 TV:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 Oa:{
 "^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -20866,26 +21064,26 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 Rs:{
 "^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+x=J.x(y)
+if(!x.$iszs)return
 w=this.c
 if(0>=w.length)return H.e(w,0)
 if(w[0]==="@"){v=this.d
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 uJ:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:112;",
@@ -20908,16 +21106,15 @@
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
 this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -20931,17 +21128,16 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
 $isEH:true},
 Fn:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
-jh:{
+Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
 W6:{
 "^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:112;a",
 call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
 PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
 o8:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 e9:{
 "^":"ve;",
@@ -21065,65 +21259,60 @@
 y.w5()
 x=y.o9()
 if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
 Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$2:[function(a,b){var z
+if(!J.x(a).$isz6){z=this.a.nF
+a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 uK:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$1:[function(a){var z
+if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
 try{J.UK(y,new K.Ed(this.a9))
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
 $.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
 "^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
 "^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21136,31 +21325,29 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
 x.push(w.gT8())
 z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
 v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
 if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.call$0()
 u=J.vF(z.a)}else{y.call$0()
 u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
 Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
 else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
-if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
 if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
 tI:[function(a){var z
@@ -21286,12 +21472,12 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
 G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21333,21 +21519,21 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(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.B8(y))
-return y},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
 Os:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21391,27 +21577,27 @@
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21424,21 +21610,20 @@
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+x=J.x(y)
+if(!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21458,7 +21643,7 @@
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x,w
+Qh:[function(a){var z,y,x
 z=this.KL
 y=$.e6().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
 this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
@@ -21491,20 +21672,19 @@
 return}y=this.KL
 x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
+tE:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
 x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
@@ -21553,13 +21732,12 @@
 call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
@@ -21581,11 +21759,11 @@
 call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
 $isfk:true},
 wL:{
 "^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -21600,33 +21778,33 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -21722,12 +21896,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -21771,10 +21943,10 @@
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
 BH:[function(a,b){var z,y,x,w,v
 for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
 z.toString
@@ -21782,25 +21954,21 @@
 z.toString
 a=new U.zX(a,w)}else break
 else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
 this.w5()
 v=this.o9()
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
 qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -21832,7 +22000,7 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
 Ai:[function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -21907,28 +22075,26 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
 yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
 Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -21945,7 +22111,7 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
@@ -21965,14 +22131,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
 hA:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22128,27 +22294,27 @@
 C.Cc.ZL(a)
 C.Cc.G6(a)
 return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
 gD5:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22164,17 +22330,17 @@
 C.c0.ZL(a)
 C.c0.G6(a)
 return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
@@ -22188,9 +22354,9 @@
 y=J.UQ(z.gu9(),J.f2(b))
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22205,16 +22371,16 @@
 C.cJ.ZL(a)
 C.cJ.G6(a)
 return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-qq:{
+l0:{
 "^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
 this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
 $isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
 "^":"",
 Er:[function(a){var z
 if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
 return z},"call$1","XI",2,0,null,190,[]],
 Io:[function(a){var z=J.rY(a)
 if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
 Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
 f3:[function(a,b,c){var z,y,x,w,v
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
 if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
 Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
 if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
 switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
 z.H4(b,c)
@@ -22252,31 +22419,29 @@
 z.$builtinTypeInfo=[null,null]
 z=new D.SI(z,b,null,null,null,null,null,null,null)
 z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
 G8:{
 "^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
 Jb:[function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"id")
 z.t(a,"type")
 if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
 z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
 fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.cI().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
@@ -22284,58 +22449,44 @@
 x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
 $asG8:function(){return[D.rj]},
 static:{"^":"RI"}},
 q1:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
 $isEH:true},
 jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.xN().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
 x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
 pl:[function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
 $asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
 Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
 $isEH:true},
 du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.Yk().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
 $asG8:function(){return[D.SI]},
 static:{"^":"Oi"}},
 xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.uG().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
 return y},"call$1","gUU",2,0,null,98,[]],
 $asG8:function(){return[D.SI]},
 static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
 bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
 gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
 z=D.SI
 y=J.O
 this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
 z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
 ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
 this.fq.toString
 z=$.cI().Ej
 y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
 z=$.uG().Ej
 if(y)H.vh(new P.AT(a))
 if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
 tM:[function(a,b){var z,y,x,w
 D.Ch(b,this.zf,this)
 this.nr=!1
@@ -22432,9 +22660,9 @@
 y=F.Wi(this,C.tP,this.cL,y)
 this.cL=y
 y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
 if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
 x=H.B7([],P.L5(null,null,null,null,null))
 J.kH(z.t(b,"timers"),new D.Qq(x))
 y=this.LE
@@ -22446,33 +22674,71 @@
 w.u(y,"dart",x.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,y)
+y=J.UQ(z.t(b,"heap"),"capacityNew")
+this.p2=F.Wi(this,C.So,this.p2,y)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[function(a,b){this.FF=0
+this.bj=a
+if(a==null)return
+if(J.u6(J.q8(a),3))return
+return this.AW(b)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.bj
+y=this.FF
+if(typeof y!=="number")return y.g()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
 $isbv:true},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
 call$1:[function(a){var z=this.a
 return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 Qq:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
 $isEH:true},
 Qd:{
 "^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
 gzf:function(){return this.Gt},
 VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
 l9:[function(a){var z=[]
 J.kH(this.i2,new D.i6(a,z))
 H.bQ(z,new D.r2(this))
 J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
 AQ:[function(a){var z,y,x,w
 z=this.i2
 y=J.U6(z)
@@ -22480,14 +22746,14 @@
 if(x!=null)return x
 w=P.L5(null,null,null,J.O,J.GW)
 w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
 x.nr=C.xB.nC("@Isolate","@")
 x.mQ=D.Io("@Isolate")
 x.DC(0)
 x.pC()
 y.u(z,a,x)
 x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
 Ze:[function(a){var z,y,x,w,v
 z=J.UQ(a,"id")
 y=this.i2
@@ -22496,21 +22762,21 @@
 if(w!=null){w.eC(a)
 return w}v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 w.H4(null,a)
 w.pC()
 x.u(y,z,w)
 w.xW(0)
 return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
 i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 r2:{
 "^":"Tp:112;c",
 call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
 $isEH:true},
 JB:{
 "^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
 w=J.U6(x)
 if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 u.H4(null,a)
 u.pC()
 N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
 w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
 $isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
 $isEH:true},
 BH:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
 FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
 aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
 u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
 nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 k0:[function(a){return},"call$0","gqw",0,0,114],
 ni:[function(a){this.RF.AP=null
 return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
 $isd3:true},
 pt:{
 "^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
 tM:[function(a,b){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,this.LD,z)
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
 aq:[function(a){var z,y,x,w,v
 if(this.nr)this.xW(0)
 z=J.U6(a)
@@ -22641,7 +22907,7 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
 W8:[function(a){var z,y,x,w,v
 this.nr=!0
 if(a==null)return
@@ -22653,7 +22919,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
 $isrj:true},
 dZL:{
 "^":"af+Pi;",
@@ -22662,50 +22928,56 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
 kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
 PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
 this.Du=0
 this.fF=0
@@ -22727,7 +22999,7 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
 eL:[function(a,b,c){var z,y
 this.jv=F.Wi(this,C.QK,this.jv,c)
 z=J.U6(a)
@@ -22739,8 +23011,8 @@
 if(y!=null)this.pd(y)
 z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
 y=this.Fm
 y=D.Lr(y.zf,y,z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
 x=z.t(b,"disassembly")
 if(x!=null)this.xs(x)
 z=this.va
 y=J.U6(z)
 this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
 xs:[function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
@@ -22774,7 +23049,7 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
 pd:[function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.yP
@@ -22785,117 +23060,49 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
 tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
 dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
 F3:[function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
 Ov:[function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
 UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
 call$2:[function(a,b){var z,y
 z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
 if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
 z6:[function(a,b){var z=this.Yu
 N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
 dT:{
 "^":"Tp:112;",
 call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
 return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
 z6:[function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
 J.X8(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
 case"Function":z=W.r3("function-view",null)
 J.dk(z,a.mC)
 return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
 case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
 case"IsolateList":z=W.r3("isolate-list",null)
 J.oq(z,a.mC)
 return z
@@ -22965,7 +23178,7 @@
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -22988,32 +23201,32 @@
 C.ZO.ZL(a)
 C.ZO.G6(a)
 return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23028,15 +23241,43 @@
 C.wU.ZL(a)
 C.wU.G6(a)
 return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
 "^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"change"],
+"@":function(){return[C.mS]},
+static:{Al:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.fA.ZL(a)
+C.fA.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23050,16 +23291,16 @@
 C.dX.ZL(a)
 C.dX.G6(a)
 return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23073,20 +23314,20 @@
 C.bg.ZL(a)
 C.bg.G6(a)
 return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -23094,7 +23335,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+if(!!z.$iscv)return M.F5(a,b)
+if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],285,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -23124,9 +23365,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23154,7 +23395,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23172,30 +23413,30 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.of(a,"expando$values")
 x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+w=J.x(a)
+if(!!w.$isMi)x=new M.ee(a,null,null)
+else if(!!w.$islp)x=new M.ug(a,null,null)
+else if(!!w.$isAE)x=new M.wl(a,null,null)
+else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
 return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
 "^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
 y=this.gN1()
 if(z){H.Go(y,"$isQl")
 y.toString
@@ -23221,29 +23460,29 @@
 z=d!=null?d:""
 x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v,u
+EC:[function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+y=J.x(z)
+if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
+if(!!J.x(x).$isSA){w=z.value
+v=x}else{w=null
+v=null}}else{w=null
+v=null}M.NP.prototype.EC.call(this,a)
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
 $isEH:true},
 fTP:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
 "^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
 J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
+x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
 z=J.O6(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 jz:{
 "^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
@@ -23347,14 +23585,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:112;",
@@ -23367,8 +23605,7 @@
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23382,7 +23619,7 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
@@ -23392,7 +23629,7 @@
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){var z,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+y=this.N1
+x=d!=null?d:""
+x=new M.SA(null,null,y,c,null,null,b,x)
+x.Og(y,b,c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
 Z1:[function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
@@ -23462,7 +23693,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23495,32 +23726,30 @@
 P.rb(z.gjM())}},"call$0","geB",0,0,null],
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(z)
+x=z.gdv()
+if(x==null){x=M.iX(y,b)
+z.sdv(x)}w=this.IT
+if(w==null){v=J.VN(this.N1)
+w=$.JM()
+u=w.t(0,v)
 if(u==null){u=v.implementation.createHTMLDocument("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+w.u(0,v,u)}this.IT=u
+w=u}t=M.Fz(y,w)
+M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+gnv:function(a){var z,y,x,w
 this.Sy()
 z=J.Vs(this.N1).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.N1)
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
 gjb:function(a){var z
 this.Sy()
 z=this.jH
@@ -23529,43 +23758,38 @@
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+w=J.RE(x)
+x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
+if(x){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
 v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
 v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
 u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
 if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+y=J.x(z)
+if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23580,38 +23804,37 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
 "^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gH:function(){var z=this.ud
+z.toString
+return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.ao(this.lr,this.ay,null)},
 cO:[function(a){var z=this.ud
 if(z==null)return
@@ -23620,7 +23843,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23632,7 +23855,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -23662,7 +23885,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23687,11 +23910,11 @@
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+y=J.x(a)
+if(!!y.$isList){this.xG=a
+x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
-x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
@@ -23709,7 +23932,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
 y=z.N1
-x=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
+w=J.RE(y)
+if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
 return}if(!this.U9){this.U9=!0
-if(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+if(x!=null){this.DO=x.CE(y)
+this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
+for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
+for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
 r=s.gNg()
 if(typeof r!=="number")return H.s(r)
-t-=r}for(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+t-=r}for(w=w.gA(a);w.G();){s=w.gl()
+for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
+n=v.Rz(0,o)
 if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
 m=q.gkU(n)
 l=q.gyT(n)
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
+k=o!=null?z.a5(o,x,m):null
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,650,254,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23783,20 +24004,20 @@
 this.pq=!0},"call$0","gJK",0,0,null]},
 VU:{
 "^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
 Z1:[function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+y=this.N1
+x=d!=null?d:""
+x=new M.NP(null,y,c,null,null,"value",x)
+x.Og(y,"value",c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
 ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
 this.qP=null
 this.ZY=null},"call$0","gJK",0,0,null],
 Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+z=J.x(this.ZY)
+z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
 y=this.ZY
 if(z){this.xS=y
 z=y}else{z=L.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
 VD:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
@@ -24001,9 +24220,9 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
-F.d3.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
+F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
 D.bv.$isaf=true
 D.bv.$isa=true
 D.c2.$isa=true
-D.Vi.$isVi=true
 D.Vi.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
 H.Uz.$isej=true
 H.Uz.$isej=true
 H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
 P.dl.$isdl=true
 P.dl.$isa=true
 V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
+J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lp=function(a,b){return J.RE(a).st5(a,b)}
 J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
+J.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.Mz=function(a){return J.rY(a).hc(a)}
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
+J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
 J.QP=function(a){return J.RE(a).gF1(a)}
-J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
 J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
 J.VN=function(a){return J.RE(a).gM0(a)}
+J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vq=function(a){return J.RE(a).xo(a)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
+J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
+return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
 J.ti=function(a,b){return J.RE(a).sQr(a,b)}
@@ -24308,8 +24543,10 @@
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+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.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
 C.J0=B.G6.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
 C.IU=new P.kF()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
 C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
 C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.IK=O.CN.prototype
 C.YD=F.Be.prototype
 C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
 C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.kQ])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
 C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
 C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
 C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
 C.cJ=U.fI.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
 C.dX=K.nm.prototype
 C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
 C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
 C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
 C.VJ=new H.GD("object")
+C.xG=new H.GD("objectPool")
+C.Le=new H.GD("oldHeapCapacity")
 C.ap=new H.GD("oldHeapUsed")
 C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
+C.bE=new H.GD("sampleDepth")
+C.kA=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
 C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
 C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
 C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
 C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
   }
 }())})
 I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?: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))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -24899,7 +25164,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -24910,7 +25175,7 @@
 I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -24918,7 +25183,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
 $desc=$collectedClasses.Ny
 if($desc instanceof Array)$desc=$desc[1]
 Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
 function Zv(){}Zv.builtin$cls="Zv"
 if(!"name" in Zv)Zv.name="Zv"
 $desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
 $desc=$collectedClasses.Fs
 if($desc instanceof Array)$desc=$desc[1]
 Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
 Fs.prototype.goc=function(receiver){return receiver.name}
 Fs.prototype.soc=function(receiver,v){return receiver.name=v}
 Fs.prototype.gLA=function(receiver){return receiver.src}
 Fs.prototype.gt5=function(receiver){return receiver.type}
 Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
 function Ty(){}Ty.builtin$cls="Ty"
 if(!"name" in Ty)Ty.name="Ty"
 $desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
 $desc=$collectedClasses.Uq
 if($desc instanceof Array)$desc=$desc[1]
 Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
 if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
 function Rt(){}Rt.builtin$cls="Rt"
 if(!"name" in Rt)Rt.name="Rt"
 $desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
 function wa(){}wa.builtin$cls="wa"
 if(!"name" in wa)wa.name="wa"
 $desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
 $desc=$collectedClasses.tX
 if($desc instanceof Array)$desc=$desc[1]
 tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
 tX.prototype.goc=function(receiver){return receiver.name}
 tX.prototype.soc=function(receiver,v){return receiver.name=v}
 tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
 function Sg(){}Sg.builtin$cls="Sg"
 if(!"name" in Sg)Sg.name="Sg"
 $desc=$collectedClasses.Sg
 if($desc instanceof Array)$desc=$desc[1]
 Sg.prototype=$desc
 Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
 function pA(){}pA.builtin$cls="pA"
 if(!"name" in pA)pA.name="pA"
 $desc=$collectedClasses.pA
 if($desc instanceof Array)$desc=$desc[1]
 pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
 pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
 function Mi(){}Mi.builtin$cls="Mi"
 if(!"name" in Mi)Mi.name="Mi"
 $desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
 Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
 Mi.prototype.st5=function(receiver,v){return receiver.type=v}
 Mi.prototype.gP=function(receiver){return receiver.value}
 Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
 function Gt(){}Gt.builtin$cls="Gt"
 if(!"name" in Gt)Gt.name="Gt"
 $desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
 In.prototype.goc=function(receiver){return receiver.name}
 In.prototype.soc=function(receiver,v){return receiver.name=v}
 In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
 if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
 function eP(){}eP.builtin$cls="eP"
 if(!"name" in eP)eP.name="eP"
 $desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
 if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
 G7.prototype=$desc
 G7.prototype.gRn=function(receiver){return receiver.data}
 G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
 G7.prototype.goc=function(receiver){return receiver.name}
 G7.prototype.soc=function(receiver,v){return receiver.name=v}
 G7.prototype.gt5=function(receiver){return receiver.type}
 G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
 function l9(){}l9.builtin$cls="l9"
 if(!"name" in l9)l9.name="l9"
 $desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
 Xp.prototype.gt5=function(receiver){return receiver.type}
 Xp.prototype.gP=function(receiver){return receiver.value}
 Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
 if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
 function mX(){}mX.builtin$cls="mX"
 if(!"name" in mX)mX.name="mX"
 $desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
 HD.prototype.soc=function(receiver,v){return receiver.name=v}
 HD.prototype.gP=function(receiver){return receiver.value}
 HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
 if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
 function jg(){}jg.builtin$cls="jg"
 if(!"name" in jg)jg.name="jg"
 $desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
 KR.prototype=$desc
 KR.prototype.gP=function(receiver){return receiver.value}
 KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
 if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
 function fs(){}fs.builtin$cls="fs"
 if(!"name" in fs)fs.name="fs"
 $desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
 lp.prototype.gt5=function(receiver){return receiver.type}
 lp.prototype.gP=function(receiver){return receiver.value}
 lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
 if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
 function I0(){}I0.builtin$cls="I0"
 if(!"name" in I0)I0.name="I0"
 $desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 G5.prototype=$desc
 G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
 if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
 function Lx(){}Lx.builtin$cls="Lx"
 if(!"name" in Lx)Lx.name="Lx"
 $desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
 AE.prototype.gt5=function(receiver){return receiver.type}
 AE.prototype.gP=function(receiver){return receiver.value}
 AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
 if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
 function FH(){}FH.builtin$cls="FH"
 if(!"name" in FH)FH.name="FH"
 $desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
 RH.prototype.gph=function(receiver){return receiver.label}
 RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
 if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
 function OJ(){}OJ.builtin$cls="OJ"
 if(!"name" in OJ)OJ.name="OJ"
 $desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
 $desc=$collectedClasses.dp
 if($desc instanceof Array)$desc=$desc[1]
 dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
 if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
 if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
 $desc=$collectedClasses.tZ
 if($desc instanceof Array)$desc=$desc[1]
 tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
 if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
 function AK(){}AK.builtin$cls="AK"
 if(!"name" in AK)AK.name="AK"
 $desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
 $desc=$collectedClasses.ty
 if($desc instanceof Array)$desc=$desc[1]
 ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
 if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
 function F2(){}F2.builtin$cls="F2"
 if(!"name" in F2)F2.name="F2"
 $desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
 $desc=$collectedClasses.y5
 if($desc instanceof Array)$desc=$desc[1]
 y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
 function jQ(){}jQ.builtin$cls="jQ"
 if(!"name" in jQ)jQ.name="jQ"
 $desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
 function lv(){}lv.builtin$cls="lv"
 if(!"name" in lv)lv.name="lv"
 $desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
 lv.prototype=$desc
 lv.prototype.gt5=function(receiver){return receiver.type}
 lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
 if($desc instanceof Array)$desc=$desc[1]
 pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
 function NV(){}NV.builtin$cls="NV"
 if(!"name" in NV)NV.name="NV"
 $desc=$collectedClasses.NV
 if($desc instanceof Array)$desc=$desc[1]
 NV.prototype=$desc
 NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
 function W1(){}W1.builtin$cls="W1"
 if(!"name" in W1)W1.name="W1"
 $desc=$collectedClasses.W1
 if($desc instanceof Array)$desc=$desc[1]
 W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
 function mCz(){}mCz.builtin$cls="mCz"
 if(!"name" in mCz)mCz.name="mCz"
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
 function kK(){}kK.builtin$cls="kK"
 if(!"name" in kK)kK.name="kK"
 $desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
 kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
 function NdT(){}NdT.builtin$cls="NdT"
 if(!"name" in NdT)NdT.name="NdT"
 $desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
 $desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
 Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
 if($desc instanceof Array)$desc=$desc[1]
 me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
 me.prototype.gmH=function(receiver){return receiver.href}
 function oB(){}oB.builtin$cls="oB"
 if(!"name" in oB)oB.name="oB"
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
 function NY(){}NY.builtin$cls="NY"
 if(!"name" in NY)NY.name="NY"
 $desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
 if($desc instanceof Array)$desc=$desc[1]
 EI.prototype=$desc
 EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
 function MI(){}MI.builtin$cls="MI"
 if(!"name" in MI)MI.name="MI"
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
 function rg(){}rg.builtin$cls="rg"
 if(!"name" in rg)rg.name="rg"
 $desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
 rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
 function eW(){}eW.builtin$cls="eW"
 if(!"name" in eW)eW.name="eW"
 $desc=$collectedClasses.eW
 if($desc instanceof Array)$desc=$desc[1]
 eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
 function kL(){}kL.builtin$cls="kL"
 if(!"name" in kL)kL.name="kL"
 $desc=$collectedClasses.kL
 if($desc instanceof Array)$desc=$desc[1]
 kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
 if($desc instanceof Array)$desc=$desc[1]
 Fu.prototype=$desc
 Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
 function QN(){}QN.builtin$cls="QN"
 if(!"name" in QN)QN.name="QN"
 $desc=$collectedClasses.QN
 if($desc instanceof Array)$desc=$desc[1]
 QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
 QN.prototype.gmH=function(receiver){return receiver.href}
 function N9(){}N9.builtin$cls="N9"
 if(!"name" in N9)N9.name="N9"
 $desc=$collectedClasses.N9
 if($desc instanceof Array)$desc=$desc[1]
 N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
 function BA(){}BA.builtin$cls="BA"
 if(!"name" in BA)BA.name="BA"
 $desc=$collectedClasses.BA
 if($desc instanceof Array)$desc=$desc[1]
 BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
 if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
 function zp(){}zp.builtin$cls="zp"
 if(!"name" in zp)zp.name="zp"
 $desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
 $desc=$collectedClasses.br
 if($desc instanceof Array)$desc=$desc[1]
 br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
 br.prototype.gmH=function(receiver){return receiver.href}
 function PIw(){}PIw.builtin$cls="PIw"
 if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
 if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
 function kN(){}kN.builtin$cls="kN"
 if(!"name" in kN)kN.name="kN"
 $desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
 $desc=$collectedClasses.Gr
 if($desc instanceof Array)$desc=$desc[1]
 Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
 Gr.prototype.gmH=function(receiver){return receiver.href}
 function XE(){}XE.builtin$cls="XE"
 if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
 function j24(){}j24.builtin$cls="j24"
 if(!"name" in j24)j24.name="j24"
 $desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
 $desc=$collectedClasses.rQ
 if($desc instanceof Array)$desc=$desc[1]
 rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
 if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
 function LR(){}LR.builtin$cls="LR"
 if(!"name" in LR)LR.name="LR"
 $desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
 $desc=$collectedClasses.hy
 if($desc instanceof Array)$desc=$desc[1]
 hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
 function mq(){}mq.builtin$cls="mq"
 if(!"name" in mq)mq.name="mq"
 $desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
 $desc=$collectedClasses.CG
 if($desc instanceof Array)$desc=$desc[1]
 CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
 if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
 function y0(){}y0.builtin$cls="y0"
 if(!"name" in y0)y0.name="y0"
 $desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
 function Dn(){}Dn.builtin$cls="Dn"
 if(!"name" in Dn)Dn.name="Dn"
 $desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
 $desc=$collectedClasses.pyk
 if($desc instanceof Array)$desc=$desc[1]
 pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
 pyk.prototype.gmH=function(receiver){return receiver.href}
 function ZD(){}ZD.builtin$cls="ZD"
 if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
 $desc=$collectedClasses.Ja
 if($desc instanceof Array)$desc=$desc[1]
 Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
 if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
 function hW(){}hW.builtin$cls="hW"
 if(!"name" in hW)hW.name="hW"
 $desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
 if($desc instanceof Array)$desc=$desc[1]
 xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
 if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
 function Et(){}Et.builtin$cls="Et"
 if(!"name" in Et)Et.name="Et"
 $desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
 $desc=$collectedClasses.Zn
 if($desc instanceof Array)$desc=$desc[1]
 Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
 if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
 function tG(){}tG.builtin$cls="tG"
 if(!"name" in tG)tG.name="tG"
 $desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
 $desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
 IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
 if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
 $desc=$collectedClasses.GW
 if($desc instanceof Array)$desc=$desc[1]
 GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
 if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
 function VP(){}VP.builtin$cls="VP"
 if(!"name" in VP)VP.name="VP"
 $desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
 f0.prototype.gi2=function(receiver){return this.i2}
 f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
-this.Qy=Qy
+this.um=um
 this.PX=PX
 this.RW=RW
 this.C9=C9
@@ -26901,11 +27326,11 @@
 $desc=$collectedClasses.Vg
 if($desc instanceof Array)$desc=$desc[1]
 Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
 if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
 function Z6(JE,Jz){this.JE=JE
 this.Jz=Jz}Z6.builtin$cls="Z6"
 if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 ku.prototype=$desc
 ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
 if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
 function xQ(){}xQ.builtin$cls="xQ"
 if(!"name" in xQ)xQ.name="xQ"
 $desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
 if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 Eq.prototype=$desc
 Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
 if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
 function tD(dw,Iq,is,p6){this.dw=dw
 this.Iq=Iq
 this.is=is
@@ -27405,8 +27830,7 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
 this.AP=AP
 this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
 function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27459,7 +27883,7 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -27476,15 +27900,15 @@
 $desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
 Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
 function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27524,11 +27948,11 @@
 Be.prototype.gXx.$reflectable=1
 Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
 Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
 function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
@@ -27560,11 +27984,11 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
 function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27677,21 +28101,21 @@
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
 if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
 function SU7(){}SU7.builtin$cls="SU7"
 if(!"name" in SU7)SU7.name="SU7"
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
 if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
 this.jE=jE
 this.Ay=Ay
 this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
 if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
 this.xq=xq}Sz.builtin$cls="Sz"
 if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
 $desc=$collectedClasses.aY
 if($desc instanceof Array)$desc=$desc[1]
 aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
 this.cP=cP
 this.Jl=Jl
 this.pU=pU
 this.Fh=Fh
 this.Xp=Xp
-this.aj=aj
+this.fb=fb
 this.rb=rb
 this.Zq=Zq
 this.rF=rF
@@ -28559,16 +28989,16 @@
 zG.prototype.gpU=function(){return this.pU}
 zG.prototype.gFh=function(){return this.Fh}
 zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
 zG.prototype.grb=function(){return this.rb}
 zG.prototype.gZq=function(){return this.Zq}
 zG.prototype.gJS=function(receiver){return this.JS}
 zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
 if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
 function dl(){}dl.builtin$cls="dl"
 if(!"name" in dl)dl.name="dl"
 $desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
 if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
 $desc=$collectedClasses.by
 if($desc instanceof Array)$desc=$desc[1]
 by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
 if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
 function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
 if(!"name" in Cf)Cf.name="Cf"
 $desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
 $desc=$collectedClasses.z0
 if($desc instanceof Array)$desc=$desc[1]
 z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
 if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
 function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
 $desc=$collectedClasses.I4
 if($desc instanceof Array)$desc=$desc[1]
 I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
 if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
 function RO(uv,Ph,Sg){this.uv=uv
 this.Ph=Ph
 this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
 if(!"name" in bO)bO.name="bO"
 $desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
 $desc=$collectedClasses.QS
 if($desc instanceof Array)$desc=$desc[1]
 QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
 function ej(){}ej.builtin$cls="ej"
 if(!"name" in ej)ej.name="ej"
 $desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
 $desc=$collectedClasses.Nx
 if($desc instanceof Array)$desc=$desc[1]
 Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
 if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
 function Dg(){}Dg.builtin$cls="Dg"
 if(!"name" in Dg)Dg.name="Dg"
 $desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
 function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
 this.Ab=Ab
 this.Ln=Ln
@@ -29904,11 +30369,11 @@
 rm.prototype.gy4.$reflectable=1
 rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
 rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
 function YW(a){this.a=a}YW.builtin$cls="YW"
 if(!"name" in YW)YW.name="YW"
 $desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -29971,11 +30441,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
 function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.Lk=Lk
@@ -29997,11 +30484,81 @@
 mk.prototype.gZ8.$reflectable=1
 mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
 function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
@@ -30068,11 +30625,11 @@
 jY.prototype.gX3.$reflectable=1
 jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
 jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
 $desc=$collectedClasses.xL
 if($desc instanceof Array)$desc=$desc[1]
 xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
 function As(){}As.builtin$cls="As"
 if(!"name" in As)As.name="As"
 $desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -30200,11 +30767,11 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
 if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
 function Js(a){this.a=a}Js.builtin$cls="Js"
 if(!"name" in Js)Js.name="Js"
 $desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
 function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
 this.Lk=Lk
@@ -30257,11 +30824,30 @@
 u7.prototype.gtf.$reflectable=1
 u7.prototype.stf=function(receiver,v){return receiver.tf=v}
 u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
 function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
@@ -30278,17 +30864,15 @@
 qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
 this.FT=FT
 this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
 this.qO=qO
 this.Hm=Hm
 this.AP=AP
@@ -30302,48 +30886,65 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
 if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30355,20 +30956,63 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
 if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
 if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
 function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
@@ -30395,11 +31039,11 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
 function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -30439,11 +31083,11 @@
 KL.prototype.gN7.$reflectable=1
 KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
 KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30497,12 +31141,12 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
 function tzK(){}tzK.builtin$cls="tzK"
 if(!"name" in tzK)tzK.name="tzK"
 $desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
 if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
 function oBi(){}oBi.builtin$cls="oBi"
 if(!"name" in oBi)oBi.name="oBi"
 $desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
 function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
 this.V4=V4
 this.AP=AP
@@ -30600,11 +31244,11 @@
 Qa.prototype.gV4.$reflectable=1
 Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
 Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
 function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.Hq=Hq
@@ -30636,11 +31280,11 @@
 Ww.prototype.gHq.$reflectable=1
 Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
 Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
 function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.Lk=Lk
@@ -30662,11 +31306,11 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
 function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.iy=iy
 this.AP=AP
@@ -30693,11 +31337,11 @@
 fl.prototype.giy.$reflectable=1
 fl.prototype.siy=function(receiver,v){return receiver.iy=v}
 fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
 function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
@@ -30724,11 +31368,11 @@
 Zt.prototype.gJo.$reflectable=1
 Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
 function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
@@ -30755,13 +31399,13 @@
 iL.prototype.gJo.$reflectable=1
 iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30782,15 +31426,15 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
 function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.Lk=Lk
 this.dZ=dZ
@@ -30891,11 +31535,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
 if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
 $desc=$collectedClasses.pM
 if($desc instanceof Array)$desc=$desc[1]
 pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
 if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
 function W6(){}W6.builtin$cls="W6"
 if(!"name" in W6)W6.name="W6"
 $desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
 $desc=$collectedClasses.Ed
 if($desc instanceof Array)$desc=$desc[1]
 Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
 if(!"name" in G1)G1.name="G1"
 $desc=$collectedClasses.G1
 if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
 iT.prototype=$desc
 iT.prototype.ghP=function(){return this.hP}
 iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
 this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
 if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
 function ey(d){this.d=d}ey.builtin$cls="ey"
 if(!"name" in ey)ey.name="ey"
 $desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
 $desc=$collectedClasses.J1
 if($desc instanceof Array)$desc=$desc[1]
 J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
 this.bm=bm}fk.builtin$cls="fk"
 if(!"name" in fk)fk.name="fk"
 $desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
 function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.Lk=Lk
@@ -31906,11 +32550,11 @@
 knI.prototype.gzw.$reflectable=1
 knI.prototype.szw=function(receiver,v){return receiver.zw=v}
 knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
 if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
 function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.HJ=HJ
 this.AP=AP
@@ -31937,25 +32581,25 @@
 fI.prototype.gHJ.$reflectable=1
 fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
 fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
 if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
 function G8(F1){this.F1=F1}G8.builtin$cls="G8"
 if(!"name" in G8)G8.name="G8"
 $desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
 G8.prototype=$desc
 G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
 if(!"name" in fJ)fJ.name="fJ"
 $desc=$collectedClasses.fJ
 if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
 $desc=$collectedClasses.q1
 if($desc instanceof Array)$desc=$desc[1]
 q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
 if(!"name" in jx)jx.name="jx"
 $desc=$collectedClasses.jx
 if($desc instanceof Array)$desc=$desc[1]
 jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
 function Cn(){}Cn.builtin$cls="Cn"
 if(!"name" in Cn)Cn.name="Cn"
 $desc=$collectedClasses.Cn
 if($desc instanceof Array)$desc=$desc[1]
 Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
 if(!"name" in du)du.name="du"
 $desc=$collectedClasses.du
 if($desc instanceof Array)$desc=$desc[1]
 du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
 if(!"name" in xc)xc.name="xc"
 $desc=$collectedClasses.xc
 if($desc instanceof Array)$desc=$desc[1]
 xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
 this.fq=fq
 this.ne=ne
 this.PH=PH
@@ -32006,7 +32674,12 @@
 this.LE=LE
 this.Cf=Cf
 this.W1=W1
+this.p2=p2
+this.Hw=Hw
 this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
 this.AP=AP
 this.Lk=Lk
 this.Fm=Fm
@@ -32028,16 +32701,20 @@
 bv.prototype.sGR=function(v){return this.f5=v}
 bv.prototype.gLE=function(){return this.LE}
 bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
 function D3(){}D3.builtin$cls="D3"
 if(!"name" in D3)D3.name="D3"
 $desc=$collectedClasses.D3
 if($desc instanceof Array)$desc=$desc[1]
 D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
 if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
 function Qq(a){this.a=a}Qq.builtin$cls="Qq"
 if(!"name" in Qq)Qq.name="Qq"
 $desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
 $desc=$collectedClasses.JB
 if($desc instanceof Array)$desc=$desc[1]
 JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
 function BH(a){this.a=a}BH.builtin$cls="BH"
 if(!"name" in BH)BH.name="BH"
 $desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
 Vi.prototype=$desc
 Vi.prototype.gtT=function(receiver){return this.tT}
 Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
 this.jv=jv
 this.Du=Du
 this.fF=fF
@@ -32208,6 +32896,7 @@
 this.yP=yP
 this.mM=mM
 this.qH=qH
+this.Ni=Ni
 this.MO=MO
 this.oc=oc
 this.zz=zz
@@ -32264,16 +32953,6 @@
 $desc=$collectedClasses.fx
 if($desc instanceof Array)$desc=$desc[1]
 fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
 function UZ(a,b,c){this.a=a
 this.b=b
 this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
 $desc=$collectedClasses.UZ
 if($desc instanceof Array)$desc=$desc[1]
 UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
 if(!"name" in XK)XK.name="XK"
 $desc=$collectedClasses.XK
 if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
 $desc=$collectedClasses.dT
 if($desc instanceof Array)$desc=$desc[1]
 dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
 this.yb=yb
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
 if(!"name" in ho)ho.name="ho"
 $desc=$collectedClasses.ho
 if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
 ob.prototype.gmC.$reflectable=1
 ob.prototype.smC=function(receiver,v){return receiver.mC=v}
 ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
 if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
 function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -32379,11 +33035,47 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
 function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.Lk=Lk
@@ -32405,11 +33097,11 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
 if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
 function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
 this.Lk=Lk
@@ -32431,11 +33123,11 @@
 Vu.prototype.gB3.$reflectable=1
 Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
 Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
 if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 7edc4c9..c0f9dc6 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -170,10 +170,11 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -226,44 +227,12 @@
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 
 </polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
-  <template>
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-danger">
-        <div class="panel-heading">{{ error.kind }}</div>
-        <div class="panel-body">
-          <p>{{ error.message }}</p>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
-  </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -306,9 +275,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -332,6 +309,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -339,28 +317,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
@@ -368,184 +352,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
-        </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <style>
-      .content {
-        padding-left: 10%;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      h1 {
-        font: 400 18px 'Montserrat', sans-serif;
-      }
-      .member, .memberHeader {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      .monospace {
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: nowrap;
-      }
-    </style>
-    <div class="content">
-      <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tbody><tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
-            <function-ref ref="{{code.function}}">
-            </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </tbody></table>
-    </div>
-    <hr>
-    <div class="content">
-      <template if="{{ code.hasDisassembly }}">
-        <div class="row">
-            <div class="col-md-2 memberHeader">Inclusive</div>
-            <div class="col-md-2 memberHeader">Exclusive</div>
-            <div class="col-md-2 memberHeader">Address</div>
-            <div class="col-md-6 memberHeader">Disassembly</div>
-        </div>
-      </template>
-      <template repeat="{{ instruction in code.instructions }}">
-        <div class="row">
-          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="col-md-6 monospace">{{ instruction.human }}</div>
-        </div>
-      </template>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay" class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
       .textbox {
@@ -626,7 +433,314 @@
 </polymer-element>
 
 
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+  <template if="{{ ref['final'] }}"> final </template>
+  <template if="{{ ref['const'] }}"> const </template>
+  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
+  var
+  </template>
+  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+  </template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+  <template>
+    <div class="well row">
+      <a on-click="toggleDisplay" class="btn muted unselectable">
+           Raw message... <i class="{{ iconClass }}"></i>
+      </a>
+      <div style="display: {{ displayValue }}" class="well">
+        <content></content>
+      </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+  <template>
+    <div class="row">
+    <div class="col-md-8 col-md-offset-2">
+      <div class="panel panel-danger">
+        <div class="panel-heading">{{ error.kind }}</div>
+        <div class="panel-body">
+          <p>{{ error.message }}</p>
+        </div>
+      </div>
+    </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -742,9 +856,26 @@
   </template>
   
 </polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
@@ -761,14 +892,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -811,6 +935,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
@@ -856,6 +981,158 @@
   </template>
   
 </polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -875,12 +1152,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -895,23 +1174,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tbody><tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template="" if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </tbody></table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -920,44 +1201,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
@@ -1004,6 +1291,28 @@
 </polymer-element>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1011,68 +1320,195 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template="" repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal=""></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
   </template>
   
 </polymer-element>
@@ -1084,38 +1520,81 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
+        </tr>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         </tr><tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </tbody></table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   
 </polymer-element>
@@ -1226,9 +1705,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -1240,15 +1727,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
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 8bf51c1..decdb06 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
@@ -8542,7 +8542,7 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
 (function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
 bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},"call$1","guH",2,0,null,132,[]],
 ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
 aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
 Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 $isList:true,
 $isList:true,
 $aszM:null,
@@ -8992,9 +8990,9 @@
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
 return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
 gbx:function(a){return C.O4},
 $isdouble:true,
 $isnum:true},
-vT:{
+x1:{
 "^":"im;"},
 VP:{
-"^":"vT;"},
+"^":"x1;"},
 BQ:{
 "^":"VP;"},
 O:{
@@ -9063,8 +9062,8 @@
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9075,7 +9074,7 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
 if(J.z8(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
 U:[function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
@@ -9126,15 +9117,15 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
 if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
 zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
 ox:[function(){var z=init.globalState.Xz
 z.GL=z.GL-1},"call$0","q4",0,0,null],
 oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
@@ -9208,7 +9205,7 @@
 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))
-else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -9294,21 +9291,21 @@
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
 "^":"Tp:115;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9356,18 +9353,18 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
 iK:[function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
 Hh:[function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
 MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
 Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
 vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
@@ -9388,11 +9385,11 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
 PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
 else this.UM()},"call$0","gi8",0,0,null],
 UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
 if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
-Iy:{
+dq:{
 "^":"a;",
 $isbC:true},
 Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
 zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
@@ -9483,11 +9480,9 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
@@ -9499,19 +9494,17 @@
 y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
 zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 NO:{
 "^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
@@ -9582,19 +9575,19 @@
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
 Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9606,7 +9599,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
 $isEH:true},
 Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9667,7 +9660,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9678,7 +9671,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9692,8 +9685,8 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
 n:[function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
 y=b.ng
 return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,31,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
-if(b!=null){z.a=0+b.length
+if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
 Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
@@ -9877,26 +9868,27 @@
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
 return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
 C.Nm.FV(r,b)
 y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
 if(a=="double")return C.yX
 if(a=="num")return C.oD
 if(a=="bool")return C.Fm
-if(a=="List")return C.l0
+if(a=="List")return C.E3
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"call$1","EN",2,0,null,6,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -9965,7 +9957,7 @@
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -10001,7 +9993,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -10026,7 +10018,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -10037,7 +10029,7 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
@@ -10049,33 +10041,33 @@
 x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
 ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
 KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
 return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
 return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
 uc:[function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10264,10 +10256,10 @@
 else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+else{z=J.x(b)
+if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10277,12 +10269,11 @@
 w=z.vM+w
 z.vM=w
 z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
 "^":"a;"},
 xQ:{
 "^":"a;"},
@@ -10294,8 +10285,8 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
@@ -10304,10 +10295,10 @@
 di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
 t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
 aN:[function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10331,14 +10322,13 @@
 "^":"a;lK,uk,xI,rq,FX,Nc",
 gWa:function(){var z,y,x
 z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+if(!!J.x(z).$iswv)return z
+y=$.bx().t(0,z)
+if(y!=null){x=y.split(":")
+if(0>=x.length)return H.e(x,0)
+z=x[0]}x=new H.GD(z)
+this.lK=x
+return x},
 glT:function(){return this.xI===1},
 ghB:function(){return this.xI===2},
 gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
 BX:[function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
 Fk:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
 KE:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
 e4:[function(a){var z,y,x,w,v,u,t
 z={}
 if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
 call$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a
@@ -10472,18 +10462,18 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
 call$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=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
@@ -10596,11 +10585,9 @@
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
 return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
@@ -10619,11 +10606,11 @@
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
 "^":"a;QW"},
-D2:{
+dN:{
 "^":"a;QW"},
-my:{
+GT:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
 "^":"a;"},
 tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
 return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+if(!!x.$isnr)z.void=true
+else if(!x.$ishJ)z.ret=y.za()
 y=this.Iq
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
@@ -10656,7 +10643,7 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
 hJ:{
-"^":"lb;",
+"^":"lbp;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
 $ishJ:true},
 tu:{
-"^":"lb;oc>",
+"^":"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},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
 za:[function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -10701,7 +10688,7 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
@@ -10720,10 +10707,8 @@
 this.ke=y
 return y},"call$0","gXo",0,0,null],
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
@@ -10733,11 +10718,11 @@
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
 call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
@@ -10758,16 +10743,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10778,13 +10763,13 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
 "^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
@@ -10839,11 +10824,11 @@
 $.NR=z
 return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
 Da:[function(){var z=this.Z6
 z.sec(this)
 z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
 this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
 "^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
 return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
 rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
 df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
 this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
 y=this.Pr()
@@ -10921,10 +10906,10 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -10934,28 +10919,19 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
 F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10990,13 +10967,13 @@
 C.J0.ZL(a)
 C.J0.G6(a)
 return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11011,13 +10988,14 @@
 C.YZ.ZL(a)
 C.YZ.G6(a)
 return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11031,13 +11009,13 @@
 C.kk.ZL(a)
 C.kk.G6(a)
 return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11052,20 +11030,20 @@
 C.IK.ZL(a)
 C.IK.G6(a)
 return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
 J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
 C.YD.ZL(a)
 C.YD.G6(a)
 return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -11104,7 +11082,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11119,29 +11097,29 @@
 C.j8.ZL(a)
 C.j8.G6(a)
 return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
 a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11158,7 +11136,7 @@
 C.O0.ZL(a)
 C.O0.G6(a)
 return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
 if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
 qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
+y=J.x(c)
+if(!y.$isyN)c=y.tt(c,!1)
 y=J.U6(c)
 x=y.gB(c)
 w=a.length
@@ -11220,9 +11199,13 @@
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
 H.qG(a,z,w,a,b)
-for(z=y.gA(c);z.G();b=u){v=z.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[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.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
@@ -11247,7 +11230,7 @@
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){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
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -11357,7 +11340,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
@@ -11414,7 +11397,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
@@ -11479,11 +11462,10 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
 gl:function(){return}},
 SU7:{
 "^":"a;",
 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"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -11579,13 +11564,11 @@
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
 X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
 else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
 if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
 x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
 $.tY[b]=x
-return x}u=H.pL(b)
+return x}u=H.mN(b)
 if(u==null){t=init.functionAliases[b]
 if(t!=null){x=new H.ng(b,null,a)
 x.CM=new H.Ar(init.metadata[t],null,null,null,x)
 $.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
 r=s["@"]
 if(r==null){q=null
 p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
 q=z.t(q,0)}else p=null
 if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
@@ -11657,15 +11638,13 @@
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
 z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
@@ -11686,8 +11665,8 @@
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+if(!!x.$isMs){z.a=y
+break}if(!!x.$isrN)break
 y=y.gXP()}if(b==null)return $.P8()
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
@@ -11696,8 +11675,7 @@
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
 return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
 return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
 if(w===-1)return C.xD;++w
 return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+z=J.x(b)
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -11724,7 +11702,7 @@
 if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
 jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -11776,23 +11754,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
 $isNL:true,
 $isej:true},
 cw:{
 "^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
 gOO:function(){return"LibraryMirror"},
 gUx:function(){return this.If},
 gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+gqh:function(){var z,y,x
 z=this.P8
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
@@ -11847,12 +11822,10 @@
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -11935,7 +11908,6 @@
 this.xO=z
 return z},
 gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isD4:true,
 $isej:true,
 $isNL:true},
@@ -11943,12 +11915,12 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
 "^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
 gJi:function(){return this},
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isMs:true,
 $isej:true,
 $isX9:true,
@@ -11990,7 +11961,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12007,7 +11978,7 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
 return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
 gUx:function(){return this.NK.gUx()},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isbl:true,
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:112;",
@@ -12173,15 +12141,13 @@
 Ax:{
 "^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
 else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
@@ -12211,7 +12177,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12227,7 +12193,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12276,9 +12242,7 @@
 else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
@@ -12310,12 +12274,12 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
 return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
@@ -12336,7 +12300,6 @@
 gw8:function(){return C.hU},
 gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
 return new H.cu(this.Cr,null)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isWf:true,
 $isMs:true,
 $isej:true,
@@ -12346,19 +12309,19 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-Ld:{
+XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
 gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12397,7 +12360,7 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
 return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
 v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+w=J.x(y)
+if(!!w.$isv){u=y.gjm()
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
@@ -12426,7 +12389,6 @@
 y.constructor[z]=s
 return s},
 bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isvr:true,
 $isej:true},
 Zk:{
@@ -12451,10 +12413,7 @@
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
 else{z=this.gXP()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12507,8 +12466,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+if(!!y.$iscw)return H.d(z.Nz)
+if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
 z.fixed$length=init
 return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+if(!!J.x(z).$isb8)return z
+return}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
 $.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
 dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
 b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
 TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
@@ -12761,7 +12720,7 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
 this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
@@ -12866,7 +12825,7 @@
 "^":"Tp;a",
 call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
 b8:{
 "^":"a;",
 $isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[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.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
 E6:[function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12937,26 +12904,26 @@
 z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
 R8:[function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
 P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
 OH:[function(a){var z
 if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
 if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
-z.e=q
-y=q
-continue}else P.A9(q,b)
-else P.k3(q,b)
-return}}if(x.b===!0){p=b.L3()
-b.Am(x.c)}else{p=b.L3()
+y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){r=x.c
+if(!!J.x(r).$isvs)if(r.Gv>=4){b.swG(!0)
+z.e=r
+y=r
+continue}else P.A9(r,b)
+else P.k3(r,b)
+return}}if(x.b===!0){q=b.L3()
+b.Am(x.c)}else{q=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
 da:{
 "^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
 call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
@@ -13040,7 +13004,7 @@
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
 call$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)
@@ -13100,33 +13064,29 @@
 u=this.b
 if(v)u.c=this.c.e.gcG()
 else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
 "^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
 z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+if(!J.x(z.a).$isvs){y=P.Dt(null)
+z.a=y
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
@@ -13280,7 +13240,7 @@
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
@@ -13293,7 +13253,7 @@
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
@@ -13320,13 +13280,11 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
@@ -13338,18 +13296,18 @@
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
 Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
 Vo:{
 "^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 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},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13492,7 +13450,7 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
 CR:{
 "^":"Tp:115;a,b",
 call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
 call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
 GU:{
@@ -13543,8 +13501,8 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
 vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
 nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -13579,7 +13537,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13591,26 +13549,26 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
 tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
 zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
 hk:function(a,b){return this.E2.call$2(a,b)},
 Gr:function(a){return this.cP.call$1(a)},
 FI:function(a,b){return this.Jl.call$2(a,b)},
 mg:function(a,b,c){return this.pU.call$3(a,b,c)},
 Al:function(a){return this.Fh.call$1(a)},
 cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
 wr:function(a){return this.rb.call$1(a)},
 RK:function(a,b){return this.rb.call$2(a,b)},
 uN:function(a,b){return this.Zq.call$2(a,b)},
 Ch:function(a,b){return this.JS.call$1(b)},
 iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -13643,8 +13601,8 @@
 return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
 return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
 return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
 TF:{
 "^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
 call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
@@ -13724,7 +13682,7 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
 mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
 $isEH:true},
 eM:{
 "^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
-W5:{
+nU:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
 Al:function(a){return this.gFh().call$1(a)},
 gXp:function(){return P.zi()},
 cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
 grb:function(){return P.G2()},
 wr:function(a){return this.grb().call$1(a)},
 RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
 mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -13893,7 +13849,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -13920,7 +13876,7 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
@@ -13930,7 +13886,7 @@
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13951,71 +13907,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP: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:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14058,8 +14014,8 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
 FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14102,7 +14058,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -14115,17 +14071,17 @@
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14143,13 +14099,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14159,15 +14115,15 @@
 return z},"call$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -14249,7 +14205,7 @@
 this.DM=null
 return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14300,18 +14256,19 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14381,7 +14338,7 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14426,13 +14383,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14451,7 +14409,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14484,11 +14443,11 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
 return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
 $isQV:true,
 $asQV:null},
@@ -14523,13 +14482,13 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
 this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
 this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
 y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
 return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+UZ:[function(a,b,c){var z
+this.pZ(a,b,c)
+z=c-b
+this.YW(a,b,J.xH(this.gB(a),z),a,c)
+this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
 return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){var z,y
+if(b>=0){z=this.gB(a)
+if(typeof z!=="number")return H.s(z)
+z=b>z}else z=!0
+if(z)throw H.b(P.TE(b,0,this.gB(a)))
+z=J.x(c)
+if(!!z.$isyN)c=z.br(c)
+y=J.q8(c)
+this.sB(a,J.WB(this.gB(a),y))
+if(typeof y!=="number")return H.s(y)
+this.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){var z,y
+z=J.x(c)
+if(!!z.$isList){z=z.gB(c)
+if(typeof z!=="number")return H.s(z)
+this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -14662,14 +14639,14 @@
 $isQV:true,
 $asQV:null},
 ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$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)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+y=J.mQ(J.xH(y,1),this.v5.length-1)
+if(y>=z.length)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -14702,21 +14678,23 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+z=J.x(b)
+if(!!z.$isList){y=z.gB(b)
+x=this.gB(this)
+if(typeof y!=="number")return H.s(y)
+z=x+y
 w=this.v5
 v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -14724,15 +14702,16 @@
 this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=this.eZ+z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+H.qG(t,x,z,b,0)
+this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
+if(typeof z!=="number")return H.s(z)
+s=v-z
+if(y<s){H.qG(w,z,z+y,b,0)
+this.eZ=J.WB(this.eZ,y)}else{r=y-s
+H.qG(w,z,z+s,b,0)
+z=this.v5
+H.qG(z,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
@@ -14747,38 +14726,33 @@
 this.av=0
 this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
 z=this.v5
 y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
 z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
 this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+z=this.v5.length-1
+if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
+if(u<0||u>=w)return H.e(x,u)
+t=x[u]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+this.av=(y+1&z)>>>0
+return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
+this.eZ=y
+for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
+if(s<0||s>=w)return H.e(x,s)
+t=x[s]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+return a}},"call$1","gzv",2,0,null,456,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14793,25 +14767,29 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
 z=this.av
 y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
+if(typeof y!=="number")return H.s(y)
+if(z<=y){x=y-z
+z=this.v5
+y=this.av
+H.qG(a,0,x,z,y)
+return x}else{y=this.v5
+w=y.length-z
+H.qG(a,0,w,y,z)
 z=this.eZ
+if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
 Ba:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
 V1:[function(a){this.aY=null
 this.P6=0
 this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
 An:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14976,7 +14954,7 @@
 return this.Wb(z)},
 p0:[function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
 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)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
 tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
 "^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -15073,12 +15051,12 @@
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
 Cf:{
@@ -15121,7 +15099,7 @@
 this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
 WD:[function(a){var z=this.qi
 if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
 rl:[function(a){var z,y,x,w,v
 if(!this.IS(a)){x=a
 w=this.qi
@@ -15144,7 +15122,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
 z=this.Vy
 z.KF("[")
 if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
 z.vM=z.vM+","
 this.rl(y.t(a,x));++x}}z.KF("]")
 this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
 w=this.Vy
 w.KF("{")
 z.a=!0
@@ -15163,13 +15141,13 @@
 w.KF("}")
 this.qi.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
 new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15178,13 +15156,13 @@
 x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:[function(a){var z,y,x
 z=J.U6(a)
@@ -15193,7 +15171,7 @@
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
 fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
 static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
 Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
 FM:function(a){return new P.HG(a)},
 ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
 NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15336,10 +15314,8 @@
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isiP)return!1
 return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
 iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(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).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15405,32 +15381,30 @@
 return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1","wI",2,0,null,198,[]]}},
 MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
 g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
 return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
 $isa6:true,
 static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
 return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
@@ -15549,7 +15523,7 @@
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15622,7 +15596,7 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
 V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
 Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
 uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15673,12 +15647,12 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15692,8 +15666,8 @@
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)return!1
+z=J.x(b)
+if(!z.$isiD)return!1
 if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
 z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
@@ -15708,7 +15682,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){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,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",hK:[function(a1){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,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -15875,18 +15849,18 @@
 if(q&&!p)z.call$1("expected a part after last `:`")
 if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 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.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
 y.vM=y.vM+u
 z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
 hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$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.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:112;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15938,44 +15912,44 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
 else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
 "^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
 $isEH:true},
 Mx:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
 "^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
 $isEH:true},
 kZ:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$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)
@@ -16023,18 +15997,18 @@
 "^":"Tp:112;c",
 call$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)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
 r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
 It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
 return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
 wi:[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(new P.AT(d))
@@ -16118,7 +16088,7 @@
 return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -16130,12 +16100,10 @@
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAnchorElement"},
 Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
 Fy:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
-$isGv:true,
 "%":"Comment;CharacterData"},
 Yr:{
 "^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16199,10 +16180,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 "%":";DocumentFragment"},
 cm:{
 "^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
 aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
 gLm:function(a){return C.i3.f0(a)},
 ZL:function(a){},
 $iscv:true,
-$isGv:true,
 $isD0:true,
 "%":";Element"},
 Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16293,14 +16282,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16309,9 +16298,9 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
 zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 In:{
 "^":"qE;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
+pL:{
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -16400,16 +16388,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
 "%":"MIDIOutput"},
-ab:{
+tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 $isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
@@ -16423,15 +16412,11 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
 if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,332,[],333,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
 $isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16475,7 +16465,7 @@
 "^":"qE;t5:type%",
 "%":"HTMLOListElement"},
 G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
-ew:{
+kQ:{
 "^":"ea;",
-$isew:true,
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
 j2:{
 "^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -16548,7 +16538,7 @@
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
 "^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
 "%":"StorageEvent"},
 Lx:{
@@ -16579,7 +16569,7 @@
 r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-xV:{
+R0:{
 "^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
@@ -16592,9 +16582,12 @@
 Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
@@ -16619,41 +16612,35 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 $isu9:true,
-$isGv:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16666,14 +16653,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.yg]},
 $isyN:true,
@@ -16681,19 +16668,19 @@
 $asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
-LO:{
+LOx:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.uj]},
 $isyN:true,
@@ -16703,12 +16690,12 @@
 "%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
 To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
 V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -16760,8 +16742,8 @@
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
 return z}}},
 B1:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -16813,11 +16794,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
 $isEH:true},
 bU:{
 "^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+FV:[function(a,b){var z,y,x,w
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+y=this.NL
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+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)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
@@ -16869,15 +16853,16 @@
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
 GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
 $asar:function(){return[W.KV]},
 $aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
 $asQV:function(){return[W.KV]}},
 Ou:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
 V1:[function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
 OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
 xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
@@ -17002,27 +16986,27 @@
 return z}}},
 FK:{
 "^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
 "^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17032,35 +17016,35 @@
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 $isqh:true},
 ie:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Ea:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 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.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17068,16 +17052,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 $isqh:true},
 i2:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 b0:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
 return},"call$0","gZS",0,0,null],
 Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
@@ -17116,19 +17100,21 @@
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -17143,17 +17129,17 @@
 V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){J.wg(this.xa,b)},
 GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
 call$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)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
-$isGv:true,
 static:{P1:[function(a){if(a===window)return a
 else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
@@ -17195,8 +17180,7 @@
 gmH:function(a){return this.WK.href},
 VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -17205,156 +17189,92 @@
 "^":"",
 Dh:{
 "^":"zp;N:target=,mH:href=",
-$isGv:true,
 "%":"SVGAElement"},
 Ue:{
 "^":"Eo;mH:href=",
-$isGv:true,
 "%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
 eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
 "%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
 "^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
 Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
 NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 j24:{
 "^":"d5;t5:type%,mH:href=",
-$isGv:true,
 "%":"SVGScriptElement"},
-Lu:{
+ki:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
@@ -17369,61 +17289,27 @@
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 $isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|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"},
 hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $ishy:true,
-$isGv:true,
 "%":"SVGSVGElement"},
-mq:{
+mHq:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
 "%":"SVGTextPathElement"},
 Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
 wD:{
 "^":"d5;mH:href=",
-$isGv:true,
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
 O7:{
 "^":"As;LO",
 lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
 d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 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},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
 else z=!0
 else z=!0
 if(z)return a
 else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+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($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
@@ -17487,12 +17373,10 @@
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
 return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
 giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
 Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
 $isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
@@ -17519,10 +17402,10 @@
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$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)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
@@ -17607,6 +17488,12 @@
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
 J:[function(a,b){var z
 if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -17624,17 +17511,166 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"a;",
+j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+j1:[function(a){var z,y,x
+if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+z=a-1
+if((a&z)===0){this.o2()
+return(this.Bo&z)>>>0}do{this.o2()
+y=this.Bo
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3: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)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*1037
+t=(v&4294967295)>>>0
+this.Bo=t
+s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Hz=s
+this.Bo=(t^u)>>>0
+this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
+if(this.Hz===0&&this.Bo===0)this.Bo=23063
+this.o2()
+this.o2()
+this.o2()
+this.o2()},
+static:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(0,z),y))},
+g:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.g()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.W()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+U:[function(a,b){var z,y
+z=this.x
+if(typeof z!=="number")return z.U()
+if(typeof b!=="number")return H.s(b)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
 y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -17692,26 +17728,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
 PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
 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]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-aH:{
+us:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
-LZ:{
+b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
 $isQV:true,
 $asQV:function(){return[J.GW]}},
 Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.GW]},
 $isyN:true,
@@ -17936,9 +17971,8 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+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)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
 $isQV:true,
 $asQV:function(){return[J.im]}},
 ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.im]},
 $isyN:true,
@@ -17959,12 +17993,12 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17978,29 +18012,29 @@
 C.OD.ZL(a)
 C.OD.G6(a)
 return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
 J.xW(b)
 z=a.fn
 a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
 A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18027,18 +18061,18 @@
 C.Gh.ZL(a)
 C.Gh.G6(a)
 return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:112;a-82",
 call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18053,14 +18087,14 @@
 C.MC.ZL(a)
 C.MC.G6(a)
 return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
 C.LT.ZL(a)
 C.LT.G6(a)
 return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
 static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.lh=!0
+a.qe=!1
+a.zg=!1
 a.Pe=!1
 a.SO=z
 a.B7=y
@@ -18094,13 +18147,16 @@
 C.Xo.ZL(a)
 C.Xo.G6(a)
 return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18114,37 +18170,154 @@
 C.Yu.ZL(a)
 C.Yu.G6(a)
 return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
 a.q3=y
 y.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.q3),"sortColumn",1)
 J.kW(J.wc(a.q3),"sortAscending",!1)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
 a.kg=z
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
 this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
 a.LY.Gl("number","Allocated Since GC (old)")
 a.LY.Gl("number","Total before GC (old)")
 a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
 a.bV.Gl("number","Total before GC")
 a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18289,44 +18459,51 @@
 C.Vc.G6(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ nx":[489],
+"+ nx":[501],
 jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ jm":[489],
+"+ jm":[501],
 ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ ke":[489],
+"+ ke":[501],
 xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18341,19 +18518,19 @@
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 wO:{
 "^":"Tp:115;",
@@ -18368,14 +18545,14 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
 w=this.UI.call$1(x)
 z.a=w
 if(w!=null)return w
@@ -18383,7 +18560,7 @@
 z.a=w
 this.bK.call$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
 "^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 xL:{
 "^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
 As:{
 "^":"a;",
 bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
 aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
 ez:[function(a,b){var z=this.lF()
 return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
 FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
 return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
 aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
 V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
 return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
 Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18592,7 +18772,7 @@
 C.cp.ZL(a)
 C.cp.G6(a)
 return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
 Js:{
 "^":"Tp:112;a-82",
 call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18621,20 +18801,20 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
 return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
 C.b9.ZL(a)
 C.b9.G6(a)
 return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+z=this.B1
+y=J.UQ(z,"threshold")
+x=this.wd
+w=J.U6(x)
+if(J.z8(w.gB(x),0))return
+for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
+r=J.FW(s.gAv(),v.gAv())
+if(typeof y!=="number")return H.s(y)
+if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
+w.h(x,X.SJ(z,t,s,this))}},"call$0","gz7",0,0,null],
 o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
 a.FT=this.ct(a,C.XU,a.FT,z)
 z=x.bu(0)
 a.vk=this.ct(a,C.Dj,a.vk,z)
+z=J.AG(J.UQ(a.pD,"depth"))
+a.M5=this.ct(a,C.bE,a.M5,z)
+w=J.UQ(a.pD,"period")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,z)
+z=J.AG(J.vX(a.XX,100))+"%"
+a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
+J.kW(a.pD,"threshold",a.XX)
 this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
 if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
 "@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.FT=""
 a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
 a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
 C.XH.ZL(a)
 C.XH.G6(a)
 return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
 $isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+static:{Zg:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18787,39 +19041,60 @@
 C.Qt.ZL(a)
 C.Qt.G6(a)
 return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
 yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
 gvc:[function(a){var z,y
 z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18835,13 +19110,13 @@
 C.Yt.ZL(a)
 C.Yt.G6(a)
 return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18856,14 +19131,15 @@
 C.Z3.ZL(a)
 C.Z3.G6(a)
 return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18876,8 +19152,8 @@
 C.MG.ZL(a)
 C.MG.G6(a)
 return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -18896,7 +19172,7 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
@@ -18906,19 +19182,19 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
 IE:[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
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
@@ -18939,10 +19215,8 @@
 qV:{
 "^":"a;oc>,P>",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
 return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:112;",
@@ -18985,22 +19259,22 @@
 A.Ok()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
+jh:{
 "^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
 tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19012,16 +19286,16 @@
 C.kD.ZL(a)
 C.kD.G6(a)
 return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
 aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
 C.SU.ZL(a)
 C.SU.G6(a)
 return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
 "@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19062,27 +19336,27 @@
 C.nn.ZL(a)
 C.nn.G6(a)
 return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
 Ty:[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.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
 wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19096,14 +19370,14 @@
 C.J7.ZL(a)
 C.J7.G6(a)
 return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19118,16 +19392,16 @@
 C.lx.ZL(a)
 C.lx.G6(a)
 return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19142,16 +19416,16 @@
 C.RR.ZL(a)
 C.RR.G6(a)
 return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19166,16 +19440,16 @@
 C.ct.ZL(a)
 C.ct.G6(a)
 return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19190,30 +19464,30 @@
 C.xE.ZL(a)
 C.xE.G6(a)
 return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
 z.pC()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
 z.pC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19227,17 +19501,17 @@
 C.k0.G6(a)
 C.k0.ZB(a)
 return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
 A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"formatSize"],
+at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19287,8 +19561,8 @@
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19306,16 +19580,16 @@
 x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 nq:[function(a,b){if(!this.gnz(a))return
 if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19330,7 +19604,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19381,22 +19655,21 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.BN(0)){if(w)y.push([u,t])
 v=!0}$.tW.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.iU()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
 $.Td=!1},"call$0","D6",0,0,null],
 Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -19418,14 +19691,14 @@
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
 return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -19498,10 +19771,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -19512,7 +19785,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -19562,7 +19835,7 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -19581,7 +19854,8 @@
 y=J.WB(z,J.q8(u.ok.G4))
 x=q.jr
 p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
 z=J.xH(q.dM,J.q8(q.ok.G4))
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -19602,11 +19876,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -19616,7 +19890,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,73,[],255,[]],
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
 d3:{
 "^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
 "^":"",
 xh:{
 "^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",368],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
@@ -19737,7 +19951,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -19765,10 +19979,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19791,7 +20015,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19808,7 +20032,7 @@
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
 if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
 x=c-b
 w=this.h3
@@ -19827,14 +20051,31 @@
 z=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+x=z.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(z,x+y)
+w=z.length
+H.qG(z,b+y,w,this,b)
+H.ed(z,b,c)
+this.nU(x,z.length)
+z=this.xg
+if(z!=null){w=z.iE
+z=w==null?z!=null:w!==z}else z=!1
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
 if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
-if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
 oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -19879,7 +20114,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
 qC:{
 "^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -19923,7 +20158,7 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -19933,7 +20168,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -19950,76 +20185,61 @@
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
+if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+if(!!z.$isqI)return J.de(a.oc,b)
+if(!!z.$isHA){z=J.x(b)
+if(!!z.$iswv)b=z.gfN(b)
+return J.de(a.G3,b)}return!1},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){z.PU(b,c)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
 a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
@@ -20042,7 +20262,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20059,7 +20279,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20102,7 +20322,7 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
 z=this.BK
 if(a>=z.length)return H.e(z,a)
 x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
 w.dB=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
 w.dB=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -20156,16 +20375,16 @@
 call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 Md:{
 "^":"Tp:115;",
@@ -20174,16 +20393,16 @@
 "^":"",
 Jk:[function(a){var z,y,x
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
 km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
 yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.x(y)
+if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -20246,36 +20462,34 @@
 w.send()
 w=w.responseText
 return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
 if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
 a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
 ZI:[function(a,b){var z,y
 if(a==null)return
@@ -20283,25 +20497,23 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20333,14 +20545,14 @@
 return d}if(c.tg(0,a))return d
 c.h(c,a)
 for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+v=J.x(w)
+if(!!v.$isQj)A.GA(w.import,w.href,c,d)
+else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
 d.push(u===""?b:u)
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -20392,12 +20604,11 @@
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();){l=z.gl()
 for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+if(!!J.x(k).$isV3){q=k.ns
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -20421,11 +20632,10 @@
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
 z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?z:M.Ky(z))
+else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
@@ -20452,17 +20662,15 @@
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
 v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},"call$0","gGy",0,0,null],
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -20490,14 +20698,14 @@
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
+x=y.gIf().fN
+w=J.rY(x)
+if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
+x=w.Nj(x,0,J.xH(w.gB(x),7))
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -20567,16 +20774,16 @@
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
 "^":"Tp:112;",
@@ -20587,8 +20794,8 @@
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
 "^":"Tp:115;",
@@ -20597,14 +20804,14 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
 $isEH:true},
 yL:{
-"^":"nd;",
+"^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
 x=null}else x=this.Tp(a,y)
 else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
@@ -20649,14 +20854,13 @@
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=z==null
 if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
 this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+if(!!J.x(d).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
@@ -20762,7 +20963,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -20786,7 +20987,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,583,378,[]],
+ea:[function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
 "^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
 $isEH:true},
 TV:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 Oa:{
 "^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -20866,26 +21064,26 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 Rs:{
 "^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+x=J.x(y)
+if(!x.$iszs)return
 w=this.c
 if(0>=w.length)return H.e(w,0)
 if(w[0]==="@"){v=this.d
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 uJ:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:112;",
@@ -20908,16 +21106,15 @@
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
 this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -20931,17 +21128,16 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
 $isEH:true},
 Fn:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
-jh:{
+Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
 W6:{
 "^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:112;a",
 call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
 PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
 o8:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 e9:{
 "^":"ve;",
@@ -21065,65 +21259,60 @@
 y.w5()
 x=y.o9()
 if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
 Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$2:[function(a,b){var z
+if(!J.x(a).$isz6){z=this.a.nF
+a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 uK:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$1:[function(a){var z
+if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
 try{J.UK(y,new K.Ed(this.a9))
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
 $.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
 "^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
 "^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21136,31 +21325,29 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
 x.push(w.gT8())
 z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
 v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
 if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.call$0()
 u=J.vF(z.a)}else{y.call$0()
 u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
 Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
 else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
-if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
 if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
 tI:[function(a){var z
@@ -21286,12 +21472,12 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
 G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21333,21 +21519,21 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(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.B8(y))
-return y},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
 Os:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21391,27 +21577,27 @@
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21424,21 +21610,20 @@
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+x=J.x(y)
+if(!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21458,7 +21643,7 @@
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x,w
+Qh:[function(a){var z,y,x
 z=this.KL
 y=$.e6().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
 this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
@@ -21491,20 +21672,19 @@
 return}y=this.KL
 x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
+tE:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
 x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
@@ -21553,13 +21732,12 @@
 call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
@@ -21581,11 +21759,11 @@
 call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
 $isfk:true},
 wL:{
 "^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -21600,33 +21778,33 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -21722,12 +21896,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -21771,10 +21943,10 @@
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
 BH:[function(a,b){var z,y,x,w,v
 for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
 z.toString
@@ -21782,25 +21954,21 @@
 z.toString
 a=new U.zX(a,w)}else break
 else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
 this.w5()
 v=this.o9()
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
 qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -21832,7 +22000,7 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
 Ai:[function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -21907,28 +22075,26 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
 yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
 Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -21945,7 +22111,7 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
@@ -21965,14 +22131,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
 hA:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22128,27 +22294,27 @@
 C.Cc.ZL(a)
 C.Cc.G6(a)
 return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
 gD5:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22164,17 +22330,17 @@
 C.c0.ZL(a)
 C.c0.G6(a)
 return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
@@ -22188,9 +22354,9 @@
 y=J.UQ(z.gu9(),J.f2(b))
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22205,16 +22371,16 @@
 C.cJ.ZL(a)
 C.cJ.G6(a)
 return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-qq:{
+l0:{
 "^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
 this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
 $isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
 "^":"",
 Er:[function(a){var z
 if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
 return z},"call$1","XI",2,0,null,190,[]],
 Io:[function(a){var z=J.rY(a)
 if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
 Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
 f3:[function(a,b,c){var z,y,x,w,v
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
 if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
 Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
 if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
 switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
 z.H4(b,c)
@@ -22252,31 +22419,29 @@
 z.$builtinTypeInfo=[null,null]
 z=new D.SI(z,b,null,null,null,null,null,null,null)
 z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
 G8:{
 "^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
 Jb:[function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"id")
 z.t(a,"type")
 if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
 z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
 fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.cI().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
@@ -22284,58 +22449,44 @@
 x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
 $asG8:function(){return[D.rj]},
 static:{"^":"RI"}},
 q1:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
 $isEH:true},
 jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.xN().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
 x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
 pl:[function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
 $asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
 Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
 $isEH:true},
 du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.Yk().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
 $asG8:function(){return[D.SI]},
 static:{"^":"Oi"}},
 xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.uG().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
 return y},"call$1","gUU",2,0,null,98,[]],
 $asG8:function(){return[D.SI]},
 static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
 bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
 gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
 z=D.SI
 y=J.O
 this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
 z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
 ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
 this.fq.toString
 z=$.cI().Ej
 y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
 z=$.uG().Ej
 if(y)H.vh(new P.AT(a))
 if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
 tM:[function(a,b){var z,y,x,w
 D.Ch(b,this.zf,this)
 this.nr=!1
@@ -22432,9 +22660,9 @@
 y=F.Wi(this,C.tP,this.cL,y)
 this.cL=y
 y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
 if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
 x=H.B7([],P.L5(null,null,null,null,null))
 J.kH(z.t(b,"timers"),new D.Qq(x))
 y=this.LE
@@ -22446,33 +22674,71 @@
 w.u(y,"dart",x.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,y)
+y=J.UQ(z.t(b,"heap"),"capacityNew")
+this.p2=F.Wi(this,C.So,this.p2,y)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[function(a,b){this.FF=0
+this.bj=a
+if(a==null)return
+if(J.u6(J.q8(a),3))return
+return this.AW(b)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.bj
+y=this.FF
+if(typeof y!=="number")return y.g()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
 $isbv:true},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
 call$1:[function(a){var z=this.a
 return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 Qq:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
 $isEH:true},
 Qd:{
 "^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
 gzf:function(){return this.Gt},
 VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
 l9:[function(a){var z=[]
 J.kH(this.i2,new D.i6(a,z))
 H.bQ(z,new D.r2(this))
 J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
 AQ:[function(a){var z,y,x,w
 z=this.i2
 y=J.U6(z)
@@ -22480,14 +22746,14 @@
 if(x!=null)return x
 w=P.L5(null,null,null,J.O,J.GW)
 w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
 x.nr=C.xB.nC("@Isolate","@")
 x.mQ=D.Io("@Isolate")
 x.DC(0)
 x.pC()
 y.u(z,a,x)
 x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
 Ze:[function(a){var z,y,x,w,v
 z=J.UQ(a,"id")
 y=this.i2
@@ -22496,21 +22762,21 @@
 if(w!=null){w.eC(a)
 return w}v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 w.H4(null,a)
 w.pC()
 x.u(y,z,w)
 w.xW(0)
 return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
 i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 r2:{
 "^":"Tp:112;c",
 call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
 $isEH:true},
 JB:{
 "^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
 w=J.U6(x)
 if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 u.H4(null,a)
 u.pC()
 N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
 w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
 $isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
 $isEH:true},
 BH:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
 FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
 aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
 u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
 nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 k0:[function(a){return},"call$0","gqw",0,0,114],
 ni:[function(a){this.RF.AP=null
 return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
 $isd3:true},
 pt:{
 "^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
 tM:[function(a,b){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,this.LD,z)
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
 aq:[function(a){var z,y,x,w,v
 if(this.nr)this.xW(0)
 z=J.U6(a)
@@ -22641,7 +22907,7 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
 W8:[function(a){var z,y,x,w,v
 this.nr=!0
 if(a==null)return
@@ -22653,7 +22919,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
 $isrj:true},
 dZL:{
 "^":"af+Pi;",
@@ -22662,50 +22928,56 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
 kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
 PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
 this.Du=0
 this.fF=0
@@ -22727,7 +22999,7 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
 eL:[function(a,b,c){var z,y
 this.jv=F.Wi(this,C.QK,this.jv,c)
 z=J.U6(a)
@@ -22739,8 +23011,8 @@
 if(y!=null)this.pd(y)
 z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
 y=this.Fm
 y=D.Lr(y.zf,y,z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
 x=z.t(b,"disassembly")
 if(x!=null)this.xs(x)
 z=this.va
 y=J.U6(z)
 this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
 xs:[function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
@@ -22774,7 +23049,7 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
 pd:[function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.yP
@@ -22785,117 +23060,49 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
 tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
 dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
 F3:[function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
 Ov:[function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
 UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
 call$2:[function(a,b){var z,y
 z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
 if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
 z6:[function(a,b){var z=this.Yu
 N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
 dT:{
 "^":"Tp:112;",
 call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
 return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
 z6:[function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
 J.X8(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
 case"Function":z=W.r3("function-view",null)
 J.dk(z,a.mC)
 return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
 case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
 case"IsolateList":z=W.r3("isolate-list",null)
 J.oq(z,a.mC)
 return z
@@ -22965,7 +23178,7 @@
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -22988,32 +23201,32 @@
 C.ZO.ZL(a)
 C.ZO.G6(a)
 return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23028,15 +23241,43 @@
 C.wU.ZL(a)
 C.wU.G6(a)
 return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
 "^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"change"],
+"@":function(){return[C.mS]},
+static:{Al:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.fA.ZL(a)
+C.fA.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23050,16 +23291,16 @@
 C.dX.ZL(a)
 C.dX.G6(a)
 return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23073,20 +23314,20 @@
 C.bg.ZL(a)
 C.bg.G6(a)
 return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -23094,7 +23335,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+if(!!z.$iscv)return M.F5(a,b)
+if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],285,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -23124,9 +23365,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23154,7 +23395,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23172,30 +23413,30 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.of(a,"expando$values")
 x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+w=J.x(a)
+if(!!w.$isMi)x=new M.ee(a,null,null)
+else if(!!w.$islp)x=new M.ug(a,null,null)
+else if(!!w.$isAE)x=new M.wl(a,null,null)
+else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
 return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
 "^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
 y=this.gN1()
 if(z){H.Go(y,"$isQl")
 y.toString
@@ -23221,29 +23460,29 @@
 z=d!=null?d:""
 x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v,u
+EC:[function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+y=J.x(z)
+if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
+if(!!J.x(x).$isSA){w=z.value
+v=x}else{w=null
+v=null}}else{w=null
+v=null}M.NP.prototype.EC.call(this,a)
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
 $isEH:true},
 fTP:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
 "^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
 J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
+x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
 z=J.O6(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 jz:{
 "^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
@@ -23347,14 +23585,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:112;",
@@ -23367,8 +23605,7 @@
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23382,7 +23619,7 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
@@ -23392,7 +23629,7 @@
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){var z,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+y=this.N1
+x=d!=null?d:""
+x=new M.SA(null,null,y,c,null,null,b,x)
+x.Og(y,b,c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
 Z1:[function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
@@ -23462,7 +23693,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23495,32 +23726,30 @@
 P.rb(z.gjM())}},"call$0","geB",0,0,null],
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(z)
+x=z.gdv()
+if(x==null){x=M.iX(y,b)
+z.sdv(x)}w=this.IT
+if(w==null){v=J.VN(this.N1)
+w=$.JM()
+u=w.t(0,v)
 if(u==null){u=v.implementation.createHTMLDocument("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+w.u(0,v,u)}this.IT=u
+w=u}t=M.Fz(y,w)
+M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+gnv:function(a){var z,y,x,w
 this.Sy()
 z=J.Vs(this.N1).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.N1)
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
 gjb:function(a){var z
 this.Sy()
 z=this.jH
@@ -23529,43 +23758,38 @@
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+w=J.RE(x)
+x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
+if(x){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
 v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
 v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
 u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
 if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+y=J.x(z)
+if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23580,38 +23804,37 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
 "^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gH:function(){var z=this.ud
+z.toString
+return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.ao(this.lr,this.ay,null)},
 cO:[function(a){var z=this.ud
 if(z==null)return
@@ -23620,7 +23843,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23632,7 +23855,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -23662,7 +23885,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23687,11 +23910,11 @@
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+y=J.x(a)
+if(!!y.$isList){this.xG=a
+x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
-x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
@@ -23709,7 +23932,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
 y=z.N1
-x=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
+w=J.RE(y)
+if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
 return}if(!this.U9){this.U9=!0
-if(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+if(x!=null){this.DO=x.CE(y)
+this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
+for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
+for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
 r=s.gNg()
 if(typeof r!=="number")return H.s(r)
-t-=r}for(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+t-=r}for(w=w.gA(a);w.G();){s=w.gl()
+for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
+n=v.Rz(0,o)
 if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
 m=q.gkU(n)
 l=q.gyT(n)
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
+k=o!=null?z.a5(o,x,m):null
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,650,254,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23783,20 +24004,20 @@
 this.pq=!0},"call$0","gJK",0,0,null]},
 VU:{
 "^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
 Z1:[function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+y=this.N1
+x=d!=null?d:""
+x=new M.NP(null,y,c,null,null,"value",x)
+x.Og(y,"value",c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
 ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
 this.qP=null
 this.ZY=null},"call$0","gJK",0,0,null],
 Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+z=J.x(this.ZY)
+z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
 y=this.ZY
 if(z){this.xS=y
 z=y}else{z=L.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
 VD:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
@@ -24001,9 +24220,9 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
-F.d3.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
+F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
 D.bv.$isaf=true
 D.bv.$isa=true
 D.c2.$isa=true
-D.Vi.$isVi=true
 D.Vi.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
 H.Uz.$isej=true
 H.Uz.$isej=true
 H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
 P.dl.$isdl=true
 P.dl.$isa=true
 V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
+J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lp=function(a,b){return J.RE(a).st5(a,b)}
 J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
+J.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.Mz=function(a){return J.rY(a).hc(a)}
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
+J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
 J.QP=function(a){return J.RE(a).gF1(a)}
-J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
 J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
 J.VN=function(a){return J.RE(a).gM0(a)}
+J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vq=function(a){return J.RE(a).xo(a)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
+J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
+return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
 J.ti=function(a,b){return J.RE(a).sQr(a,b)}
@@ -24308,8 +24543,10 @@
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+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.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
 C.J0=B.G6.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
 C.IU=new P.kF()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
 C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
 C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.IK=O.CN.prototype
 C.YD=F.Be.prototype
 C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
 C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.kQ])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
 C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
 C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
 C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
 C.cJ=U.fI.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
 C.dX=K.nm.prototype
 C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
 C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
 C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
 C.VJ=new H.GD("object")
+C.xG=new H.GD("objectPool")
+C.Le=new H.GD("oldHeapCapacity")
 C.ap=new H.GD("oldHeapUsed")
 C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
+C.bE=new H.GD("sampleDepth")
+C.kA=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
 C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
 C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
 C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
 C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
   }
 }())})
 I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?: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))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -24899,7 +25164,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -24910,7 +25175,7 @@
 I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -24918,7 +25183,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
 $desc=$collectedClasses.Ny
 if($desc instanceof Array)$desc=$desc[1]
 Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
 function Zv(){}Zv.builtin$cls="Zv"
 if(!"name" in Zv)Zv.name="Zv"
 $desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
 $desc=$collectedClasses.Fs
 if($desc instanceof Array)$desc=$desc[1]
 Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
 Fs.prototype.goc=function(receiver){return receiver.name}
 Fs.prototype.soc=function(receiver,v){return receiver.name=v}
 Fs.prototype.gLA=function(receiver){return receiver.src}
 Fs.prototype.gt5=function(receiver){return receiver.type}
 Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
 function Ty(){}Ty.builtin$cls="Ty"
 if(!"name" in Ty)Ty.name="Ty"
 $desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
 $desc=$collectedClasses.Uq
 if($desc instanceof Array)$desc=$desc[1]
 Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
 if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
 function Rt(){}Rt.builtin$cls="Rt"
 if(!"name" in Rt)Rt.name="Rt"
 $desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
 function wa(){}wa.builtin$cls="wa"
 if(!"name" in wa)wa.name="wa"
 $desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
 $desc=$collectedClasses.tX
 if($desc instanceof Array)$desc=$desc[1]
 tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
 tX.prototype.goc=function(receiver){return receiver.name}
 tX.prototype.soc=function(receiver,v){return receiver.name=v}
 tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
 function Sg(){}Sg.builtin$cls="Sg"
 if(!"name" in Sg)Sg.name="Sg"
 $desc=$collectedClasses.Sg
 if($desc instanceof Array)$desc=$desc[1]
 Sg.prototype=$desc
 Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
 function pA(){}pA.builtin$cls="pA"
 if(!"name" in pA)pA.name="pA"
 $desc=$collectedClasses.pA
 if($desc instanceof Array)$desc=$desc[1]
 pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
 pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
 function Mi(){}Mi.builtin$cls="Mi"
 if(!"name" in Mi)Mi.name="Mi"
 $desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
 Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
 Mi.prototype.st5=function(receiver,v){return receiver.type=v}
 Mi.prototype.gP=function(receiver){return receiver.value}
 Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
 function Gt(){}Gt.builtin$cls="Gt"
 if(!"name" in Gt)Gt.name="Gt"
 $desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
 In.prototype.goc=function(receiver){return receiver.name}
 In.prototype.soc=function(receiver,v){return receiver.name=v}
 In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
 if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
 function eP(){}eP.builtin$cls="eP"
 if(!"name" in eP)eP.name="eP"
 $desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
 if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
 G7.prototype=$desc
 G7.prototype.gRn=function(receiver){return receiver.data}
 G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
 G7.prototype.goc=function(receiver){return receiver.name}
 G7.prototype.soc=function(receiver,v){return receiver.name=v}
 G7.prototype.gt5=function(receiver){return receiver.type}
 G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
 function l9(){}l9.builtin$cls="l9"
 if(!"name" in l9)l9.name="l9"
 $desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
 Xp.prototype.gt5=function(receiver){return receiver.type}
 Xp.prototype.gP=function(receiver){return receiver.value}
 Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
 if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
 function mX(){}mX.builtin$cls="mX"
 if(!"name" in mX)mX.name="mX"
 $desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
 HD.prototype.soc=function(receiver,v){return receiver.name=v}
 HD.prototype.gP=function(receiver){return receiver.value}
 HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
 if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
 function jg(){}jg.builtin$cls="jg"
 if(!"name" in jg)jg.name="jg"
 $desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
 KR.prototype=$desc
 KR.prototype.gP=function(receiver){return receiver.value}
 KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
 if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
 function fs(){}fs.builtin$cls="fs"
 if(!"name" in fs)fs.name="fs"
 $desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
 lp.prototype.gt5=function(receiver){return receiver.type}
 lp.prototype.gP=function(receiver){return receiver.value}
 lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
 if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
 function I0(){}I0.builtin$cls="I0"
 if(!"name" in I0)I0.name="I0"
 $desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 G5.prototype=$desc
 G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
 if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
 function Lx(){}Lx.builtin$cls="Lx"
 if(!"name" in Lx)Lx.name="Lx"
 $desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
 AE.prototype.gt5=function(receiver){return receiver.type}
 AE.prototype.gP=function(receiver){return receiver.value}
 AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
 if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
 function FH(){}FH.builtin$cls="FH"
 if(!"name" in FH)FH.name="FH"
 $desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
 RH.prototype.gph=function(receiver){return receiver.label}
 RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
 if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
 function OJ(){}OJ.builtin$cls="OJ"
 if(!"name" in OJ)OJ.name="OJ"
 $desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
 $desc=$collectedClasses.dp
 if($desc instanceof Array)$desc=$desc[1]
 dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
 if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
 if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
 $desc=$collectedClasses.tZ
 if($desc instanceof Array)$desc=$desc[1]
 tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
 if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
 function AK(){}AK.builtin$cls="AK"
 if(!"name" in AK)AK.name="AK"
 $desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
 $desc=$collectedClasses.ty
 if($desc instanceof Array)$desc=$desc[1]
 ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
 if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
 function F2(){}F2.builtin$cls="F2"
 if(!"name" in F2)F2.name="F2"
 $desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
 $desc=$collectedClasses.y5
 if($desc instanceof Array)$desc=$desc[1]
 y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
 function jQ(){}jQ.builtin$cls="jQ"
 if(!"name" in jQ)jQ.name="jQ"
 $desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
 function lv(){}lv.builtin$cls="lv"
 if(!"name" in lv)lv.name="lv"
 $desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
 lv.prototype=$desc
 lv.prototype.gt5=function(receiver){return receiver.type}
 lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
 if($desc instanceof Array)$desc=$desc[1]
 pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
 function NV(){}NV.builtin$cls="NV"
 if(!"name" in NV)NV.name="NV"
 $desc=$collectedClasses.NV
 if($desc instanceof Array)$desc=$desc[1]
 NV.prototype=$desc
 NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
 function W1(){}W1.builtin$cls="W1"
 if(!"name" in W1)W1.name="W1"
 $desc=$collectedClasses.W1
 if($desc instanceof Array)$desc=$desc[1]
 W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
 function mCz(){}mCz.builtin$cls="mCz"
 if(!"name" in mCz)mCz.name="mCz"
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
 function kK(){}kK.builtin$cls="kK"
 if(!"name" in kK)kK.name="kK"
 $desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
 kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
 function NdT(){}NdT.builtin$cls="NdT"
 if(!"name" in NdT)NdT.name="NdT"
 $desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
 $desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
 Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
 if($desc instanceof Array)$desc=$desc[1]
 me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
 me.prototype.gmH=function(receiver){return receiver.href}
 function oB(){}oB.builtin$cls="oB"
 if(!"name" in oB)oB.name="oB"
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
 function NY(){}NY.builtin$cls="NY"
 if(!"name" in NY)NY.name="NY"
 $desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
 if($desc instanceof Array)$desc=$desc[1]
 EI.prototype=$desc
 EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
 function MI(){}MI.builtin$cls="MI"
 if(!"name" in MI)MI.name="MI"
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
 function rg(){}rg.builtin$cls="rg"
 if(!"name" in rg)rg.name="rg"
 $desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
 rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
 function eW(){}eW.builtin$cls="eW"
 if(!"name" in eW)eW.name="eW"
 $desc=$collectedClasses.eW
 if($desc instanceof Array)$desc=$desc[1]
 eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
 function kL(){}kL.builtin$cls="kL"
 if(!"name" in kL)kL.name="kL"
 $desc=$collectedClasses.kL
 if($desc instanceof Array)$desc=$desc[1]
 kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
 if($desc instanceof Array)$desc=$desc[1]
 Fu.prototype=$desc
 Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
 function QN(){}QN.builtin$cls="QN"
 if(!"name" in QN)QN.name="QN"
 $desc=$collectedClasses.QN
 if($desc instanceof Array)$desc=$desc[1]
 QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
 QN.prototype.gmH=function(receiver){return receiver.href}
 function N9(){}N9.builtin$cls="N9"
 if(!"name" in N9)N9.name="N9"
 $desc=$collectedClasses.N9
 if($desc instanceof Array)$desc=$desc[1]
 N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
 function BA(){}BA.builtin$cls="BA"
 if(!"name" in BA)BA.name="BA"
 $desc=$collectedClasses.BA
 if($desc instanceof Array)$desc=$desc[1]
 BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
 if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
 function zp(){}zp.builtin$cls="zp"
 if(!"name" in zp)zp.name="zp"
 $desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
 $desc=$collectedClasses.br
 if($desc instanceof Array)$desc=$desc[1]
 br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
 br.prototype.gmH=function(receiver){return receiver.href}
 function PIw(){}PIw.builtin$cls="PIw"
 if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
 if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
 function kN(){}kN.builtin$cls="kN"
 if(!"name" in kN)kN.name="kN"
 $desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
 $desc=$collectedClasses.Gr
 if($desc instanceof Array)$desc=$desc[1]
 Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
 Gr.prototype.gmH=function(receiver){return receiver.href}
 function XE(){}XE.builtin$cls="XE"
 if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
 function j24(){}j24.builtin$cls="j24"
 if(!"name" in j24)j24.name="j24"
 $desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
 $desc=$collectedClasses.rQ
 if($desc instanceof Array)$desc=$desc[1]
 rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
 if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
 function LR(){}LR.builtin$cls="LR"
 if(!"name" in LR)LR.name="LR"
 $desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
 $desc=$collectedClasses.hy
 if($desc instanceof Array)$desc=$desc[1]
 hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
 function mq(){}mq.builtin$cls="mq"
 if(!"name" in mq)mq.name="mq"
 $desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
 $desc=$collectedClasses.CG
 if($desc instanceof Array)$desc=$desc[1]
 CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
 if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
 function y0(){}y0.builtin$cls="y0"
 if(!"name" in y0)y0.name="y0"
 $desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
 function Dn(){}Dn.builtin$cls="Dn"
 if(!"name" in Dn)Dn.name="Dn"
 $desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
 $desc=$collectedClasses.pyk
 if($desc instanceof Array)$desc=$desc[1]
 pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
 pyk.prototype.gmH=function(receiver){return receiver.href}
 function ZD(){}ZD.builtin$cls="ZD"
 if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
 $desc=$collectedClasses.Ja
 if($desc instanceof Array)$desc=$desc[1]
 Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
 if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
 function hW(){}hW.builtin$cls="hW"
 if(!"name" in hW)hW.name="hW"
 $desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
 if($desc instanceof Array)$desc=$desc[1]
 xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
 if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
 function Et(){}Et.builtin$cls="Et"
 if(!"name" in Et)Et.name="Et"
 $desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
 $desc=$collectedClasses.Zn
 if($desc instanceof Array)$desc=$desc[1]
 Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
 if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
 function tG(){}tG.builtin$cls="tG"
 if(!"name" in tG)tG.name="tG"
 $desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
 $desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
 IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
 if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
 $desc=$collectedClasses.GW
 if($desc instanceof Array)$desc=$desc[1]
 GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
 if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
 function VP(){}VP.builtin$cls="VP"
 if(!"name" in VP)VP.name="VP"
 $desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
 f0.prototype.gi2=function(receiver){return this.i2}
 f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
-this.Qy=Qy
+this.um=um
 this.PX=PX
 this.RW=RW
 this.C9=C9
@@ -26901,11 +27326,11 @@
 $desc=$collectedClasses.Vg
 if($desc instanceof Array)$desc=$desc[1]
 Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
 if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
 function Z6(JE,Jz){this.JE=JE
 this.Jz=Jz}Z6.builtin$cls="Z6"
 if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 ku.prototype=$desc
 ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
 if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
 function xQ(){}xQ.builtin$cls="xQ"
 if(!"name" in xQ)xQ.name="xQ"
 $desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
 if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 Eq.prototype=$desc
 Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
 if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
 function tD(dw,Iq,is,p6){this.dw=dw
 this.Iq=Iq
 this.is=is
@@ -27405,8 +27830,7 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
 this.AP=AP
 this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
 function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27459,7 +27883,7 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -27476,15 +27900,15 @@
 $desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
 Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
 function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27524,11 +27948,11 @@
 Be.prototype.gXx.$reflectable=1
 Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
 Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
 function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
@@ -27560,11 +27984,11 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
 function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27677,21 +28101,21 @@
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
 if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
 function SU7(){}SU7.builtin$cls="SU7"
 if(!"name" in SU7)SU7.name="SU7"
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
 if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
 this.jE=jE
 this.Ay=Ay
 this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
 if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
 this.xq=xq}Sz.builtin$cls="Sz"
 if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
 $desc=$collectedClasses.aY
 if($desc instanceof Array)$desc=$desc[1]
 aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
 this.cP=cP
 this.Jl=Jl
 this.pU=pU
 this.Fh=Fh
 this.Xp=Xp
-this.aj=aj
+this.fb=fb
 this.rb=rb
 this.Zq=Zq
 this.rF=rF
@@ -28559,16 +28989,16 @@
 zG.prototype.gpU=function(){return this.pU}
 zG.prototype.gFh=function(){return this.Fh}
 zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
 zG.prototype.grb=function(){return this.rb}
 zG.prototype.gZq=function(){return this.Zq}
 zG.prototype.gJS=function(receiver){return this.JS}
 zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
 if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
 function dl(){}dl.builtin$cls="dl"
 if(!"name" in dl)dl.name="dl"
 $desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
 if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
 $desc=$collectedClasses.by
 if($desc instanceof Array)$desc=$desc[1]
 by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
 if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
 function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
 if(!"name" in Cf)Cf.name="Cf"
 $desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
 $desc=$collectedClasses.z0
 if($desc instanceof Array)$desc=$desc[1]
 z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
 if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
 function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
 $desc=$collectedClasses.I4
 if($desc instanceof Array)$desc=$desc[1]
 I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
 if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
 function RO(uv,Ph,Sg){this.uv=uv
 this.Ph=Ph
 this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
 if(!"name" in bO)bO.name="bO"
 $desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
 $desc=$collectedClasses.QS
 if($desc instanceof Array)$desc=$desc[1]
 QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
 function ej(){}ej.builtin$cls="ej"
 if(!"name" in ej)ej.name="ej"
 $desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
 $desc=$collectedClasses.Nx
 if($desc instanceof Array)$desc=$desc[1]
 Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
 if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
 function Dg(){}Dg.builtin$cls="Dg"
 if(!"name" in Dg)Dg.name="Dg"
 $desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
 function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
 this.Ab=Ab
 this.Ln=Ln
@@ -29904,11 +30369,11 @@
 rm.prototype.gy4.$reflectable=1
 rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
 rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
 function YW(a){this.a=a}YW.builtin$cls="YW"
 if(!"name" in YW)YW.name="YW"
 $desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -29971,11 +30441,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
 function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.Lk=Lk
@@ -29997,11 +30484,81 @@
 mk.prototype.gZ8.$reflectable=1
 mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
 function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
@@ -30068,11 +30625,11 @@
 jY.prototype.gX3.$reflectable=1
 jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
 jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
 $desc=$collectedClasses.xL
 if($desc instanceof Array)$desc=$desc[1]
 xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
 function As(){}As.builtin$cls="As"
 if(!"name" in As)As.name="As"
 $desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -30200,11 +30767,11 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
 if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
 function Js(a){this.a=a}Js.builtin$cls="Js"
 if(!"name" in Js)Js.name="Js"
 $desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
 function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
 this.Lk=Lk
@@ -30257,11 +30824,30 @@
 u7.prototype.gtf.$reflectable=1
 u7.prototype.stf=function(receiver,v){return receiver.tf=v}
 u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
 function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
@@ -30278,17 +30864,15 @@
 qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
 this.FT=FT
 this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
 this.qO=qO
 this.Hm=Hm
 this.AP=AP
@@ -30302,48 +30886,65 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
 if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30355,20 +30956,63 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
 if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
 if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
 function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
@@ -30395,11 +31039,11 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
 function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -30439,11 +31083,11 @@
 KL.prototype.gN7.$reflectable=1
 KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
 KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30497,12 +31141,12 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
 function tzK(){}tzK.builtin$cls="tzK"
 if(!"name" in tzK)tzK.name="tzK"
 $desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
 if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
 function oBi(){}oBi.builtin$cls="oBi"
 if(!"name" in oBi)oBi.name="oBi"
 $desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
 function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
 this.V4=V4
 this.AP=AP
@@ -30600,11 +31244,11 @@
 Qa.prototype.gV4.$reflectable=1
 Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
 Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
 function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.Hq=Hq
@@ -30636,11 +31280,11 @@
 Ww.prototype.gHq.$reflectable=1
 Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
 Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
 function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.Lk=Lk
@@ -30662,11 +31306,11 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
 function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.iy=iy
 this.AP=AP
@@ -30693,11 +31337,11 @@
 fl.prototype.giy.$reflectable=1
 fl.prototype.siy=function(receiver,v){return receiver.iy=v}
 fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
 function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
@@ -30724,11 +31368,11 @@
 Zt.prototype.gJo.$reflectable=1
 Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
 function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
@@ -30755,13 +31399,13 @@
 iL.prototype.gJo.$reflectable=1
 iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30782,15 +31426,15 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
 function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.Lk=Lk
 this.dZ=dZ
@@ -30891,11 +31535,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
 if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
 $desc=$collectedClasses.pM
 if($desc instanceof Array)$desc=$desc[1]
 pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
 if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
 function W6(){}W6.builtin$cls="W6"
 if(!"name" in W6)W6.name="W6"
 $desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
 $desc=$collectedClasses.Ed
 if($desc instanceof Array)$desc=$desc[1]
 Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
 if(!"name" in G1)G1.name="G1"
 $desc=$collectedClasses.G1
 if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
 iT.prototype=$desc
 iT.prototype.ghP=function(){return this.hP}
 iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
 this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
 if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
 function ey(d){this.d=d}ey.builtin$cls="ey"
 if(!"name" in ey)ey.name="ey"
 $desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
 $desc=$collectedClasses.J1
 if($desc instanceof Array)$desc=$desc[1]
 J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
 this.bm=bm}fk.builtin$cls="fk"
 if(!"name" in fk)fk.name="fk"
 $desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
 function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.Lk=Lk
@@ -31906,11 +32550,11 @@
 knI.prototype.gzw.$reflectable=1
 knI.prototype.szw=function(receiver,v){return receiver.zw=v}
 knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
 if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
 function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.HJ=HJ
 this.AP=AP
@@ -31937,25 +32581,25 @@
 fI.prototype.gHJ.$reflectable=1
 fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
 fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
 if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
 function G8(F1){this.F1=F1}G8.builtin$cls="G8"
 if(!"name" in G8)G8.name="G8"
 $desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
 G8.prototype=$desc
 G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
 if(!"name" in fJ)fJ.name="fJ"
 $desc=$collectedClasses.fJ
 if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
 $desc=$collectedClasses.q1
 if($desc instanceof Array)$desc=$desc[1]
 q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
 if(!"name" in jx)jx.name="jx"
 $desc=$collectedClasses.jx
 if($desc instanceof Array)$desc=$desc[1]
 jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
 function Cn(){}Cn.builtin$cls="Cn"
 if(!"name" in Cn)Cn.name="Cn"
 $desc=$collectedClasses.Cn
 if($desc instanceof Array)$desc=$desc[1]
 Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
 if(!"name" in du)du.name="du"
 $desc=$collectedClasses.du
 if($desc instanceof Array)$desc=$desc[1]
 du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
 if(!"name" in xc)xc.name="xc"
 $desc=$collectedClasses.xc
 if($desc instanceof Array)$desc=$desc[1]
 xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
 this.fq=fq
 this.ne=ne
 this.PH=PH
@@ -32006,7 +32674,12 @@
 this.LE=LE
 this.Cf=Cf
 this.W1=W1
+this.p2=p2
+this.Hw=Hw
 this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
 this.AP=AP
 this.Lk=Lk
 this.Fm=Fm
@@ -32028,16 +32701,20 @@
 bv.prototype.sGR=function(v){return this.f5=v}
 bv.prototype.gLE=function(){return this.LE}
 bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
 function D3(){}D3.builtin$cls="D3"
 if(!"name" in D3)D3.name="D3"
 $desc=$collectedClasses.D3
 if($desc instanceof Array)$desc=$desc[1]
 D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
 if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
 function Qq(a){this.a=a}Qq.builtin$cls="Qq"
 if(!"name" in Qq)Qq.name="Qq"
 $desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
 $desc=$collectedClasses.JB
 if($desc instanceof Array)$desc=$desc[1]
 JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
 function BH(a){this.a=a}BH.builtin$cls="BH"
 if(!"name" in BH)BH.name="BH"
 $desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
 Vi.prototype=$desc
 Vi.prototype.gtT=function(receiver){return this.tT}
 Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
 this.jv=jv
 this.Du=Du
 this.fF=fF
@@ -32208,6 +32896,7 @@
 this.yP=yP
 this.mM=mM
 this.qH=qH
+this.Ni=Ni
 this.MO=MO
 this.oc=oc
 this.zz=zz
@@ -32264,16 +32953,6 @@
 $desc=$collectedClasses.fx
 if($desc instanceof Array)$desc=$desc[1]
 fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
 function UZ(a,b,c){this.a=a
 this.b=b
 this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
 $desc=$collectedClasses.UZ
 if($desc instanceof Array)$desc=$desc[1]
 UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
 if(!"name" in XK)XK.name="XK"
 $desc=$collectedClasses.XK
 if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
 $desc=$collectedClasses.dT
 if($desc instanceof Array)$desc=$desc[1]
 dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
 this.yb=yb
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
 if(!"name" in ho)ho.name="ho"
 $desc=$collectedClasses.ho
 if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
 ob.prototype.gmC.$reflectable=1
 ob.prototype.smC=function(receiver,v){return receiver.mC=v}
 ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
 if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
 function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -32379,11 +33035,47 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
 function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.Lk=Lk
@@ -32405,11 +33097,11 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
 if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
 function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
 this.Lk=Lk
@@ -32431,11 +33123,11 @@
 Vu.prototype.gB3.$reflectable=1
 Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
 Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
 if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 0b59620..61ce909 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -14,21 +14,25 @@
 export 'package:observatory/src/elements/field_view.dart';
 export 'package:observatory/src/elements/function_ref.dart';
 export 'package:observatory/src/elements/function_view.dart';
+export 'package:observatory/src/elements/heap_map.dart';
+export 'package:observatory/src/elements/heap_profile.dart';
 export 'package:observatory/src/elements/instance_ref.dart';
 export 'package:observatory/src/elements/instance_view.dart';
 export 'package:observatory/src/elements/isolate_list.dart';
-export 'package:observatory/src/elements/isolate_summary.dart';
 export 'package:observatory/src/elements/isolate_profile.dart';
-export 'package:observatory/src/elements/heap_profile.dart';
+export 'package:observatory/src/elements/isolate_ref.dart';
+export 'package:observatory/src/elements/isolate_summary.dart';
+export 'package:observatory/src/elements/isolate_view.dart';
 export 'package:observatory/src/elements/json_view.dart';
 export 'package:observatory/src/elements/library_ref.dart';
 export 'package:observatory/src/elements/library_view.dart';
-export 'package:observatory/src/elements/service_view.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/response_viewer.dart';
 export 'package:observatory/src/elements/script_ref.dart';
 export 'package:observatory/src/elements/script_view.dart';
 export 'package:observatory/src/elements/service_ref.dart';
+export 'package:observatory/src/elements/service_view.dart';
+export 'package:observatory/src/elements/sliding_checkbox.dart';
 export 'package:observatory/src/elements/stack_frame.dart';
 export 'package:observatory/src/elements/stack_trace.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index 4746eac..abfeed6 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -14,8 +14,11 @@
   <link rel="import" href="src/elements/field_view.html">
   <link rel="import" href="src/elements/function_ref.html">
   <link rel="import" href="src/elements/function_view.html">
+  <link rel="import" href="src/elements/heap_map.html">
   <link rel="import" href="src/elements/isolate_list.html">
+  <link rel="import" href="src/elements/isolate_ref.html">
   <link rel="import" href="src/elements/isolate_summary.html">
+  <link rel="import" href="src/elements/isolate_view.html">
   <link rel="import" href="src/elements/instance_ref.html">
   <link rel="import" href="src/elements/instance_view.html">
   <link rel="import" href="src/elements/json_view.html">
@@ -29,6 +32,7 @@
   <link rel="import" href="src/elements/script_view.html">
   <link rel="import" href="src/elements/service_ref.html">
   <link rel="import" href="src/elements/service_view.html">
+  <link rel="import" href="src/elements/sliding_checkbox.html">
   <link rel="import" href="src/elements/stack_frame.html">
   <link rel="import" href="src/elements/stack_trace.html">
 </head>
diff --git a/runtime/bin/vmservice/client/lib/service.dart b/runtime/bin/vmservice/client/lib/service.dart
index e513701..4b328f9 100644
--- a/runtime/bin/vmservice/client/lib/service.dart
+++ b/runtime/bin/vmservice/client/lib/service.dart
@@ -13,4 +13,3 @@
 part 'src/service/cache.dart';
 part 'src/service/object.dart';
 part 'src/service/service.dart';
-part 'src/service/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index dba7f88..e662f6f 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -10,7 +10,7 @@
 class LocationManager extends Observable {
   static const String defaultHash = '#/isolates/';
   static final RegExp _currentIsolateMatcher = new RegExp(r'#/isolates/\d+');
-  static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+/');
+  static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+(/|$)');
   ObservatoryApplication _app;
   @observable String currentHash = '';
 
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index e832dca..dda6c81 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -42,18 +42,16 @@
 }
 
 class TableTree extends Observable {
-  final List<String> columnHeaders = [];
   @observable final List<TableTreeRow> rows = toObservable([]);
 
   /// Create a table tree with column [headers].
-  TableTree(List<String> headers) {
-    columnHeaders.addAll(headers);
-  }
+  TableTree();
 
   /// Initialize the table tree with the list of root children.
-  void initialize(List<TableTreeRow> children) {
+  void initialize(TableTreeRow root) {
     rows.clear();
-    rows.addAll(children);
+    root.onShow();
+    rows.addAll(root.children);
   }
 
   /// Toggle expansion of row at [rowIndex].
@@ -70,20 +68,10 @@
 
   int _index(TableTreeRow row) => rows.indexOf(row);
 
-  void _insertRow(int index, TableTreeRow row) {
-    if (index == -1) {
-      rows.add(row);
-    } else {
-      rows.insert(index, row);
-    }
-  }
-
   void _expand(TableTreeRow row) {
     int index = _index(row);
     assert(index != -1);
-    for (var i = 0; i < row.children.length; i++) {
-      _insertRow(index + i + 1, row.children[i]);
-    }
+    rows.insertAll(index + 1, row.children);
   }
 
   void _collapse(TableTreeRow row) {
@@ -101,8 +89,6 @@
     row.expanded = false;
     // Remove all children.
     int index = _index(row);
-    for (var i = 0; i < childCount; i++) {
-      rows.removeAt(index + 1);
-    }
+    rows.removeRange(index + 1, index + 1 + childCount);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
index 6893fd0..7e957be 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index fd53d20..8c35168 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -4,6 +4,7 @@
 
 library class_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
@@ -13,7 +14,12 @@
   @published ServiceMap cls;
   ClassViewElement.created() : super.created();
 
+  Future<ServiceObject> eval(String text) {
+    return cls.isolate.get(
+        cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
   void refresh(var done) {
     cls.reload().whenComplete(done);
   }
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 8bffd2c..29f2ed5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,14 +1,38 @@
 <head>
-  <link rel="import" href="error_view.html">
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -17,74 +41,125 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
         </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
         </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
       </div>
     </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
     </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
   </template>
   <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index cc6166c..80c4cb8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,4 +1,5 @@
 <link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
 <polymer-element name="code-view" extends="observatory-element">
@@ -17,7 +18,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member, .memberHeader {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -31,27 +39,33 @@
     </style>
     <div class="content">
       <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </table>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
     </div>
     <hr>
     <div class="content">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
index 3133ed7..0223bf1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
@@ -9,5 +9,21 @@
 
 @CustomTag('function-ref')
 class FunctionRefElement extends ServiceRefElement {
+  @published bool qualified = true;
+
+  void refChanged(oldValue) {
+    super.refChanged(oldValue);
+    notifyPropertyChange(#hasParent, 0, 1);
+    notifyPropertyChange(#hasClass, 0, 1);
+    hasParent = (ref != null && ref['parent'] != null);
+    hasClass = (ref != null &&
+                ref['class'] != null &&
+                ref['class']['name'] != null &&
+                ref['class']['name'] != '::');
+  }
+
+  @observable bool hasParent = false;
+  @observable bool hasClass = false;
+
   FunctionRefElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
index a6e4c09..2760ab0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -1,9 +1,15 @@
 <head>
+<link rel="import" href="class_ref.html">
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified && !hasParent && hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified && hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
 <script type="application/dart" src="function_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
new file mode 100644
index 0000000..fccb62a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.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 heap_map_element;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:math';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
+import 'package:observatory/app.dart';
+
+/// Displays an Error response.
+@CustomTag('heap-map')
+class HeapMapElement extends ObservatoryElement {
+  var _fragmentationCanvas;
+  var _fragmentationData;
+
+  @observable String status;
+  @published ServiceMap fragmentation;
+
+  HeapMapElement.created() : super.created() {
+  }
+
+  void enteredView() {
+    super.enteredView();
+    _fragmentationCanvas = shadowRoot.querySelector("#fragmentation");
+  }
+
+  List<int> _classIdToRGBA(int classId) {
+    if (classId == fragmentation['free_class_id']) {
+      return [255, 255, 255, 255];
+    } else {
+      // TODO(koda): Pick random hue, but fixed saturation and value.
+      var rng = new Random(classId);
+      return [rng.nextInt(128),
+              rng.nextInt(128),
+              rng.nextInt(128),
+              255];
+    }
+  }
+
+  void _updateFragmentationData() {
+    if (fragmentation == null || _fragmentationCanvas == null) {
+      return;
+    }
+    var pages = fragmentation['pages'];
+    // Calculate dimensions.
+    var numPixels = 0;
+    var colorMap = {};
+    for (var page in pages) {
+      for (int i = 0; i < page.length; i += 2) {
+        numPixels += page[i];
+        var classId = page[i + 1];
+        colorMap.putIfAbsent(classId, () => _classIdToRGBA(classId));
+      }
+    }
+    var width = _fragmentationCanvas.parent.client.width;
+    var height = (numPixels + width - 1) ~/ width;
+    // Render image.
+    _fragmentationData =
+        _fragmentationCanvas.context2D.createImageData(width, height);
+    _fragmentationCanvas.width = _fragmentationData.width;
+    _fragmentationCanvas.height = _fragmentationData.height;
+    _renderPages(0, 0, colorMap);
+  }
+
+  // Renders and draws asynchronously, one page at a time to avoid
+  // blocking the UI.
+  void _renderPages(int startPage, int dataIndex, var colorMap) {
+    var pages = fragmentation['pages'];
+    status = 'Loaded $startPage of ${pages.length} pages';
+    if (startPage >= pages.length) {
+      return;
+    }
+    var width = _fragmentationData.width;
+    var dirtyBegin = (dataIndex / 4) ~/ width;
+    var page = pages[startPage];
+    for (var i = 0; i < page.length; i += 2) {
+      var count = page[i];
+      var color = colorMap[page[i + 1]];
+      for (var j = 0; j < count; ++j) {
+        for (var component in color) {
+          _fragmentationData.data[dataIndex++] = component;
+        }
+      }
+    }
+    var dirtyEnd = (dataIndex / 4 + width - 1) ~/ width;
+    _fragmentationCanvas.context2D.putImageData(
+        _fragmentationData, 0, 0, 0, dirtyBegin, width, dirtyEnd - dirtyBegin);
+    // Continue with the next page, asynchronously.
+    new Future(() {
+      _renderPages(startPage + 1, dataIndex, colorMap);
+    });
+  }
+
+  void refresh(var done) {
+    if (fragmentation == null) {
+      return;
+    }
+    fragmentation.isolate.get('heapmap').then((ServiceMap response) {
+      assert(response['type'] == 'HeapMap');
+      fragmentation = response;
+    }).catchError((e, st) {
+      Logger.root.info('$e $st');
+    }).whenComplete(done);
+  }
+  
+  void fragmentationChanged(oldValue) {
+    // Async, in case enteredView has not yet run (observed in JS version).
+    new Future(() {
+      _updateFragmentationData();
+    });
+  }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
new file mode 100644
index 0000000..510f1fe
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -0,0 +1,22 @@
+<head>
+  <link rel="import" href="class_ref.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="nav_bar.html">
+</head>
+<polymer-element name="heap-map" extends="observatory-element">
+<template>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+<script type="application/dart" src="heap_map.dart"></script>
+</polymer-element>
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 e03e1d2..4fae426 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -6,9 +6,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -32,6 +40,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -39,28 +48,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tr template repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tr template repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index 5a0f9ba..295dddf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -4,12 +4,11 @@
 
 library instance_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
-import 'dart:async';
-
 @CustomTag('instance-view')
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index c39183d..6c400ca 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -26,12 +26,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -46,23 +48,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -71,44 +75,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 39092b3..1e244df 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -6,10 +6,61 @@
 
 import 'dart:html';
 import 'observatory_element.dart';
+import 'package:logging/logging.dart';
 import 'package:observatory/service.dart';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
+class ProfileCodeTrieNodeTreeRow extends TableTreeRow {
+  final ServiceMap profile;
+  @reflectable final CodeTrieNode root;
+  @reflectable final CodeTrieNode node;
+  @reflectable Code get code => node.code;
+
+  static String formatPercent(num a, num total) {
+    var percent = 100.0 * (a / total);
+    return '${percent.toStringAsFixed(2)}%';
+  }
+
+  ProfileCodeTrieNodeTreeRow(this.profile, this.root, this.node,
+                             ProfileCodeTrieNodeTreeRow parent)
+      : super(parent) {
+    assert(root != null);
+    assert(node != null);
+    var totalSamples = root.count;
+    // When the row is created, fill out the columns.
+    if (parent == null) {
+      columns.add(formatPercent(node.count, root.count));
+    } else {
+      columns.add(formatPercent(node.count, parent.node.count));
+    }
+    columns.add(formatPercent(node.code.exclusiveTicks, totalSamples));
+  }
+
+  bool shouldDisplayChild(CodeTrieNode childNode, double threshold) {
+    return ((childNode.count / node.count) > threshold) ||
+            ((childNode.code.exclusiveTicks / root.count) > threshold);
+  }
+
+  void onShow() {
+    var threshold = profile['threshold'];
+    if (children.length > 0) {
+      // Child rows already created.
+      return;
+    }
+    for (var childNode in node.children) {
+      if (!shouldDisplayChild(childNode, threshold)) {
+        continue;
+      }
+      var row = new ProfileCodeTrieNodeTreeRow(profile, root, childNode, this);
+      children.add(row);
+    }
+  }
+
+  void onHide() {
+  }
+}
+
 class ProfileCallerTreeRow extends TableTreeRow {
   final ServiceMap profile;
   @reflectable final Code code;
@@ -25,29 +76,41 @@
     assert(code != null);
     var totalSamples = profile['samples'];
     // When the row is created, fill out the columns.
-    columns.add(
-        formatPercent(code.exclusiveTicks, totalSamples));
     if (parent == null) {
-      // Fill with dummy data.
-      columns.add('');
+      var root = profile.isolate.codes.tagRoot();
+      var totalAttributedCalls = root.callersCount(code);
+      var totalParentCalls = root.sumCallersCount();
+      columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
     } else {
       var totalAttributedCalls = parent.code.callersCount(code);
       var totalParentCalls = parent.code.sumCallersCount();
       columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
     }
+    columns.add(formatPercent(code.exclusiveTicks, totalSamples));
+  }
+
+  bool shouldDisplayChild(CodeCallCount childNode, totalSamples,
+                          double threshold) {
+    var callerPercent = code.callersCount(childNode.code) /
+                        code.sumCallersCount();
+    return (callerPercent > threshold) ||
+            ((childNode.code.exclusiveTicks / totalSamples) > threshold);
   }
 
   void onShow() {
+    var threshold = profile['threshold'];
+    var totalSamples = profile['samples'];
     if (children.length > 0) {
       // Child rows already created.
       return;
     }
-    // Create child rows on demand.
-    code.callers.forEach((CodeCallCount codeCaller) {
-      var row =
-          new ProfileCallerTreeRow(profile, codeCaller.code, this);
+    for (var codeCaller in code.callers) {
+      if (!shouldDisplayChild(codeCaller, totalSamples, threshold)) {
+        continue;
+      }
+      var row = new ProfileCallerTreeRow(profile, codeCaller.code, this);
       children.add(row);
-    });
+    }
   }
 
   void onHide() {
@@ -59,15 +122,20 @@
 class IsolateProfileElement extends ObservatoryElement {
   IsolateProfileElement.created() : super.created();
   @published ServiceMap profile;
-  @reflectable final topExclusiveCodes = new ObservableList<Code>();
-  @observable int methodCountSelected = 0;
+  @observable bool callGraphChecked;
+  @observable bool hideTagsChecked;
   @observable String sampleCount = '';
   @observable String refreshTime = '';
+  @observable String sampleRate = '';
+  @observable String sampleDepth = '';
+  @observable String displayCutoff = '';
+  @reflectable double displayThreshold = 0.0001; // 0.5%.
 
-  final List methodCounts = [10, 20, 50];
   final _id = '#tableTree';
   TableTree tree;
 
+  static const MICROSECONDS_PER_SECOND = 1000000.0;
+
   void profileChanged(oldValue) {
     if (profile == null) {
       return;
@@ -76,21 +144,35 @@
     var now = new DateTime.now();
     sampleCount = totalSamples.toString();
     refreshTime = now.toString();
+    sampleDepth = profile['depth'].toString();
+    var period = profile['period'];
+    sampleRate = (MICROSECONDS_PER_SECOND / period).toStringAsFixed(0);
+    displayCutoff = '${(displayThreshold * 100.0).toString()}%';
     profile.isolate.processProfile(profile);
+    profile['threshold'] = displayThreshold;
     _update();
   }
 
+  void callGraphCheckedChanged(oldValue) {
+    _update();
+  }
+
+
   void enteredView() {
-    tree = new TableTree(['Method', 'Exclusive', 'Caller']);
+    tree = new TableTree();
     _update();
   }
 
-  methodCountSelectedChanged(oldValue) {
-    _update();
+  void hideTagsCheckedChanged(oldValue) {
+    refresh(null);
   }
 
   void refresh(var done) {
-    profile.isolate.get('profile').then((ServiceMap m) {
+    var request = 'profile';
+    if ((hideTagsChecked != null) && hideTagsChecked) {
+      request += '?tags=hide';
+    }
+    profile.isolate.get(request).then((ServiceMap m) {
       // Assert we got back the a profile.
       assert(m.serviceType == 'Profile');
       profile = m;
@@ -101,28 +183,46 @@
     if (profile == null) {
       return;
     }
-    _refreshTopMethods();
-    _rebuildTree();
+    _buildTree();
   }
 
-  void _refreshTopMethods() {
+  void _buildCallersTree() {
     assert(profile != null);
-    var count = methodCounts[methodCountSelected];
-    topExclusiveCodes.clear();
-    topExclusiveCodes.addAll(profile.isolate.codes.topExclusive(count));
-  }
-
-  void _rebuildTree() {
-    assert(profile != null);
-    var rootChildren = [];
-    for (var code in topExclusiveCodes) {
-      var row = new ProfileCallerTreeRow(profile, code, null);
-      rootChildren.add(row);
+    var root = profile.isolate.codes.tagRoot();
+    if (root == null) {
+      Logger.root.warning('No profile root tag.');
     }
-    tree.initialize(rootChildren);
+    try {
+      tree.initialize(new ProfileCallerTreeRow(profile, root, null));
+    } catch (e, stackTrace) {
+      Logger.root.warning('_buildCallersTree', e, stackTrace);
+    }
+
     notifyPropertyChange(#tree, null, tree);
   }
 
+  void _buildStackTree() {
+    var root = profile.isolate.profileTrieRoot;
+    if (root == null) {
+      Logger.root.warning('No profile trie root.');
+    }
+    try {
+      tree.initialize(
+          new ProfileCodeTrieNodeTreeRow(profile, root, root, null));
+    } catch (e, stackTrace) {
+      Logger.root.warning('_buildStackTree', e, stackTrace);
+    }
+    notifyPropertyChange(#tree, null, tree);
+  }
+
+  void _buildTree() {
+    if ((callGraphChecked) != null && callGraphChecked) {
+      _buildCallersTree();
+    } else {
+      _buildStackTree();
+    }
+  }
+
   @observable String padding(TableTreeRow row) {
     return 'padding-left: ${row.depth * 16}px;';
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index f8d14aa..af6c097 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -2,6 +2,7 @@
   <link rel="import" href="code_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="sliding_checkbox.html">
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
@@ -11,40 +12,83 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedIndex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}"
-              class="{{ coloring(row) }}"
-              style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         <tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}"
+                class="{{ coloring(row) }}"
+                style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
new file mode 100644
index 0000000..730a438
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
@@ -0,0 +1,13 @@
+// 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 isolate_ref_element;
+
+import 'package:polymer/polymer.dart';
+import 'service_ref.dart';
+
+@CustomTag('isolate-ref')
+class IsolateRefElement extends ServiceRefElement {
+  IsolateRefElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
new file mode 100644
index 0000000..53d96b3
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -0,0 +1,9 @@
+<head>
+<link rel="import" href="service_ref.html">
+</head>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
+</template>
+<script type="application/dart" src="isolate_ref.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index a5dbe18..9d3826a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,5 +1,6 @@
 <head>
   <link rel="import" href="function_ref.html">
+  <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="script_ref.html">
 </head>
@@ -16,14 +17,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -66,6 +60,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
new file mode 100644
index 0000000..3693ce6
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -0,0 +1,25 @@
+// 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 isolate_view_element;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('isolate-view')
+class IsolateViewElement extends ObservatoryElement {
+  @published Isolate isolate;
+  IsolateViewElement.created() : super.created();
+
+  Future<ServiceObject> eval(String text) {
+    return isolate.get(
+        isolate.rootLib.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
+  void refresh(var done) {
+    isolate.reload().whenComplete(done);
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
new file mode 100644
index 0000000..209c73d
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -0,0 +1,163 @@
+<head>
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
+  <link rel="import" href="function_ref.html">
+  <link rel="import" href="library_ref.html">
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_ref.html">
+</head>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                           line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>
+          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  <script type="application/dart" src="isolate_view.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index 398c508..f22e019 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -4,17 +4,23 @@
 
 library library_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
-
 import 'package:polymer/polymer.dart';
 
+
 @CustomTag('library-view')
 class LibraryViewElement extends ObservatoryElement {
   @published ServiceMap library;
 
   LibraryViewElement.created() : super.created();
 
+  Future<ServiceObject> eval(String text) {
+    return library.isolate.get(
+        library.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
   void refresh(var done) {
     library.reload().whenComplete(done);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index b54eb21..3b4a368 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -1,5 +1,7 @@
 <head>
   <link rel="import" href="class_ref.html">
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
@@ -10,6 +12,28 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -17,68 +41,111 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
   </template>
   <script type="application/dart" src="library_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index dbd2006..20e2907 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -159,13 +159,15 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
                      anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
+                     anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index 2a81626..e739a45 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -48,6 +48,10 @@
         FunctionViewElement element = new Element.tag('function-view');
         element.function = object;
         return element;
+      case 'HeapMap':
+        HeapMapElement element = new Element.tag('heap-map');
+        element.fragmentation = object;
+        return element;
       case 'Array':
       case 'Bool':
       case 'Closure':
@@ -58,6 +62,10 @@
         InstanceViewElement element = new Element.tag('instance-view');
         element.instance = object;
         return element;
+      case 'Isolate':
+        IsolateViewElement element = new Element.tag('isolate-view');
+        element.isolate = object;
+        return element;
       case 'IsolateList':
         IsolateListElement element = new Element.tag('isolate-list');
         element.isolates = object;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
index 93fadd0..23a7630 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -5,6 +5,7 @@
   <link rel="import" href="error_view.html">
   <link rel="import" href="field_view.html">
   <link rel="import" href="function_view.html">
+  <link rel="import" href="heap_map.html">
   <link rel="import" href="heap_profile.html">
   <link rel="import" href="instance_view.html">
   <link rel="import" href="isolate_list.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart
new file mode 100644
index 0000000..760fd11
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.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.
+
+library sliding_checkbox_element;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('sliding-checkbox')
+class SlidingCheckboxElement extends PolymerElement {
+  SlidingCheckboxElement.created() : super.created();
+  @published bool checked;
+  @published String checkedText;
+  @published String uncheckedText;
+
+  void change(Event e, var details, Node target) {
+    CheckboxInputElement input = shadowRoot.querySelector('#slide-switch');
+    checked = input.checked;
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
new file mode 100644
index 0000000..80f39aa
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -0,0 +1,87 @@
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox"
+             class="hide"
+             id="slide-switch"
+             on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
+  </template>
+  <script type="application/dart" src="sliding_checkbox.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index ca7313c..a965765 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -8,9 +8,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -22,15 +30,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tr template repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/service/cache.dart b/runtime/bin/vmservice/client/lib/src/service/cache.dart
index 6feb94a..a1d8fe4 100644
--- a/runtime/bin/vmservice/client/lib/src/service/cache.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/cache.dart
@@ -42,9 +42,9 @@
     assert(cachesId(id));
     T cached = _cache[id];
     if (cached != null) {
-      return new Future.value(cached);
+      return cached.load();
     }
-    return isolate.get(id).then(_addToCache);
+    return isolate.getDirect(id);
   }
 
   /// If [obj] is cached, return the cached object. Otherwise, upgrades [obj]
@@ -113,6 +113,13 @@
     return codeList;
   }
 
+  static const TAG_ROOT_ID = 'code/tag-0';
+
+  /// Returns the Code object for the root tag.
+  Code tagRoot() {
+    return _cache[TAG_ROOT_ID];
+  }
+
   void _resetProfileData() {
     _cache.forEach((k, Code code) {
       code.resetProfileData();
@@ -154,6 +161,7 @@
                  r'^functions/collected-.+|'
                  r'^functions/reused-.+|'
                  r'^functions/stub-.+|'
+                 r'^functions/tag-.+|'
                  r'^classes/\d+/functions/.+|'
                  r'^classes/\d+/closures/.+|'
                  r'^classes/\d+/implicit_closures/.+|'
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index bbfe10a..63e253f 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -4,6 +4,169 @@
 
 part of service;
 
+/// A [ServiceObject] is an object known to the VM service and is tied
+/// to an owning [Isolate].
+abstract class ServiceObject extends Observable {
+  Isolate _isolate;
+
+  /// Owning isolate.
+  @reflectable Isolate get isolate => _isolate;
+
+  /// Owning vm.
+  @reflectable VM get vm => _isolate.vm;
+
+  /// The complete service url of this object.
+  @reflectable String get link => isolate.relativeLink(_id);
+
+  /// The complete service url of this object with a '#/' prefix.
+  @reflectable String get hashLink => isolate.relativeHashLink(_id);
+  set hashLink(var o) { /* silence polymer */ }
+
+  String _id;
+  /// The id of this object.
+  @reflectable String get id => _id;
+
+  String _serviceType;
+  /// The service type of this object.
+  @reflectable String get serviceType => _serviceType;
+
+  bool _ref;
+
+  @observable String name;
+  @observable String vmName;
+
+  ServiceObject(this._isolate, this._id, this._serviceType) {
+    _ref = isRefType(_serviceType);
+    _serviceType = stripRef(_serviceType);
+    _created();
+  }
+
+  ServiceObject.fromMap(this._isolate, ObservableMap m) {
+    assert(isServiceMap(m));
+    _id = m['id'];
+    _ref = isRefType(m['type']);
+    _serviceType = stripRef(m['type']);
+    _created();
+    update(m);
+  }
+
+  /// If [this] was created from a reference, load the full object
+  /// from the service by calling [reload]. Else, return [this].
+  Future<ServiceObject> load() {
+    if (!_ref) {
+      // Not a reference.
+      return new Future.value(this);
+    }
+    // Call reload which will fill in the entire object.
+    return reload();
+  }
+
+  /// Reload [this]. Returns a future which completes to [this] or
+  /// a [ServiceError].
+  Future<ServiceObject> reload() {
+    assert(isolate != null);
+    if (id == '') {
+      // Errors don't have ids.
+      assert(serviceType == 'Error');
+      return new Future.value(this);
+    }
+    return isolate.vm.getAsMap(link).then(update);
+  }
+
+  /// Update [this] using [m] as a source. [m] can be a reference.
+  ServiceObject update(ObservableMap m) {
+    // Assert that m is a service map.
+    assert(ServiceObject.isServiceMap(m));
+    if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
+      // Got an unexpected error. Don't update the object.
+      return _upgradeToServiceObject(vm, isolate, m);
+    }
+    // TODO(johnmccutchan): Should we allow for a ServiceObject's id
+    // or type to change?
+    _id = m['id'];
+    _serviceType = stripRef(m['type']);
+    _update(m);
+    return this;
+  }
+
+  // update internal state from [map]. [map] can be a reference.
+  void _update(ObservableMap map);
+
+  /// Returns true if [this] has only been partially initialized via
+  /// a reference. See [load].
+  bool isRef() => _ref;
+
+  void _created() {
+    var refNotice = _ref ? ' Created from reference.' : '';
+    Logger.root.info('Created ServiceObject for \'${_id}\' with type '
+                     '\'${_serviceType}\'.' + refNotice);
+  }
+
+  /// Returns true if [map] is a service map. i.e. it has the following keys:
+  /// 'id' and a 'type'.
+  static bool isServiceMap(ObservableMap m) {
+    return (m != null) && (m['id'] != null) && (m['type'] != null);
+  }
+
+  /// Returns true if [type] is a reference type. i.e. it begins with an
+  /// '@' character.
+  static bool isRefType(String type) {
+    return type.startsWith('@');
+  }
+
+  /// Returns the unreffed version of [type].
+  static String stripRef(String type) {
+    if (!isRefType(type)) {
+      return type;
+    }
+    // Strip off the '@' character.
+    return type.substring(1);
+  }
+}
+
+/// State for a VM being inspected.
+abstract class VM extends Observable {
+  @reflectable IsolateList _isolates;
+  @reflectable IsolateList get isolates => _isolates;
+
+  void _initOnce() {
+    assert(_isolates == null);
+    _isolates = new IsolateList(this);
+  }
+
+  VM() {
+    _initOnce();
+  }
+
+  /// Get [id] as an [ObservableMap] from the service directly.
+  Future<ObservableMap> getAsMap(String id) {
+    return getString(id).then((response) {
+      try {
+        var map = JSON.decode(response);
+        Logger.root.info('Decoded $id');
+        return toObservable(map);
+      } catch (e, st) {
+        return toObservable({
+          'type': 'Error',
+          'id': '',
+          'kind': 'DecodeError',
+          'message': '$e',
+        });
+      }
+    }).catchError((error) {
+      return toObservable({
+        'type': 'Error',
+        'id': '',
+        'kind': 'LastResort',
+        'message': '$error'
+      });
+    });
+  }
+
+  /// Get [id] as a [String] from the service directly. See [getAsMap].
+  Future<String> getString(String id);
+}
+
 /// State for a running isolate.
 class Isolate extends ServiceObject {
   final VM vm;
@@ -61,11 +224,24 @@
     }
     _codes._resetProfileData();
     _codes._updateProfileData(profile, codeTable);
+    var exclusiveTrie = profile['exclusive_trie'];
+    if (exclusiveTrie != null) {
+      profileTrieRoot = _processProfileTrie(exclusiveTrie, codeTable);
+    }
+  }
+
+  Future<ServiceObject> getDirect(String serviceId) {
+    return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
+        return _upgradeToServiceObject(vm, this, m);
+    });
   }
 
   /// Requests [serviceId] from [this]. Completes to a [ServiceObject].
   /// Can return pre-existing, cached, [ServiceObject]s.
   Future<ServiceObject> get(String serviceId) {
+    if (serviceId == '') {
+      return reload();
+    }
     if (_scripts.cachesId(serviceId)) {
       return _scripts.get(serviceId);
     }
@@ -78,9 +254,7 @@
     if (_functions.cachesId(serviceId)) {
       return _functions.get(serviceId);
     }
-    return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
-      return _upgradeToServiceObject(vm, this, m);
-    });
+    return getDirect(serviceId);
   }
 
   @observable ServiceMap rootLib;
@@ -95,6 +269,8 @@
 
   @observable int newHeapUsed = 0;
   @observable int oldHeapUsed = 0;
+  @observable int newHeapCapacity = 0;
+  @observable int oldHeapCapacity = 0;
 
   @observable String fileAndLine;
 
@@ -114,7 +290,7 @@
       name = entry['name'];
     } else {
       // fred
-      name = 'root isolate';
+      name = 'root';
     }
     if (map['topFrame'] != null) {
       topFrame = map['topFrame'];
@@ -137,6 +313,53 @@
 
     newHeapUsed = map['heap']['usedNew'];
     oldHeapUsed = map['heap']['usedOld'];
+    newHeapCapacity = map['heap']['capacityNew'];
+    oldHeapCapacity = map['heap']['capacityOld'];
+  }
+
+  @reflectable CodeTrieNode profileTrieRoot;
+  // The profile trie is serialized as a list of integers. Each node
+  // is recreated by consuming some portion of the list. The format is as
+  // follows:
+  // [0] index into codeTable of code object.
+  // [1] tick count (number of times this stack frame occured).
+  // [2] child node count
+  // Reading the trie is done by recursively reading the tree depth-first
+  // pre-order.
+  CodeTrieNode _processProfileTrie(List<int> data, List<Code> codeTable) {
+    // Setup state shared across calls to _readTrieNode.
+    _trieDataCursor = 0;
+    _trieData = data;
+    if (_trieData == null) {
+      return null;
+    }
+    if (_trieData.length < 3) {
+      // Not enough integers for 1 node.
+      return null;
+    }
+    // Read the tree, returns the root node.
+    return _readTrieNode(codeTable);
+  }
+  int _trieDataCursor;
+  List<int> _trieData;
+  CodeTrieNode _readTrieNode(List<Code> codeTable) {
+    // Read index into code table.
+    var index = _trieData[_trieDataCursor++];
+    // Lookup code object.
+    var code = codeTable[index];
+    // Frame counter.
+    var count = _trieData[_trieDataCursor++];
+    // Create node.
+    var node = new CodeTrieNode(code, count);
+    // Number of children.
+    var children = _trieData[_trieDataCursor++];
+    // Recursively read child nodes.
+    for (var i = 0; i < children; i++) {
+      var child = _readTrieNode(codeTable);
+      node.children.add(child);
+      node.summedChildCount += child.count;
+    }
+    return node;
   }
 }
 
@@ -446,6 +669,8 @@
       return Collected;
     } else if (s == 'Reused') {
       return Reused;
+    } else if (s == 'Tag') {
+      return Tag;
     }
     Logger.root.warning('Unknown code kind $s');
     throw new FallThroughError();
@@ -454,6 +679,7 @@
   static const Dart = const CodeKind._internal('Dart');
   static const Collected = const CodeKind._internal('Collected');
   static const Reused = const CodeKind._internal('Reused');
+  static const Tag = const CodeKind._internal('Tag');
 }
 
 class CodeCallCount {
@@ -462,6 +688,14 @@
   CodeCallCount(this.code, this.count);
 }
 
+class CodeTrieNode {
+  final Code code;
+  final int count;
+  final children = new List<CodeTrieNode>();
+  int summedChildCount = 0;
+  CodeTrieNode(this.code, this.count);
+}
+
 class Code extends ServiceObject {
   @observable CodeKind kind;
   @observable int totalSamplesInProfile = 0;
@@ -475,7 +709,7 @@
   @reflectable final addressTicks = new ObservableMap<int, CodeTick>();
   @observable String formattedInclusiveTicks = '';
   @observable String formattedExclusiveTicks = '';
-
+  @observable ServiceMap objectPool;
   @observable ServiceMap function;
   String name;
   String vmName;
@@ -547,7 +781,7 @@
         '($inclusiveTicks)';
     formattedExclusiveTicks =
         '${formatPercent(exclusiveTicks, totalSamplesInProfile)} '
-        '($inclusiveTicks)';
+        '($exclusiveTicks)';
   }
 
   void _update(ObservableMap m) {
@@ -559,8 +793,8 @@
     kind = CodeKind.fromString(m['kind']);
     startAddress = int.parse(m['start'], radix:16);
     endAddress = int.parse(m['end'], radix:16);
-    // Upgrade the function.
-    function = _upgradeToServiceObject(isolate.vm, isolate, m['function']);
+    function = _upgradeToServiceObject(vm, isolate, m['function']);
+    objectPool = _upgradeToServiceObject(vm, isolate, m['object_pool']);
     var disassembly = m['disassembly'];
     if (disassembly != null) {
       _processDisassembly(disassembly);
diff --git a/runtime/bin/vmservice/client/lib/src/service/service.dart b/runtime/bin/vmservice/client/lib/src/service/service.dart
index 3671116..bc160d8 100644
--- a/runtime/bin/vmservice/client/lib/src/service/service.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/service.dart
@@ -4,126 +4,6 @@
 
 part of service;
 
-/// A [ServiceObject] is an object known to the VM service and is tied
-/// to an owning [Isolate].
-abstract class ServiceObject extends Observable {
-  Isolate _isolate;
-
-  /// Owning isolate.
-  @reflectable Isolate get isolate => _isolate;
-
-  /// Owning vm.
-  @reflectable VM get vm => _isolate.vm;
-
-  /// The complete service url of this object.
-  @reflectable String get link => isolate.relativeLink(_id);
-
-  /// The complete service url of this object with a '#/' prefix.
-  @reflectable String get hashLink => isolate.relativeHashLink(_id);
-  set hashLink(var o) { /* silence polymer */ }
-
-  String _id;
-  /// The id of this object.
-  @reflectable String get id => _id;
-
-  String _serviceType;
-  /// The service type of this object.
-  @reflectable String get serviceType => _serviceType;
-
-  bool _ref;
-
-  @observable String name;
-  @observable String vmName;
-
-  ServiceObject(this._isolate, this._id, this._serviceType) {
-    _ref = isRefType(_serviceType);
-    _serviceType = stripRef(_serviceType);
-    _created();
-  }
-
-  ServiceObject.fromMap(this._isolate, ObservableMap m) {
-    assert(isServiceMap(m));
-    _id = m['id'];
-    _ref = isRefType(m['type']);
-    _serviceType = stripRef(m['type']);
-    _created();
-    update(m);
-  }
-
-  /// If [this] was created from a reference, load the full object
-  /// from the service by calling [reload]. Else, return [this].
-  Future<ServiceObject> load() {
-    if (!_ref) {
-      // Not a reference.
-      return new Future.value(this);
-    }
-    // Call refresh which will fill in the entire object.
-    return reload();
-  }
-
-  /// Reload [this]. Returns a future which completes to [this] or
-  /// a [ServiceError].
-  Future<ServiceObject> reload() {
-    assert(isolate != null);
-    if (id == '') {
-      // Errors don't have ids.
-      assert(serviceType == 'Error');
-      return new Future.value(this);
-    }
-    return isolate.vm.getAsMap(link).then(update);
-  }
-
-  /// Update [this] using [m] as a source. [m] can be a reference.
-  ServiceObject update(ObservableMap m) {
-    // Assert that m is a service map.
-    assert(ServiceObject.isServiceMap(m));
-    if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
-      // Got an unexpected error. Don't update the object.
-      return _upgradeToServiceObject(vm, isolate, m);
-    }
-    // TODO(johnmccutchan): Should we allow for a ServiceObject's id
-    // or type to change?
-    _id = m['id'];
-    _serviceType = stripRef(m['type']);
-    _update(m);
-    return this;
-  }
-
-  // update internal state from [map]. [map] can be a reference.
-  void _update(ObservableMap map);
-
-  /// Returns true if [this] has only been partially initialized via
-  /// a reference. See [load].
-  bool isRef() => _ref;
-
-  void _created() {
-    var refNotice = _ref ? ' Created from reference.' : '';
-    Logger.root.info('Created ServiceObject for \'${_id}\' with type '
-                     '\'${_serviceType}\'.' + refNotice);
-  }
-
-  /// Returns true if [map] is a service map. i.e. it has the following keys:
-  /// 'id' and a 'type'.
-  static bool isServiceMap(ObservableMap m) {
-    return (m != null) && (m['id'] != null) && (m['type'] != null);
-  }
-
-  /// Returns true if [type] is a reference type. i.e. it begins with an
-  /// '@' character.
-  static bool isRefType(String type) {
-    return type.startsWith('@');
-  }
-
-  /// Returns the unreffed version of [type].
-  static String stripRef(String type) {
-    if (!isRefType(type)) {
-      return type;
-    }
-    // Strip off the '@' character.
-    return type.substring(1);
-  }
-}
-
 /// Recursively upgrades all [ServiceObject]s inside [collection] which must
 /// be an [ObservableMap] or an [ObservableList]. Upgraded elements will be
 /// associated with [vm] and [isolate].
@@ -164,6 +44,9 @@
 /// This acts like a factory which consumes an ObservableMap and returns
 /// a fully upgraded ServiceObject.
 ServiceObject _upgradeToServiceObject(VM vm, Isolate isolate, ObservableMap m) {
+  if (m == null) {
+    return null;
+  }
   if (!ServiceObject.isServiceMap(m)) {
     Logger.root.severe("Malformed service object: $m");
   }
diff --git a/runtime/bin/vmservice/client/lib/src/service/vm.dart b/runtime/bin/vmservice/client/lib/src/service/vm.dart
deleted file mode 100644
index 4886517..0000000
--- a/runtime/bin/vmservice/client/lib/src/service/vm.dart
+++ /dev/null
@@ -1,47 +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.
-
-part of service;
-
-abstract class VM extends Observable {
-  @reflectable IsolateList _isolates;
-  @reflectable IsolateList get isolates => _isolates;
-
-  void _initOnce() {
-    assert(_isolates == null);
-    _isolates = new IsolateList(this);
-  }
-
-  VM() {
-    _initOnce();
-  }
-
-  /// Get [id] as an [ObservableMap] from the service directly.
-  Future<ObservableMap> getAsMap(String id) {
-    return getString(id).then((response) {
-      try {
-        var map = JSON.decode(response);
-        Logger.root.info('Decoded $id');
-        return toObservable(map);
-      } catch (e, st) {
-        return toObservable({
-          'type': 'Error',
-          'id': '',
-          'kind': 'DecodeError',
-          'message': '$e',
-        });
-      }
-    }).catchError((error) {
-      return toObservable({
-        'type': 'Error',
-        'id': '',
-        'kind': 'LastResort',
-        'message': '$error'
-      });
-    });
-  }
-
-  /// Get [id] as a [String] from the service directly. See [getAsMap].
-  Future<String> getString(String id);
-}
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index a75b564..8147b2d 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -7,4 +7,6 @@
   bool operator ==(other) native "FunctionImpl_equals";
 
   int get hashCode native "FunctionImpl_hashCode";
+
+  _FunctionImpl get call => this;
 }
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 8f773f9..99d55dc 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -111,6 +111,16 @@
 }
 
 
+RawTypedData* CreateRandomState(Isolate* isolate, uint64_t seed) {
+  const TypedData& result = TypedData::Handle(
+      isolate, TypedData::New(kTypedDataUint32ArrayCid, 2));
+  result.SetUint32(0, static_cast<uint32_t>(seed));
+  result.SetUint32(result.ElementSizeInBytes(),
+                   static_cast<uint32_t>(seed >> 32));
+  return result.raw();
+}
+
+
 uint64_t mix64(uint64_t n) {
   // Thomas Wang 64-bit mix.
   // http://www.concentric.net/~Ttwang/tech/inthash.htm
@@ -135,14 +145,12 @@
 //   if (hash == 0) {
 //     hash = 0x5A17;
 //   }
-//   _state[kSTATE_LO] = hash & _MASK_32;
-//   _state[kSTATE_HI] = hash >> 32;
-DEFINE_NATIVE_ENTRY(Random_setupSeed, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(1));
-  const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
-  ASSERT(!seed_int.IsNull());
-  ASSERT(!array.IsNull());
+//   var result = new Uint32List(2);
+//   result[kSTATE_LO] = seed & _MASK_32;
+//   result[kSTATE_HI] = seed >> 32;
+//   return result;
+DEFINE_NATIVE_ENTRY(Random_setupSeed, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(0));
   uint64_t seed = 0;
   if (seed_int.IsBigint()) {
     const Bigint& mask64 = Bigint::Handle(
@@ -172,10 +180,15 @@
   if (seed == 0) {
     seed = 0x5a17;
   }
-  array.SetUint32(0, static_cast<uint32_t>(seed));
-  array.SetUint32(array.ElementSizeInBytes(),
-      static_cast<uint32_t>(seed >> 32));
-  return Object::null();
+  return CreateRandomState(isolate, seed);
+}
+
+
+DEFINE_NATIVE_ENTRY(Random_initialSeed, 0) {
+  Random* rnd = isolate->random();
+  uint64_t seed = rnd->NextUInt32();
+  seed |= (static_cast<uint64_t>(rnd->NextUInt32()) << 32);
+  return CreateRandomState(isolate, seed);
 }
 
 }  // namespace dart
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index b1301e9..279a549 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -71,34 +71,23 @@
 patch class Random {
 
   /*patch*/ factory Random([int seed]) {
-    if (seed == null) {
-      seed = _Random._nextSeed();
-    }
+    var state = _Random._setupSeed((seed == null) ? _Random._nextSeed() : seed);
     // Crank a couple of times to distribute the seed bits a bit further.
-    return new _Random().._setupSeed(seed)
-                        .._nextState()
-                        .._nextState()
-                        .._nextState()
-                        .._nextState();
+    return new _Random._withState(state).._nextState()
+                                        .._nextState()
+                                        .._nextState()
+                                        .._nextState();
   }
 }
 
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  final _state = new Uint32List(2);
+  final _state;
   static const kSTATE_LO = 0;
   static const kSTATE_HI = 1;
 
-  // Implements:
-  //   do {
-  //     seed = (seed + 0x5A17) & _Random._MASK_64;
-  //   } while (seed == 0);
-  //   _state[kSTATE_LO] = seed & _MASK_32;
-  //   _state[kSTATE_HI] = seed >> 32;
-  // This is a native to prevent 64-bit operations in Dart, which
-  // fail with --throw_on_javascript_int_overflow.
-  void _setupSeed(int seed) native "Random_setupSeed";
+  _Random._withState(Uint32List this._state);
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
@@ -154,13 +143,15 @@
   static const _A = 0xffffda61;
 
   // Use a singleton Random object to get a new seed if no seed was passed.
-  static var _prng = null;
+  static var _prng = new _Random._withState(_initialSeed());
+
+  // This is a native to prevent 64-bit operations in Dart, which
+  // fail with --throw_on_javascript_int_overflow.
+  static Uint32List _setupSeed(int seed) native "Random_setupSeed";
+  // Get a seed from the VM's random number provider.
+  static Uint32List _initialSeed() native "Random_initialSeed";
 
   static int _nextSeed() {
-    if (_prng == null) {
-      // TODO(iposva): Use system to get a random seed.
-      _prng = new Random(new DateTime.now().millisecondsSinceEpoch);
-    }
     // Trigger the PRNG once to change the internal state.
     _prng._nextState();
     return _prng._state[kSTATE_LO];
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 098ef1e..1ef4b3d 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1550,23 +1550,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(ClosureMirror_apply, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(1));
-
-  const Array& args_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
-
-  const Object& result =
-      Object::Handle(DartEntry::InvokeClosure(args, args_descriptor));
-  if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
-    UNREACHABLE();
-  }
-  return result.raw();
-}
-
-
 DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) {
   if (!FLAG_support_find_in_context) {
     return Object::empty_array().raw();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index bb8b56e..4da4e96 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -446,40 +446,9 @@
     return _function;
   }
 
-  // TODO(12602): Remove this special case.
-  delegate(Invocation invocation) {
-    if (invocation.isMethod && (invocation.memberName == #call)) {
-      return this.apply(invocation.positionalArguments,
-                        invocation.namedArguments).reflectee;
-    }
-    return super.delegate(invocation);
-  }
-
   InstanceMirror apply(List<Object> positionalArguments,
                        [Map<Symbol, Object> namedArguments]) {
-    // TODO(12602): When closures get an ordinary call method, this can be
-    // replaced with
-    //   return this.invoke(#call, positionalArguments, namedArguments);
-    // and the native ClosureMirror_apply can be removed.
-    int numPositionalArguments = positionalArguments.length + 1;  // Receiver.
-    int numNamedArguments = namedArguments != null ? namedArguments.length : 0;
-    int numArguments = numPositionalArguments + numNamedArguments;
-    List arguments = new List(numArguments);
-    arguments[0] = _reflectee;  // Receiver.
-    arguments.setRange(1, numPositionalArguments, positionalArguments);
-    List names = new List(numNamedArguments);
-    int argumentIndex = numPositionalArguments;
-    int nameIndex = 0;
-    if (numNamedArguments > 0) {
-      namedArguments.forEach((name, value) {
-        arguments[argumentIndex++] = value;
-        names[nameIndex++] = _n(name);
-      });
-    }
-
-    // It is tempting to implement this in terms of Function.apply, but then
-    // lazy compilation errors would be fatal.
-    return reflect(_apply(arguments, names));
+    return this.invoke(#call, positionalArguments, namedArguments);
   }
 
   InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
@@ -500,9 +469,6 @@
 
   String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'";
 
-  static _apply(arguments, argumentNames)
-      native 'ClosureMirror_apply';
-
   static _computeFunction(reflectee)
       native 'ClosureMirror_function';
 
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 6001a2f..1269903 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -474,24 +474,12 @@
 #endif
 
 #if !defined(TARGET_OS_WINDOWS)
-#if !defined(TEMP_FAILURE_RETRY)
-// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. The
-// definition below is copied from Linux and adapted to avoid lint
-// errors (type long int changed to intptr_t and do/while split on
-// separate lines with body in {}s).
-#define TEMP_FAILURE_RETRY(expression)                                         \
-    ({ intptr_t __result;                                                      \
-       do {                                                                    \
-         __result = (expression);                                              \
-       } while ((__result == -1L) && (errno == EINTR));                        \
-       __result; })
-#endif  // !defined(TEMP_FAILURE_RETRY)
-
-// This is a version of TEMP_FAILURE_RETRY which does not use the value
-// returned from the expression.
-#define VOID_TEMP_FAILURE_RETRY(expression)                                    \
-    (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
-
+#if defined(TEMP_FAILURE_RETRY)
+// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. We should
+// not use that version, but instead the one in signal_blocker.h, to ensure
+// we disable signal interrupts.
+#undef TEMP_FAILURE_RETRY
+#endif  // defined(TEMP_FAILURE_RETRY)
 #endif  // !defined(TARGET_OS_WINDOWS)
 
 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
diff --git a/runtime/platform/platform_sources.gypi b/runtime/platform/platform_sources.gypi
index eadf674..ecfb801 100644
--- a/runtime/platform/platform_sources.gypi
+++ b/runtime/platform/platform_sources.gypi
@@ -9,6 +9,7 @@
     'hashmap.cc',
     'json.cc',
     'floating_point_win.cc',
+    'signal_blocker.h',
     'thread_android.cc',
     'thread_linux.cc',
     'thread_macos.cc',
diff --git a/runtime/bin/signal_blocker.h b/runtime/platform/signal_blocker.h
similarity index 60%
rename from runtime/bin/signal_blocker.h
rename to runtime/platform/signal_blocker.h
index 2b5fe1e..4bfc228 100644
--- a/runtime/bin/signal_blocker.h
+++ b/runtime/platform/signal_blocker.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef BIN_SIGNAL_BLOCKER_H_
-#define BIN_SIGNAL_BLOCKER_H_
+#ifndef PLATFORM_SIGNAL_BLOCKER_H_
+#define PLATFORM_SIGNAL_BLOCKER_H_
 
 #include "platform/globals.h"
 
@@ -16,7 +16,6 @@
 #include "platform/thread.h"
 
 namespace dart {
-namespace bin {
 
 class ThreadSignalBlocker {
  public:
@@ -54,7 +53,10 @@
 };
 
 
-#define TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)                           \
+// The definition below is copied from Linux and adapted to avoid lint
+// errors (type long int changed to intptr_t and do/while split on
+// separate lines with body in {}s) and to also block signals.
+#define TEMP_FAILURE_RETRY(expression)                                         \
     ({ ThreadSignalBlocker tsb(SIGPROF);                                       \
        intptr_t __result;                                                      \
        do {                                                                    \
@@ -62,10 +64,21 @@
        } while ((__result == -1L) && (errno == EINTR));                        \
        __result; })
 
-#define VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)                      \
-    (static_cast<void>(TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)))
+// This is a version of TEMP_FAILURE_RETRY which does not use the value
+// returned from the expression.
+#define VOID_TEMP_FAILURE_RETRY(expression)                                    \
+    (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
 
-}  // namespace bin
+// This macro can be used to insert checks that a call is made, that
+// was expected to not return EINTR, but did it anyway.
+#define NO_RETRY_EXPECTED(expression)                                          \
+    ({ intptr_t __result = (expression);                                       \
+       ASSERT(__result != -1L || errno != EINTR);                              \
+       __result; })
+
+#define VOID_NO_RETRY_EXPECTED(expression)                                     \
+    (static_cast<void>(NO_RETRY_EXPECTED(expression)))
+
 }  // namespace dart
 
-#endif  // BIN_SIGNAL_BLOCKER_H_
+#endif  // PLATFORM_SIGNAL_BLOCKER_H_
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 72e6022..aca8af4 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -27,6 +27,7 @@
 cc/ThreadInterrupterHigh: Skip
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
 
 [ $system == linux ]
 cc/ThreadInterrupterHigh: Skip
@@ -42,6 +43,7 @@
 cc/ThreadInterrupterHigh: Skip
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
 
 [ $arch == simmips && $arch == mips ]
 cc/Service_Coverage: Skip # Dart bug 16250
@@ -70,7 +72,10 @@
 [ $arch == mips ]
 cc/Cop1CvtDL: Crash # Illegal instructions
 cc/Cop1CvtDL_neg: Crash # Illegal instructions
-cc/StaticNonNullSumCallCodegen: Crash # dartbug.com/17440
+cc/StaticNonNullSumCallCodegen: Crash, Pass # dartbug.com/17440
+
+[ $arch == mips && $mode == debug ]
+cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 4bedd21..7a954ee 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2555,9 +2555,9 @@
 
 void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
   if (CanLoadFromObjectPool(object)) {
-    ASSERT(reg != TMP);
-    LoadObject(TMP, object, pp);
-    cmpq(reg, TMP);
+    const int32_t offset =
+        Array::element_offset(FindObject(object, kNotPatchable));
+    cmpq(reg, Address(pp, offset-kHeapObjectTag));
   } else {
     CompareImmediate(
         reg, Immediate(reinterpret_cast<int64_t>(object.raw())), pp);
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index 5fb336d..33d1836 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -98,6 +98,14 @@
   static void AssertCurrent(BaseIsolate* isolate);
 #endif
 
+  uword vm_tag() const {
+    return vm_tag_;
+  }
+
+  void set_vm_tag(uword tag) {
+    vm_tag_ = tag;
+  }
+
  protected:
   BaseIsolate()
       : top_resource_(NULL),
@@ -107,7 +115,8 @@
         no_handle_scope_depth_(0),
         no_gc_scope_depth_(0),
 #endif
-        no_callback_scope_depth_(0)
+        no_callback_scope_depth_(0),
+        vm_tag_(0)
   {}
 
   ~BaseIsolate() {
@@ -122,6 +131,7 @@
   int32_t no_gc_scope_depth_;
 #endif
   int32_t no_callback_scope_depth_;
+  uword vm_tag_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseIsolate);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 172952f..ca91be4 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -120,7 +120,8 @@
   V(Math_log, 1)                                                               \
   V(Math_doublePow, 2)                                                         \
   V(Random_nextState, 1)                                                       \
-  V(Random_setupSeed, 2)                                                       \
+  V(Random_setupSeed, 1)                                                       \
+  V(Random_initialSeed, 0)                                                     \
   V(DateNatives_currentTimeMillis, 0)                                          \
   V(DateNatives_timeZoneName, 1)                                               \
   V(DateNatives_timeZoneOffsetInSeconds, 1)                                    \
@@ -296,7 +297,6 @@
   V(InstanceMirror_computeType, 1)                                             \
   V(ClosureMirror_find_in_context, 2)                                          \
   V(ClosureMirror_function, 1)                                                 \
-  V(ClosureMirror_apply, 2)                                                    \
   V(TypeMirror_subtypeTest, 2)                                                 \
   V(TypeMirror_moreSpecificTest, 2)                                            \
   V(ClassMirror_library, 1)                                                    \
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0c284c2..1f77260 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1026,18 +1026,11 @@
                                 ic_data,
                                 &result)) {
     ArgumentsDescriptor desc(args_descriptor);
-    Function& target_function = Function::Handle();
-    if (receiver.IsClosure() && target_name.Equals(Symbols::Call())) {
-      target_function = receiver_class.GetInvocationDispatcher(
-          target_name,
-          args_descriptor,
-          RawFunction::kInvokeClosureDispatcher);
-    } else {
-      target_function = receiver_class.GetInvocationDispatcher(
-          target_name,
-          args_descriptor,
-          RawFunction::kNoSuchMethodDispatcher);
-    }
+    const Function& target_function =
+        Function::Handle(receiver_class.GetInvocationDispatcher(
+            target_name,
+            args_descriptor,
+            RawFunction::kNoSuchMethodDispatcher));
     // Update IC data.
     ASSERT(!target_function.IsNull());
     intptr_t receiver_cid = receiver.GetClassId();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 14e5a87..c0bbbe2 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -30,6 +30,7 @@
 #include "vm/parser.h"
 #include "vm/scanner.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 
 namespace dart {
@@ -261,6 +262,7 @@
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
   bool is_compiled = false;
   Isolate* isolate = Isolate::Current();
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   HANDLESCOPE(isolate);
   isolate->set_cha_used(false);
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7ea19a5..219b6fc 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -30,6 +30,7 @@
 #include "vm/service.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
 #include "vm/verifier.h"
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 69fc769..00ea8f8 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1474,7 +1474,6 @@
       (kind == RawFunction::kMethodExtractor) ||
       (kind == RawFunction::kNoSuchMethodDispatcher) ||
       (kind == RawFunction::kInvokeFieldDispatcher) ||
-      (kind == RawFunction::kInvokeClosureDispatcher) ||
       func.IsImplicitConstructor()) {
     return false;
   }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 1d49949..303bebd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -13,6 +13,7 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 
 // Allow the use of ASan (AddressSanitizer). This is needed as ASan needs to be
 // told about areas where the VM does the equivalent of a long-jump.
@@ -273,6 +274,7 @@
   NoGCScope no_gc;
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
+  Isolate* isolate = Isolate::Current();
 
 #if defined(USING_SIMULATOR)
   // Unwinding of the C++ frames and destroying of their stack resources is done
@@ -282,12 +284,13 @@
   // Continue simulating at the given pc in the given frame after setting up the
   // exception object in the kExceptionObjectReg register and the stacktrace
   // object (may be raw null) in the kStackTraceObjectReg register.
+  isolate->set_vm_tag(VMTag::kScriptTagId);
   Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer,
                                 raw_exception, raw_stacktrace);
 #else
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous frames.
-  Isolate* isolate = Isolate::Current();
+
   while (isolate->top_resource() != NULL &&
          (reinterpret_cast<uword>(isolate->top_resource()) < stack_pointer)) {
     isolate->top_resource()->~StackResource();
@@ -304,6 +307,7 @@
   uword current_sp = reinterpret_cast<uword>(&program_counter) - 1024;
   __asan_unpoison_memory_region(reinterpret_cast<void*>(current_sp),
                                 stack_pointer - current_sp);
+  isolate->set_vm_tag(VMTag::kScriptTagId);
   func(program_counter, stack_pointer, frame_pointer,
        raw_exception, raw_stacktrace);
 #endif
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 4348d6b..18c26c6 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -15,6 +15,7 @@
 #include "vm/raw_object.h"
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
+#include "vm/tags.h"
 #include "vm/verifier.h"
 #include "vm/virtual_memory.h"
 #include "vm/weak_table.h"
@@ -176,9 +177,11 @@
 
 
 void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
+  Isolate* isolate = Isolate::Current();
   bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
   switch (space) {
     case kNew: {
+      VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
       RecordBeforeGC(kNew, kNewSpace);
       UpdateClassHeapStatsBeforeGC(kNew);
       new_space_->Scavenge(invoke_api_callbacks);
@@ -192,6 +195,7 @@
     }
     case kOld:
     case kCode: {
+      VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
       bool promotion_failure = new_space_->HadPromotionFailure();
       RecordBeforeGC(kOld, promotion_failure ? kPromotionFailure : kOldSpace);
       UpdateClassHeapStatsBeforeGC(kOld);
@@ -229,16 +233,23 @@
 
 
 void Heap::CollectAllGarbage() {
-  RecordBeforeGC(kNew, kFull);
-  UpdateClassHeapStatsBeforeGC(kNew);
-  new_space_->Scavenge(kInvokeApiCallbacks);
-  RecordAfterGC();
-  PrintStats();
-  RecordBeforeGC(kOld, kFull);
-  UpdateClassHeapStatsBeforeGC(kOld);
-  old_space_->MarkSweep(kInvokeApiCallbacks);
-  RecordAfterGC();
-  PrintStats();
+  Isolate* isolate = Isolate::Current();
+  {
+    VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
+    RecordBeforeGC(kNew, kFull);
+    UpdateClassHeapStatsBeforeGC(kNew);
+    new_space_->Scavenge(kInvokeApiCallbacks);
+    RecordAfterGC();
+    PrintStats();
+  }
+  {
+    VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
+    RecordBeforeGC(kOld, kFull);
+    UpdateClassHeapStatsBeforeGC(kOld);
+    old_space_->MarkSweep(kInvokeApiCallbacks);
+    RecordAfterGC();
+    PrintStats();
+  }
 }
 
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b5de9a3..0d32f42 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -28,6 +28,7 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/thread.h"
 #include "vm/thread_interrupter.h"
 #include "vm/timer.h"
@@ -40,8 +41,10 @@
             "Track function usage and report.");
 DEFINE_FLAG(bool, trace_isolates, false,
             "Trace isolate creation and shut down.");
-DEFINE_FLAG(bool, pin_isolates, false,
-            "Stop isolates from being destroyed automatically.");
+DEFINE_FLAG(bool, pause_isolates_on_start, false,
+            "Pause isolates before starting.");
+DEFINE_FLAG(bool, pause_isolates_on_exit, false,
+            "Pause isolates exiting.");
 
 
 void Isolate::RegisterClass(const Class& cls) {
@@ -298,7 +301,6 @@
       message_notify_callback_(NULL),
       name_(NULL),
       start_time_(OS::GetCurrentTimeMicros()),
-      pin_port_(0),
       main_port_(0),
       heap_(NULL),
       object_store_(NULL),
@@ -336,6 +338,7 @@
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
       reusable_handles_() {
+  set_vm_tag(VMTag::kVMTagId);
 }
 #undef REUSABLE_HANDLE_SCOPE_INIT
 #undef REUSABLE_HANDLE_INITIALIZERS
@@ -434,9 +437,8 @@
   result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
   result->BuildName(name_prefix);
-  if (FLAG_pin_isolates) {
-    result->CreatePinPort();
-  }
+  result->message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start);
+  result->message_handler()->set_pause_on_exit(FLAG_pause_isolates_on_exit);
 
   result->debugger_ = new Debugger();
   result->debugger_->Initialize(result);
@@ -452,28 +454,6 @@
 }
 
 
-void Isolate::CreatePinPort() {
-  ASSERT(FLAG_pin_isolates);
-  // Only do this once.
-  ASSERT(pin_port_ == 0);
-  pin_port_ = PortMap::CreatePort(message_handler());
-  ASSERT(pin_port_ != 0);
-  PortMap::SetLive(pin_port_);
-}
-
-
-void Isolate::ClosePinPort() {
-  if (pin_port_ == 0) {
-    // Support multiple calls to close.
-    return;
-  }
-  ASSERT(pin_port_ != 0);
-  bool r = PortMap::ClosePort(pin_port_);
-  ASSERT(r);
-  pin_port_ = 0;
-}
-
-
 void Isolate::BuildName(const char* name_prefix) {
   ASSERT(name_ == NULL);
   if (name_prefix == NULL) {
@@ -914,7 +894,16 @@
     // inlined frames.
     jsobj.AddProperty("depth", (intptr_t)0);
   }
-
+  intptr_t live_ports = message_handler()->live_ports();
+  intptr_t control_ports = message_handler()->control_ports();
+  bool paused_on_exit = message_handler()->paused_on_exit();
+  bool pause_on_start = message_handler()->pause_on_start();
+  bool pause_on_exit = message_handler()->pause_on_exit();
+  jsobj.AddProperty("live_ports", live_ports);
+  jsobj.AddProperty("control_ports", control_ports);
+  jsobj.AddProperty("paused_on_exit", paused_on_exit);
+  jsobj.AddProperty("paused_on_start", pause_on_start);
+  jsobj.AddProperty("pause_on_exit", pause_on_exit);
   const Library& lib =
       Library::Handle(object_store()->root_library());
   jsobj.AddProperty("rootLib", lib);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5410ab8..6743b33 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -142,12 +142,6 @@
 
   int64_t start_time() const { return start_time_; }
 
-  // Creates the pin port (responsible for stopping the isolate from being
-  // destroyed).
-  void CreatePinPort();
-  // Closes pin port.
-  void ClosePinPort();
-
   Dart_Port main_port() { return main_port_; }
   void set_main_port(Dart_Port port) {
     ASSERT(main_port_ == 0);  // Only set main port once.
@@ -176,6 +170,10 @@
     return OFFSET_OF(Isolate, top_exit_frame_info_);
   }
 
+  static intptr_t vm_tag_offset() {
+    return OFFSET_OF(Isolate, vm_tag_);
+  }
+
   ApiState* api_state() const { return api_state_; }
   void set_api_state(ApiState* value) { api_state_ = value; }
 
@@ -482,7 +480,6 @@
   Dart_MessageNotifyCallback message_notify_callback_;
   char* name_;
   int64_t start_time_;
-  Dart_Port pin_port_;
   Dart_Port main_port_;
   Heap* heap_;
   ObjectStore* object_store_;
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 332a6e6..d76e060 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -34,6 +34,9 @@
       oob_queue_(new MessageQueue()),
       control_ports_(0),
       live_ports_(0),
+      pause_on_start_(false),
+      pause_on_exit_(false),
+      paused_on_exit_(false),
       pool_(NULL),
       task_(NULL),
       start_callback_(NULL),
@@ -197,6 +200,15 @@
     // Initialize the message handler by running its start function,
     // if we have one.  For an isolate, this will run the isolate's
     // main() function.
+    if (pause_on_start()) {
+      HandleMessages(false, false);
+      if (pause_on_start()) {
+        // Still paused.
+        task_ = NULL;  // No task in queue.
+        return;
+      }
+    }
+
     if (start_callback_) {
       monitor_.Exit();
       ok = start_callback_(callback_data_);
@@ -212,14 +224,19 @@
     task_ = NULL;  // No task in queue.
 
     if (!ok || !HasLivePorts()) {
-      if (FLAG_trace_isolates) {
+      if (pause_on_exit()) {
+        paused_on_exit_ = true;
+      } else {
+        if (FLAG_trace_isolates) {
         OS::Print("[-] Stopping message handler (%s):\n"
                   "\thandler:    %s\n",
                   (ok ? "no live ports" : "error"),
                   name());
+        }
+        pool_ = NULL;
+        run_end_callback = true;
+        paused_on_exit_ = false;
       }
-      pool_ = NULL;
-      run_end_callback = true;
     }
   }
   if (run_end_callback && end_callback_ != NULL) {
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index f7707aa..eb1056b 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -63,6 +63,35 @@
   // A message handler tracks how many live ports it has.
   bool HasLivePorts() const { return live_ports_ > control_ports_; }
 
+  intptr_t live_ports() const {
+    return live_ports_;
+  }
+
+  intptr_t control_ports() const {
+    return control_ports_;
+  }
+
+  bool pause_on_start() const {
+    return pause_on_start_;
+  }
+
+  void set_pause_on_start(bool pause_on_start) {
+    pause_on_start_ = pause_on_start;
+  }
+
+  bool pause_on_exit() const {
+    return pause_on_exit_;
+  }
+
+  void set_pause_on_exit(bool pause_on_exit) {
+    pause_on_exit_ = pause_on_exit;
+  }
+
+  bool paused_on_exit() const {
+    return paused_on_exit_;
+  }
+
+
 #if defined(DEBUG)
   // Check that it is safe to access this message handler.
   //
@@ -129,6 +158,9 @@
   MessageQueue* oob_queue_;
   intptr_t control_ports_;  // The number of open control ports usually 0 or 1.
   intptr_t live_ports_;  // The number of open ports, including control ports.
+  bool pause_on_start_;
+  bool pause_on_exit_;
+  bool paused_on_exit_;
   ThreadPool* pool_;
   ThreadPool::Task* task_;
   StartCallback start_callback_;
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index af4bd96..525bfea 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -8,6 +8,8 @@
 
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
+#include "vm/tags.h"
+
 
 namespace dart {
 
@@ -51,6 +53,7 @@
   VERIFY_ON_TRANSITION;
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->isolate();
+
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
   ApiLocalScope* current_top_scope = state->top_scope();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ec96fea..4db8ff7 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -40,6 +40,7 @@
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
 
@@ -1680,9 +1681,15 @@
   ASSERT((FakeObject::kClassId != kInstanceCid));
   result.set_id(FakeObject::kClassId);
   result.set_state_bits(0);
-  // VM backed classes are almost ready: run checks and resolve class
-  // references, but do not recompute size.
-  result.set_is_prefinalized();
+  if (FakeObject::kClassId < kInstanceCid) {
+    // VM internal classes are done. There is no finalization needed or
+    // possible in this case.
+    result.set_is_finalized();
+  } else {
+    // VM backed classes are almost ready: run checks and resolve class
+    // references, but do not recompute size.
+    result.set_is_prefinalized();
+  }
   result.set_type_arguments_field_offset_in_words(kNoTypeArguments);
   result.set_num_type_arguments(0);
   result.set_num_own_type_arguments(0);
@@ -2254,8 +2261,7 @@
   };
 
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
-         kind == RawFunction::kInvokeFieldDispatcher ||
-         kind == RawFunction::kInvokeClosureDispatcher);
+         kind == RawFunction::kInvokeFieldDispatcher);
   Function& dispatcher = Function::Handle();
   Array& cache = Array::Handle(invocation_dispatcher_cache());
   ASSERT(!cache.IsNull());
@@ -3774,37 +3780,81 @@
   jsobj.AddPropertyF("id", "classes/%" Pd "", id());
   jsobj.AddProperty("name", internal_class_name);
   jsobj.AddProperty("user_name", user_visible_class_name);
-  if (!ref) {
-    const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
-    if (!err.IsNull()) {
-      jsobj.AddProperty("error", err);
-    }
-    jsobj.AddProperty("implemented", is_implemented());
-    jsobj.AddProperty("abstract", is_abstract());
-    jsobj.AddProperty("patch", is_patch());
-    jsobj.AddProperty("finalized", is_finalized());
-    jsobj.AddProperty("const", is_const());
-    jsobj.AddProperty("super", Class::Handle(SuperClass()));
-    jsobj.AddProperty("library", Object::Handle(library()));
-    {
-      JSONArray fields_array(&jsobj, "fields");
-      const Array& field_array = Array::Handle(fields());
-      Field& field = Field::Handle();
-      if (!field_array.IsNull()) {
-        for (intptr_t i = 0; i < field_array.Length(); ++i) {
-          field ^= field_array.At(i);
-          fields_array.AddValue(field);
+  if (ref) {
+    return;
+  }
+
+  const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
+  if (!err.IsNull()) {
+    jsobj.AddProperty("error", err);
+  }
+  jsobj.AddProperty("implemented", is_implemented());
+  jsobj.AddProperty("abstract", is_abstract());
+  jsobj.AddProperty("patch", is_patch());
+  jsobj.AddProperty("finalized", is_finalized());
+  jsobj.AddProperty("const", is_const());
+  jsobj.AddProperty("super", Class::Handle(SuperClass()));
+  jsobj.AddProperty("library", Object::Handle(library()));
+  const Script& script = Script::Handle(this->script());
+  if (!script.IsNull()) {
+    intptr_t line_number = 0;
+    intptr_t column_number = 0;
+    script.GetTokenLocation(token_pos(), &line_number, &column_number);
+    jsobj.AddProperty("script", script);
+    jsobj.AddProperty("line", line_number);
+    jsobj.AddProperty("col", column_number);
+  }
+  {
+    JSONArray interfaces_array(&jsobj, "interfaces");
+    const Array& interface_array = Array::Handle(interfaces());
+    Type& interface_type = Type::Handle();
+    Class& interface_cls = Class::Handle();
+    if (!interface_array.IsNull()) {
+      for (intptr_t i = 0; i < interface_array.Length(); ++i) {
+        // TODO(turnidge): Use the Type directly once regis has added
+        // types to the vmservice.
+        interface_type ^= interface_array.At(i);
+        if (interface_type.HasResolvedTypeClass()) {
+          interface_cls = interface_type.type_class();
+          interfaces_array.AddValue(interface_cls);
         }
       }
     }
-    {
-      JSONArray functions_array(&jsobj, "functions");
-      const Array& function_array = Array::Handle(functions());
-      Function& function = Function::Handle();
-      if (!function_array.IsNull()) {
-        for (intptr_t i = 0; i < function_array.Length(); i++) {
-          function ^= function_array.At(i);
-          functions_array.AddValue(function);
+  }
+  {
+    JSONArray fields_array(&jsobj, "fields");
+    const Array& field_array = Array::Handle(fields());
+    Field& field = Field::Handle();
+    if (!field_array.IsNull()) {
+      for (intptr_t i = 0; i < field_array.Length(); ++i) {
+        field ^= field_array.At(i);
+        fields_array.AddValue(field);
+      }
+    }
+  }
+  {
+    JSONArray functions_array(&jsobj, "functions");
+    const Array& function_array = Array::Handle(functions());
+    Function& function = Function::Handle();
+    if (!function_array.IsNull()) {
+      for (intptr_t i = 0; i < function_array.Length(); i++) {
+        function ^= function_array.At(i);
+        functions_array.AddValue(function);
+      }
+    }
+  }
+  {
+    JSONArray subclasses_array(&jsobj, "subclasses");
+    const GrowableObjectArray& subclasses =
+        GrowableObjectArray::Handle(direct_subclasses());
+    if (!subclasses.IsNull()) {
+      Class& subclass = Class::Handle();
+      if (!subclasses.IsNull()) {
+        for (intptr_t i = 0; i < subclasses.Length(); ++i) {
+          // TODO(turnidge): Use the Type directly once regis has added
+          // types to the vmservice.
+          subclass ^= subclasses.At(i);
+          subclasses_array.AddValue(subclass);
         }
       }
     }
@@ -4657,8 +4707,7 @@
 
 RawArray* Function::saved_args_desc() const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher ||
-         kind() == RawFunction::kInvokeClosureDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher);
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsArray());
   return Array::Cast(obj).raw();
@@ -4667,8 +4716,7 @@
 
 void Function::set_saved_args_desc(const Array& value) const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher ||
-         kind() == RawFunction::kInvokeClosureDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher);
   ASSERT(raw_ptr()->data_ == Object::null());
   set_data(value);
 }
@@ -4817,9 +4865,6 @@
     case RawFunction::kInvokeFieldDispatcher:
       return "kInvokeFieldDispatcher";
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      return "kInvokeClosureDispatcher";
-      break;
     default:
       UNREACHABLE();
       return NULL;
@@ -6072,9 +6117,6 @@
     case RawFunction::kInvokeFieldDispatcher:
       kind_str = "invoke-field-dispatcher";
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      kind_str = "invoke-closure-dispatcher";
-      break;
     default:
       UNREACHABLE();
   }
@@ -6092,7 +6134,7 @@
 void Function::PrintToJSONStream(JSONStream* stream, bool ref) const {
   const char* internal_name = String::Handle(name()).ToCString();
   const char* user_name =
-      String::Handle(QualifiedUserVisibleName()).ToCString();
+      String::Handle(UserVisibleName()).ToCString();
   Class& cls = Class::Handle(Owner());
   ASSERT(!cls.IsNull());
   Error& err = Error::Handle();
@@ -6106,9 +6148,7 @@
   } else if (IsImplicitClosureFunction()) {
     id = cls.FindImplicitClosureFunctionIndex(*this);
     selector = "implicit_closures";
-  } else if (IsNoSuchMethodDispatcher() ||
-             IsInvokeFieldDispatcher() ||
-             IsInvokeClosureDispatcher()) {
+  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
     id = cls.FindInvocationDispatcherFunctionIndex(*this);
     selector = "dispatchers";
   } else {
@@ -6123,9 +6163,15 @@
   jsobj.AddProperty("name", internal_name);
   jsobj.AddProperty("user_name", user_name);
   jsobj.AddProperty("class", cls);
+  const Function& parent = Function::Handle(parent_function());
+  if (!parent.IsNull()) {
+    jsobj.AddProperty("parent", parent);
+  }
   const char* kind_string = Function::KindToCString(kind());
   jsobj.AddProperty("kind", kind_string);
-  if (ref) return;
+  if (ref) {
+    return;
+  }
   jsobj.AddProperty("is_static", is_static());
   jsobj.AddProperty("is_const", is_const());
   jsobj.AddProperty("is_optimizable", is_optimizable());
@@ -7327,17 +7373,19 @@
 
 
 void Script::Tokenize(const String& private_key) const {
-  const TokenStream& tkns = TokenStream::Handle(tokens());
+  Isolate* isolate = Isolate::Current();
+  const TokenStream& tkns = TokenStream::Handle(isolate, tokens());
   if (!tkns.IsNull()) {
     // Already tokenized.
     return;
   }
-
   // Get the source, scan and allocate the token stream.
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::scanner_timer);
-  const String& src = String::Handle(Source());
+  const String& src = String::Handle(isolate, Source());
   Scanner scanner(src, private_key);
-  set_tokens(TokenStream::Handle(TokenStream::New(scanner.GetStream(),
+  set_tokens(TokenStream::Handle(isolate,
+                                 TokenStream::New(scanner.GetStream(),
                                                   private_key)));
   if (FLAG_compiler_stats) {
     CompilerStats::src_length += src.Length();
@@ -8779,15 +8827,18 @@
 
 void Library::PrintToJSONStream(JSONStream* stream, bool ref) const {
   const char* library_name = String::Handle(name()).ToCString();
-  const char* library_url = String::Handle(url()).ToCString();
   intptr_t id = index();
   ASSERT(id >= 0);
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
+  jsobj.AddProperty("user_name", library_name);
   jsobj.AddProperty("name", library_name);
-  jsobj.AddProperty("user_name", library_url);
-  if (ref) return;
+  if (ref) {
+    return;
+  }
+  const char* library_url = String::Handle(url()).ToCString();
+  jsobj.AddProperty("url", library_url);
   {
     JSONArray jsarr(&jsobj, "classes");
     ClassDictionaryIterator class_iter(*this);
@@ -8801,7 +8852,7 @@
     }
   }
   {
-    JSONArray jsarr(&jsobj, "libraries");
+    JSONArray jsarr(&jsobj, "imports");
     Library& lib = Library::Handle();
     for (intptr_t i = 0; i < num_imports(); i++) {
       lib = ImportLibraryAt(i);
@@ -10530,6 +10581,8 @@
   if (ref) {
     return;
   }
+  const Array& array = Array::Handle(ObjectPool());
+  jsobj.AddProperty("object_pool", array);
   JSONArray jsarr(&jsobj, "disassembly");
   if (is_alive()) {
     // Only disassemble alive code objects.
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7105637..ddbd50c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1544,10 +1544,6 @@
     return kind() == RawFunction::kInvokeFieldDispatcher;
   }
 
-  bool IsInvokeClosureDispatcher() const {
-    return kind() == RawFunction::kInvokeClosureDispatcher;
-  }
-
   // Returns true iff an implicit closure function has been created
   // for this function.
   bool HasImplicitClosureFunction() const {
@@ -1600,7 +1596,6 @@
       case RawFunction::kMethodExtractor:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kInvokeClosureDispatcher:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 10a4034..797b523 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -28,6 +28,7 @@
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/zone.h"
 
@@ -353,8 +354,10 @@
 
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
-  ASSERT(Isolate::Current()->long_jump_base()->IsSafeToJump());
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->long_jump_base()->IsSafeToJump());
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   Parser parser(script, library, 0);
   parser.ParseTopLevel();
 }
@@ -702,8 +705,9 @@
 
 void Parser::ParseClass(const Class& cls) {
   if (!cls.is_synthesized_class()) {
-    TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
     Isolate* isolate = Isolate::Current();
+    VMTagScope tagScope(isolate, VMTag::kCompileTagId);
+    TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
     ASSERT(isolate->long_jump_base()->IsSafeToJump());
     const Script& script = Script::Handle(isolate, cls.script());
     const Library& lib = Library::Handle(isolate, cls.library());
@@ -760,9 +764,10 @@
 
 
 void Parser::ParseFunction(ParsedFunction* parsed_function) {
+  Isolate* isolate = Isolate::Current();
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
   CompilerStats::num_functions_compiled++;
-  Isolate* isolate = Isolate::Current();
   ASSERT(isolate->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
   const Function& func = parsed_function->function();
@@ -810,10 +815,6 @@
       node_sequence =
           parser.ParseInvokeFieldDispatcher(func, default_parameter_values);
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      node_sequence =
-          parser.ParseInvokeClosureDispatcher(func, default_parameter_values);
-      break;
     default:
       UNREACHABLE();
   }
@@ -1409,53 +1410,6 @@
 }
 
 
-SequenceNode* Parser::ParseInvokeClosureDispatcher(const Function& func,
-                                                   Array& default_values) {
-  TRACE_PARSER("ParseInvokeClosureDispatcher");
-
-  ASSERT(func.IsInvokeClosureDispatcher());
-  intptr_t token_pos = func.token_pos();
-  ASSERT(func.token_pos() == 0);
-  ASSERT(current_class().raw() == func.Owner());
-
-  const Array& args_desc = Array::Handle(func.saved_args_desc());
-  ArgumentsDescriptor desc(args_desc);
-  ASSERT(desc.Count() > 0);
-
-  // Set up scope for this function.
-  BuildDispatcherScope(func, desc, default_values);
-
-  // Receiver is local 0.
-  LocalScope* scope = current_block_->scope;
-  LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
-
-  // Pass arguments 1..n to the closure call.
-  ArgumentListNode* closure_args = new ArgumentListNode(token_pos);
-  const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld));
-  // Positional parameters.
-  intptr_t i = 1;
-  for (; i < desc.PositionalCount(); ++i) {
-    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-  }
-  // Named parameters.
-  for (; i < desc.Count(); i++) {
-    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-    intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(desc.NameAt(index)));
-  }
-  closure_args->set_names(names);
-
-  EnsureSavedCurrentContext();
-  ClosureCallNode* closure_call = new ClosureCallNode(token_pos,
-                                                      receiver,
-                                                      closure_args);
-
-  ReturnNode* return_node = new ReturnNode(token_pos, closure_call);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-
 void Parser::SkipBlock() {
   ASSERT(CurrentToken() == Token::kLBRACE);
   GrowableArray<Token::Kind> token_stack(8);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 97ff35f..8760eab 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -450,8 +450,6 @@
                                             Array& default_values);
   SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
                                            Array& default_values);
-  SequenceNode* ParseInvokeClosureDispatcher(const Function& func,
-                                             Array& default_values);
   void BuildDispatcherScope(const Function& func,
                             const ArgumentsDescriptor& desc,
                             Array& default_values);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 112183a..68de13c 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -201,13 +201,109 @@
   }
 };
 
+
 struct CallEntry {
   intptr_t code_table_index;
   intptr_t count;
 };
 
+
 typedef bool (*RegionCompare)(uword pc, uword region_start, uword region_end);
 
+
+class CodeRegionTrieNode : public ZoneAllocated {
+ public:
+  explicit CodeRegionTrieNode(intptr_t code_region_index)
+      : code_region_index_(code_region_index),
+        count_(0),
+        children_(new ZoneGrowableArray<CodeRegionTrieNode*>()) {
+  }
+
+  void Tick() {
+    ASSERT(code_region_index_ >= 0);
+    count_++;
+  }
+
+  intptr_t count() const {
+    ASSERT(code_region_index_ >= 0);
+    return count_;
+  }
+
+  intptr_t code_region_index() const {
+    return code_region_index_;
+  }
+
+  ZoneGrowableArray<CodeRegionTrieNode*>& children() const {
+    return *children_;
+  }
+
+  CodeRegionTrieNode* GetChild(intptr_t child_code_region_index) {
+    const intptr_t length = children_->length();
+    intptr_t i = 0;
+    while (i < length) {
+      CodeRegionTrieNode* child = (*children_)[i];
+      if (child->code_region_index() == child_code_region_index) {
+        return child;
+      }
+      if (child->code_region_index() > child_code_region_index) {
+        break;
+      }
+      i++;
+    }
+    // Add new CodeRegion, sorted by CodeRegionTable index.
+    CodeRegionTrieNode* child = new CodeRegionTrieNode(child_code_region_index);
+    if (i < length) {
+      // Insert at i.
+      children_->InsertAt(i, child);
+    } else {
+      // Add to end.
+      children_->Add(child);
+    }
+    return child;
+  }
+
+  // Sort this's children and (recursively) all descendants by count.
+  // This should only be called after the trie is completely built.
+  void SortByCount() {
+    children_->Sort(CodeRegionTrieNodeCompare);
+    ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+    intptr_t child_count = kids.length();
+    // Recurse.
+    for (intptr_t i = 0; i < child_count; i++) {
+      kids[i]->SortByCount();
+    }
+  }
+
+  void PrintToJSONArray(JSONArray* array) const {
+    ASSERT(array != NULL);
+    // Write CodeRegion index.
+    array->AddValue(code_region_index_);
+    // Write count.
+    array->AddValue(count_);
+    // Write number of children.
+    ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+    intptr_t child_count = kids.length();
+    array->AddValue(child_count);
+    // Recurse.
+    for (intptr_t i = 0; i < child_count; i++) {
+      kids[i]->PrintToJSONArray(array);
+    }
+  }
+
+ private:
+  static int CodeRegionTrieNodeCompare(CodeRegionTrieNode* const* a,
+                                       CodeRegionTrieNode* const* b) {
+    ASSERT(a != NULL);
+    ASSERT(b != NULL);
+    return (*b)->count() - (*a)->count();
+  }
+
+  const intptr_t code_region_index_;
+  intptr_t count_;
+  ZoneGrowableArray<CodeRegionTrieNode*>* children_;
+};
+
+
 // A contiguous address region that holds code. Each CodeRegion has a "kind"
 // which describes the type of code contained inside the region. Each
 // region covers the following interval: [start, end).
@@ -221,19 +317,19 @@
     kTagCode,        // A special kind of code representing a tag.
   };
 
-  CodeRegion(Kind kind, uword start, uword end, int64_t timestamp) :
-      kind_(kind),
-      start_(start),
-      end_(end),
-      inclusive_ticks_(0),
-      exclusive_ticks_(0),
-      inclusive_tick_serial_(0),
-      name_(NULL),
-      compile_timestamp_(timestamp),
-      creation_serial_(0),
-      address_table_(new ZoneGrowableArray<AddressEntry>()),
-      callers_table_(new ZoneGrowableArray<CallEntry>()),
-      callees_table_(new ZoneGrowableArray<CallEntry>()) {
+  CodeRegion(Kind kind, uword start, uword end, int64_t timestamp)
+      : kind_(kind),
+        start_(start),
+        end_(end),
+        inclusive_ticks_(0),
+        exclusive_ticks_(0),
+        inclusive_tick_serial_(0),
+        name_(NULL),
+        compile_timestamp_(timestamp),
+        creation_serial_(0),
+        address_table_(new ZoneGrowableArray<AddressEntry>()),
+        callers_table_(new ZoneGrowableArray<CallEntry>()),
+        callees_table_(new ZoneGrowableArray<CallEntry>()) {
     ASSERT(start_ < end_);
   }
 
@@ -346,12 +442,12 @@
     TickAddress(pc, exclusive);
   }
 
-  void AddCaller(intptr_t index) {
-    AddCallEntry(callers_table_, index);
+  void AddCaller(intptr_t index, intptr_t count) {
+    AddCallEntry(callers_table_, index, count);
   }
 
-  void AddCallee(intptr_t index) {
-    AddCallEntry(callees_table_, index);
+  void AddCallee(intptr_t index, intptr_t count) {
+    AddCallEntry(callees_table_, index, count);
   }
 
   void PrintNativeCode(JSONObject* profile_code_obj) {
@@ -417,6 +513,27 @@
     }
   }
 
+  void  PrintTagCode(JSONObject* profile_code_obj) {
+    ASSERT(kind() == kTagCode);
+    JSONObject obj(profile_code_obj, "code");
+    obj.AddProperty("type", "@Code");
+    obj.AddProperty("kind", "Tag");
+    obj.AddPropertyF("id", "code/tag-%" Px "", start());
+    obj.AddProperty("name", name());
+    obj.AddProperty("user_name", name());
+    obj.AddPropertyF("start", "%" Px "", start());
+    obj.AddPropertyF("end", "%" Px "", end());
+    {
+      // Generate a fake function entry.
+      JSONObject func(&obj, "function");
+      func.AddProperty("type", "@Function");
+      func.AddProperty("kind", "Tag");
+      obj.AddPropertyF("id", "functions/tag-%" Px "", start());
+      func.AddProperty("name", name());
+      func.AddProperty("user_name", name());
+    }
+  }
+
   void PrintToJSONArray(Isolate* isolate, JSONArray* events, bool full) {
     JSONObject obj(events);
     obj.AddProperty("type", "CodeRegion");
@@ -445,6 +562,13 @@
         GenerateAndSetSymbolName("[Reused]");
       }
       PrintOverwrittenCode(&obj);
+    } else if (kind() == kTagCode) {
+      if (name() == NULL) {
+        const char* tag_name = start() == 0 ? "root" : VMTag::TagName(start());
+        ASSERT(tag_name != NULL);
+        SetName(tag_name);
+      }
+      PrintTagCode(&obj);
     } else {
       ASSERT(kind() == kNativeCode);
       if (name() == NULL) {
@@ -511,13 +635,14 @@
   }
 
 
-  void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index) {
+  void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index,
+                    intptr_t count) {
     const intptr_t length = table->length();
     intptr_t i = 0;
     for (; i < length; i++) {
       CallEntry& entry = (*table)[i];
       if (entry.code_table_index == index) {
-        entry.count++;
+        entry.count += count;
         return;
       }
       if (entry.code_table_index > index) {
@@ -526,7 +651,7 @@
     }
     CallEntry entry;
     entry.code_table_index = index;
-    entry.count = 1;
+    entry.count = count;
     if (i < length) {
       table->InsertAt(i, entry);
     } else {
@@ -567,6 +692,7 @@
   DISALLOW_COPY_AND_ASSIGN(CodeRegion);
 };
 
+
 // A sorted table of CodeRegions. Does not allow for overlap.
 class CodeRegionTable : public ValueObject {
  public:
@@ -729,6 +855,8 @@
                      uword start, uword end) {
     // We should never see overlapping Dart code regions.
     ASSERT(region->kind() != CodeRegion::kDartCode);
+    // We should never see overlapping Tag code regions.
+    ASSERT(region->kind() != CodeRegion::kTagCode);
     // When code regions overlap, they should be of the same kind.
     ASSERT(region->kind() == code_region->kind());
     region->AdjustExtent(start, end);
@@ -771,14 +899,17 @@
  public:
   CodeRegionTableBuilder(Isolate* isolate,
                          CodeRegionTable* live_code_table,
-                         CodeRegionTable* dead_code_table)
+                         CodeRegionTable* dead_code_table,
+                         CodeRegionTable* tag_code_table)
       : SampleVisitor(isolate),
         live_code_table_(live_code_table),
         dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table),
         isolate_(isolate),
         vm_isolate_(Dart::vm_isolate()) {
     ASSERT(live_code_table_ != NULL);
     ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
     frames_ = 0;
     min_time_ = kMaxInt64;
     max_time_ = 0;
@@ -794,6 +925,8 @@
     if (timestamp < min_time_) {
       min_time_ = timestamp;
     }
+    // Make sure VM tag is created.
+    CreateTag(sample->vm_tag());
     // Exclusive tick for bottom frame.
     Tick(sample->At(0), true, timestamp);
     // Inclusive tick for all frames.
@@ -814,6 +947,45 @@
   int64_t  max_time() const { return max_time_; }
 
  private:
+  void CreateTag(uword tag) {
+    intptr_t index = tag_code_table_->FindIndex(tag);
+    if (index >= 0) {
+      // Already created.
+      return;
+    }
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+                                        tag,
+                                        tag + 1,
+                                        0);
+    index = tag_code_table_->InsertCodeRegion(region);
+    ASSERT(index >= 0);
+    region->set_creation_serial(visited());
+  }
+
+  void TickTag(uword tag, bool exclusive) {
+    CodeRegionTable::TickResult r;
+    intptr_t serial = exclusive ? -1 : visited();
+    r = tag_code_table_->Tick(tag, exclusive, serial, 0);
+    if (r == CodeRegionTable::kTicked) {
+      // Live code found and ticked.
+      return;
+    }
+    ASSERT(r == CodeRegionTable::kNotFound);
+    CreateAndTickTagCodeRegion(tag, exclusive, serial);
+  }
+
+  void CreateAndTickTagCodeRegion(uword tag, bool exclusive, intptr_t serial) {
+    // Need to create tag code.
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+                                        tag,
+                                        tag + 1,
+                                        0);
+    intptr_t index = tag_code_table_->InsertCodeRegion(region);
+    region->set_creation_serial(visited());
+    ASSERT(index >= 0);
+    tag_code_table_->At(index)->Tick(tag, exclusive, serial);
+  }
+
   void Tick(uword pc, bool exclusive, int64_t timestamp) {
     CodeRegionTable::TickResult r;
     intptr_t serial = exclusive ? -1 : visited();
@@ -913,53 +1085,82 @@
   int64_t max_time_;
   CodeRegionTable* live_code_table_;
   CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
   Isolate* isolate_;
   Isolate* vm_isolate_;
 };
 
 
-class CodeRegionTableCallersBuilder : public SampleVisitor {
+class CodeRegionExclusiveTrieBuilder : public SampleVisitor {
  public:
-  CodeRegionTableCallersBuilder(Isolate* isolate,
-                                CodeRegionTable* live_code_table,
-                                CodeRegionTable* dead_code_table)
+  CodeRegionExclusiveTrieBuilder(Isolate* isolate,
+                                 CodeRegionTable* live_code_table,
+                                 CodeRegionTable* dead_code_table,
+                                 CodeRegionTable* tag_code_table)
       : SampleVisitor(isolate),
         live_code_table_(live_code_table),
-        dead_code_table_(dead_code_table) {
+        dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table) {
     ASSERT(live_code_table_ != NULL);
     ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
     dead_code_table_offset_ = live_code_table_->Length();
+    tag_code_table_offset_ = dead_code_table_offset_ +
+                             dead_code_table_->Length();
+    intptr_t root_index = tag_code_table_->FindIndex(0);
+    // Verify that the "0" tag does not exist.
+    ASSERT(root_index < 0);
+    // Insert the dummy tag CodeRegion that is used for the Trie root.
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode, 0, 1, 0);
+    root_index = tag_code_table_->InsertCodeRegion(region);
+    ASSERT(root_index >= 0);
+    region->set_creation_serial(0);
+    root_ = new CodeRegionTrieNode(tag_code_table_offset_ + root_index);
+    // Use tags by default.
+    set_use_tags(true);
   }
 
   void VisitSample(Sample* sample) {
-    int64_t timestamp = sample->timestamp();
-    intptr_t current_index = FindFinalIndex(sample->At(0), timestamp);
-    ASSERT(current_index >= 0);
-    CodeRegion* current = At(current_index);
-    intptr_t caller_index = -1;
-    CodeRegion* caller = NULL;
-    intptr_t callee_index = -1;
-    CodeRegion* callee = NULL;
-    for (intptr_t i = 1; i < FLAG_profile_depth; i++) {
+    // Give the root a tick.
+    root_->Tick();
+    CodeRegionTrieNode* current = root_;
+    if (use_tags()) {
+      intptr_t tag_index = FindTagIndex(sample->vm_tag());
+      current = current->GetChild(tag_index);
+      // Give the tag a tick.
+      current->Tick();
+    }
+    // Walk the sampled PCs.
+    for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
       if (sample->At(i) == 0) {
         break;
       }
-      caller_index = FindFinalIndex(sample->At(i), timestamp);
-      ASSERT(caller_index >= 0);
-      caller = At(caller_index);
-      current->AddCaller(caller_index);
-      if (callee != NULL) {
-        current->AddCallee(callee_index);
-      }
-      // Move cursors.
-      callee_index = current_index;
-      callee = current;
-      current_index = caller_index;
-      current = caller;
+      intptr_t index = FindFinalIndex(sample->At(i), sample->timestamp());
+      current = current->GetChild(index);
+      current->Tick();
     }
   }
 
+  CodeRegionTrieNode* root() const {
+    return root_;
+  }
+
+  bool use_tags() const {
+    return use_tags_;
+  }
+
+  void set_use_tags(bool use_tags) {
+    use_tags_ = use_tags;
+  }
+
  private:
+  intptr_t FindTagIndex(uword tag) const {
+    intptr_t index = tag_code_table_->FindIndex(tag);
+    ASSERT(index >= 0);
+    ASSERT((tag_code_table_->At(index))->contains(tag));
+    return tag_code_table_offset_ + index;
+  }
+
   intptr_t FindFinalIndex(uword pc, int64_t timestamp) const {
     intptr_t index = live_code_table_->FindIndex(pc);
     ASSERT(index >= 0);
@@ -978,22 +1179,80 @@
     return index;
   }
 
+  bool use_tags_;
+  CodeRegionTrieNode* root_;
+  CodeRegionTable* live_code_table_;
+  CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
+  intptr_t dead_code_table_offset_;
+  intptr_t tag_code_table_offset_;
+};
+
+
+class CodeRegionTableCallersBuilder {
+ public:
+  CodeRegionTableCallersBuilder(CodeRegionTrieNode* exclusive_root,
+                                CodeRegionTable* live_code_table,
+                                CodeRegionTable* dead_code_table,
+                                CodeRegionTable* tag_code_table)
+      : exclusive_root_(exclusive_root),
+        live_code_table_(live_code_table),
+        dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table) {
+    ASSERT(exclusive_root_ != NULL);
+    ASSERT(live_code_table_ != NULL);
+    ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
+    dead_code_table_offset_ = live_code_table_->Length();
+    tag_code_table_offset_ = dead_code_table_offset_ +
+                             dead_code_table_->Length();
+  }
+
+  void Build() {
+    ProcessNode(exclusive_root_);
+  }
+
+ private:
+  void ProcessNode(CodeRegionTrieNode* parent) {
+    const ZoneGrowableArray<CodeRegionTrieNode*>& children = parent->children();
+    intptr_t parent_index = parent->code_region_index();
+    ASSERT(parent_index >= 0);
+    CodeRegion* parent_region = At(parent_index);
+    ASSERT(parent_region != NULL);
+    for (intptr_t i = 0; i < children.length(); i++) {
+      CodeRegionTrieNode* node = children[i];
+      ProcessNode(node);
+      intptr_t index = node->code_region_index();
+      ASSERT(index >= 0);
+      CodeRegion* region = At(index);
+      ASSERT(region != NULL);
+      region->AddCallee(parent_index, node->count());
+      parent_region->AddCaller(index, node->count());
+    }
+  }
+
   CodeRegion* At(intptr_t final_index) {
     ASSERT(final_index >= 0);
     if (final_index < dead_code_table_offset_) {
       return live_code_table_->At(final_index);
-    } else {
+    } else if (final_index < tag_code_table_offset_) {
       return dead_code_table_->At(final_index - dead_code_table_offset_);
+    } else {
+      return tag_code_table_->At(final_index - tag_code_table_offset_);
     }
   }
 
+  CodeRegionTrieNode* exclusive_root_;
   CodeRegionTable* live_code_table_;
   CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
   intptr_t dead_code_table_offset_;
+  intptr_t tag_code_table_offset_;
 };
 
+
 void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                 bool full) {
+                                 bool full, bool use_tags) {
   ASSERT(isolate == Isolate::Current());
   // Disable profile interrupts while processing the buffer.
   EndExecution(isolate);
@@ -1014,12 +1273,15 @@
       CodeRegionTable live_code_table;
       // Dead code holds Overwritten CodeRegions.
       CodeRegionTable dead_code_table;
+      // Tag code holds Tag CodeRegions.
+      CodeRegionTable tag_code_table;
       CodeRegionTableBuilder builder(isolate,
                                      &live_code_table,
-                                     &dead_code_table);
+                                     &dead_code_table,
+                                     &tag_code_table);
       {
         // Build CodeRegion tables.
-        ScopeStopwatch sw("CodeTableBuild");
+        ScopeStopwatch sw("CodeRegionTableBuilder");
         sample_buffer->VisitSamples(&builder);
       }
       intptr_t samples = builder.visited();
@@ -1027,25 +1289,40 @@
       if (FLAG_trace_profiled_isolates) {
         intptr_t total_live_code_objects = live_code_table.Length();
         intptr_t total_dead_code_objects = dead_code_table.Length();
+        intptr_t total_tag_code_objects = tag_code_table.Length();
         OS::Print("Processed %" Pd " frames\n", frames);
-        OS::Print("CodeTables: live=%" Pd " dead=%" Pd "\n",
+        OS::Print("CodeTables: live=%" Pd " dead=%" Pd " tag=%" Pd "\n",
                   total_live_code_objects,
-                  total_dead_code_objects);
+                  total_dead_code_objects,
+                  total_tag_code_objects);
       }
 #if defined(DEBUG)
       live_code_table.Verify();
       dead_code_table.Verify();
+      tag_code_table.Verify();
       if (FLAG_trace_profiled_isolates) {
         OS::Print("CodeRegionTables verified to be ordered and not overlap.\n");
       }
 #endif
-      CodeRegionTableCallersBuilder build_callers(isolate,
+      CodeRegionExclusiveTrieBuilder build_trie(isolate,
+                                                &live_code_table,
+                                                &dead_code_table,
+                                                &tag_code_table);
+      build_trie.set_use_tags(use_tags);
+      {
+        // Build CodeRegion trie.
+        ScopeStopwatch sw("CodeRegionExclusiveTrieBuilder");
+        sample_buffer->VisitSamples(&build_trie);
+        build_trie.root()->SortByCount();
+      }
+      CodeRegionTableCallersBuilder build_callers(build_trie.root(),
                                                   &live_code_table,
-                                                  &dead_code_table);
+                                                  &dead_code_table,
+                                                  &tag_code_table);
       {
         // Build CodeRegion callers.
-        ScopeStopwatch sw("CodeTableCallersBuild");
-        sample_buffer->VisitSamples(&build_callers);
+        ScopeStopwatch sw("CodeRegionTableCallersBuilder");
+        build_callers.Build();
       }
       {
         ScopeStopwatch sw("CodeTableStream");
@@ -1054,7 +1331,15 @@
         obj.AddProperty("type", "Profile");
         obj.AddProperty("id", "profile");
         obj.AddProperty("samples", samples);
+        obj.AddProperty("depth", static_cast<intptr_t>(FLAG_profile_depth));
+        obj.AddProperty("period", static_cast<intptr_t>(FLAG_profile_period));
         obj.AddProperty("time_delta_micros", builder.TimeDeltaMicros());
+        {
+          JSONArray exclusive_trie(&obj, "exclusive_trie");
+          CodeRegionTrieNode* root = build_trie.root();
+          ASSERT(root != NULL);
+          root->PrintToJSONArray(&exclusive_trie);
+        }
         JSONArray codes(&obj, "codes");
         for (intptr_t i = 0; i < live_code_table.Length(); i++) {
           CodeRegion* region = live_code_table.At(i);
@@ -1066,6 +1351,11 @@
           ASSERT(region != NULL);
           region->PrintToJSONArray(isolate, &codes, full);
         }
+        for (intptr_t i = 0; i < tag_code_table.Length(); i++) {
+          CodeRegion* region = tag_code_table.At(i);
+          ASSERT(region != NULL);
+          region->PrintToJSONArray(isolate, &codes, full);
+        }
       }
     }
   }
@@ -1096,7 +1386,7 @@
   ASSERT(Isolate::Current() == isolate);
   JSONStream stream(10 * MB);
   intptr_t pid = OS::ProcessId();
-  PrintToJSONStream(isolate, &stream, true);
+  PrintToJSONStream(isolate, &stream, true, false);
   const char* format = "%s/dart-profile-%" Pd "-%" Pd ".json";
   intptr_t len = OS::SNPrint(NULL, 0, format,
                              FLAG_profile_dir, pid, isolate->main_port());
@@ -1165,11 +1455,13 @@
     ASSERT(sample_ != NULL);
   }
 
-  int walk(Heap* heap) {
+  int walk(Heap* heap, uword vm_tag) {
     const intptr_t kMaxStep = 0x1000;  // 4K.
     const bool kWalkStack = true;  // Walk the stack.
     // Always store the exclusive PC.
     sample_->SetAt(0, original_pc_);
+    // Always store the vm tag.
+    sample_->set_vm_tag(vm_tag);
     if (!kWalkStack) {
       // Not walking the stack, only took exclusive sample.
       return 1;
@@ -1287,7 +1579,7 @@
   }
   ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
                                         state.pc, state.fp, state.sp);
-  stackWalker.walk(isolate->heap());
+  stackWalker.walk(isolate->heap(), isolate->vm_tag());
 }
 
 
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 9fb098a..81dccd0 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -8,6 +8,7 @@
 #include "vm/allocation.h"
 #include "vm/code_observers.h"
 #include "vm/globals.h"
+#include "vm/tags.h"
 #include "vm/thread.h"
 #include "vm/thread_interrupter.h"
 
@@ -37,7 +38,7 @@
   static void EndExecution(Isolate* isolate);
 
   static void PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                bool full);
+                                bool full, bool use_tags);
   static void WriteProfile(Isolate* isolate);
 
   static SampleBuffer* sample_buffer() {
@@ -109,6 +110,7 @@
     timestamp_ = timestamp;
     tid_ = tid;
     isolate_ = isolate;
+    vm_tag_ = VMTag::kInvalidTagId;
     for (intptr_t i = 0; i < kSampleFramesSize; i++) {
       pcs_[i] = 0;
     }
@@ -138,10 +140,19 @@
     pcs_[i] = pc;
   }
 
+  uword vm_tag() const {
+    return vm_tag_;
+  }
+  void set_vm_tag(uword tag) {
+    ASSERT(tag != VMTag::kInvalidTagId);
+    vm_tag_ = tag;
+  }
+
  private:
   int64_t timestamp_;
   ThreadId tid_;
   Isolate* isolate_;
+  uword vm_tag_;
   uword pcs_[kSampleFramesSize];
 };
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 087be7d..fcb27ab 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -592,7 +592,6 @@
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,  // invokes a field as a closure.
-    kInvokeClosureDispatcher  // invokes this as a closure (implements .call)
   };
 
  private:
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 1903e4b..ece6c70 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -14,6 +14,7 @@
 #include "vm/debugger.h"
 #include "vm/isolate.h"
 #include "vm/message.h"
+#include "vm/message_handler.h"
 #include "vm/native_entry.h"
 #include "vm/native_arguments.h"
 #include "vm/object.h"
@@ -263,6 +264,9 @@
   if (isolate == NULL) {
     return NULL;
   }
+  // We don't want to pause the service isolate.
+  isolate->message_handler()->set_pause_on_start(false);
+  isolate->message_handler()->set_pause_on_exit(false);
   Isolate::SetCurrent(isolate);
   {
     // Install the dart:vmservice library.
@@ -366,6 +370,11 @@
   MessageWriter writer(&data, &allocator);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
+  if (FLAG_trace_service) {
+    OS::Print("Isolate %s %" Pd64 " registered with service \n",
+              name.ToCString(),
+              Dart_GetMainPortId());
+  }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
 }
@@ -378,15 +387,22 @@
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   HANDLESCOPE(isolate);
+  const String& name = String::Handle(String::New(isolate->name()));
+  ASSERT(!name.IsNull());
   const Array& list = Array::Handle(
       MakeServiceControlMessage(Dart_GetMainPortId(),
                                 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
-                                String::Handle(String::null())));
+                                name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
+  if (FLAG_trace_service) {
+    OS::Print("Isolate %s %" Pd64 " deregistered with service \n",
+              name.ToCString(),
+              Dart_GetMainPortId());
+  }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
 }
@@ -802,6 +818,29 @@
 }
 
 
+static bool HandleClassesEval(Isolate* isolate, const Class& cls,
+                              JSONStream* js) {
+  if (js->num_arguments() > 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  const char* expr = js->LookupOption("expr");
+  if (expr == NULL) {
+    PrintError(js, "eval expects an 'expr' option\n",
+               js->num_arguments());
+    return true;
+  }
+  const String& expr_str = String::Handle(isolate, String::New(expr));
+  const Object& result = Object::Handle(cls.Evaluate(expr_str));
+  if (result.IsNull()) {
+    Object::null_instance().PrintToJSONStream(js, true);
+  } else {
+    result.PrintToJSONStream(js, true);
+  }
+  return true;
+}
+
+
 static bool HandleClassesDispatchers(Isolate* isolate, const Class& cls,
                                      JSONStream* js) {
   intptr_t id;
@@ -912,7 +951,9 @@
     return true;
   } else if (js->num_arguments() >= 3) {
     const char* second = js->GetArgument(2);
-    if (strcmp(second, "closures") == 0) {
+    if (strcmp(second, "eval") == 0) {
+      return HandleClassesEval(isolate, cls, js);
+    } else if (strcmp(second, "closures") == 0) {
       return HandleClassesClosures(isolate, cls, js);
     } else if (strcmp(second, "fields") == 0) {
       return HandleClassesFields(isolate, cls, js);
@@ -932,6 +973,29 @@
 }
 
 
+static bool HandleLibrariesEval(Isolate* isolate, const Library& lib,
+                                JSONStream* js) {
+  if (js->num_arguments() > 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  const char* expr = js->LookupOption("expr");
+  if (expr == NULL) {
+    PrintError(js, "eval expects an 'expr' option\n",
+               js->num_arguments());
+    return true;
+  }
+  const String& expr_str = String::Handle(isolate, String::New(expr));
+  const Object& result = Object::Handle(lib.Evaluate(expr_str));
+  if (result.IsNull()) {
+    Object::null_instance().PrintToJSONStream(js, true);
+  } else {
+    result.PrintToJSONStream(js, true);
+  }
+  return true;
+}
+
+
 static bool HandleLibraries(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): Support fields and functions on libraries.
   REQUIRE_COLLECTION_ID("libraries");
@@ -944,7 +1008,19 @@
   Library& lib = Library::Handle();
   lib ^= libs.At(id);
   ASSERT(!lib.IsNull());
-  lib.PrintToJSONStream(js, false);
+  if (js->num_arguments() == 2) {
+    lib.PrintToJSONStream(js, false);
+    return true;
+  } else if (js->num_arguments() >= 3) {
+    const char* second = js->GetArgument(2);
+    if (strcmp(second, "eval") == 0) {
+      return HandleLibrariesEval(isolate, lib, js);
+    } else {
+      PrintError(js, "Invalid sub collection %s", second);
+      return true;
+    }
+  }
+  UNREACHABLE();
   return true;
 }
 
@@ -1113,7 +1189,11 @@
     ASSERT(obj.IsInstance());
     const Instance& instance = Instance::Cast(obj);
     const Object& result = Object::Handle(instance.Evaluate(expr_str));
-    result.PrintToJSONStream(js, true);
+    if (result.IsNull()) {
+      Object::null_instance().PrintToJSONStream(js, true);
+    } else {
+      result.PrintToJSONStream(js, true);
+    }
     return true;
   }
 
@@ -1310,7 +1390,16 @@
   // A full profile includes disassembly of all Dart code objects.
   // TODO(johnmccutchan): Add sub command to trigger full code dump.
   bool full_profile = false;
-  Profiler::PrintToJSONStream(isolate, js, full_profile);
+  const char* tags_option = js->LookupOption("tags");
+  bool use_tags = true;
+  if (tags_option != NULL) {
+    if (strcmp("hide", tags_option) != 0) {
+      PrintError(js, "Invalid tags option value: %s\n", tags_option);
+      return true;
+    }
+    use_tags = false;
+  }
+  Profiler::PrintToJSONStream(isolate, js, full_profile, use_tags);
   return true;
 }
 
@@ -1341,9 +1430,16 @@
 }
 
 
-static bool HandleUnpin(Isolate* isolate, JSONStream* js) {
+static bool HandleResume(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): What do I respond with??
-  isolate->ClosePinPort();
+  if (isolate->message_handler()->pause_on_start()) {
+    isolate->message_handler()->set_pause_on_start(false);
+    return true;
+  }
+  if (isolate->message_handler()->pause_on_exit()) {
+    isolate->message_handler()->set_pause_on_exit(false);
+    return true;
+  }
   return true;
 }
 
@@ -1367,7 +1463,7 @@
   { "libraries", HandleLibraries },
   { "objects", HandleObjects },
   { "profile", HandleProfile },
-  { "unpin", HandleUnpin },
+  { "resume", HandleResume },
   { "scripts", HandleScripts },
   { "stacktrace", HandleStackTrace },
 };
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 7c16a22..88d5ef8 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -497,6 +497,17 @@
       "\"user_name\":\"int\"},\"preview\":\"222\"}",
       handler.msg());
 
+  // eval returning null works
+  service_msg = Eval(lib,
+                     "[port, ['objects', 'int-123', 'eval'], "
+                     "['expr'], ['null']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Null\",\"id\":\"objects\\/null\",\"preview\":\"null\"}",
+      handler.msg());
+
   // object id ring / invalid => expired
   service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], "
                      "['expr'], ['this']]");
@@ -526,6 +537,64 @@
 }
 
 
+TEST_CASE(Service_Libraries) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "var libVar = 54321;\n"
+      "\n"
+      "main() {\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());
+
+  // Find the current library.
+  intptr_t lib_id = -1;
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    if (libs.At(i) == lib.raw()) {
+      lib_id = i;
+    }
+  }
+  ASSERT(lib_id > 0);
+
+  // 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, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+
+  // Request library.
+  service_msg = EvalF(h_lib,
+                      "[port, ['libraries', '%" Pd "'], [], []]", lib_id);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
+  EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg());
+
+  // Evaluate an expression from a library.
+  service_msg = EvalF(h_lib,
+                      "[port, ['libraries', '%" Pd "', 'eval'], "
+                      "['expr'], ['libVar - 1']]", lib_id);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-54320\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"54320\"}",
+      handler.msg());
+}
+
 
 TEST_CASE(Service_Classes) {
   const char* kScript =
@@ -533,6 +602,7 @@
       "\n"
       "class A {\n"
       "  var a;\n"
+      "  static var cobra = 11235;\n"
       "  dynamic b() {}\n"
       "  dynamic c() {\n"
       "    var d = () { b(); };\n"
@@ -581,11 +651,24 @@
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
 
+  // Evaluate an expression from class A.
+  service_msg = EvalF(h_lib,
+                      "[port, ['classes', '%" Pd "', 'eval'], "
+                      "['expr'], ['cobra + 100000']]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-111235\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"111235\"}",
+      handler.msg());
+
+  // Request function 0 from class A.
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1024,4 +1107,51 @@
   EXPECT_STREQ("beta", handler.msg());
 }
 
+TEST_CASE(Service_Profile) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\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, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, "[port, ['profile'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect profile
+  EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+  service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hide']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect profile
+  EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+  service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hidden']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect error.
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+}
+
 }  // namespace dart
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index f2949adf..ef2bd1e 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -43,8 +43,9 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -26;
-static const int kExitLinkSlotFromEntryFp = -25;
+static const int kSavedContextSlotFromEntryFp = -27;
+static const int kExitLinkSlotFromEntryFp = -26;
+static const int kSavedVMTagSlotFromEntryFp = -25;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index f36863b..b7d5997 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -42,8 +42,9 @@
 static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -5;
-static const int kExitLinkSlotFromEntryFp = -4;
+static const int kSavedContextSlotFromEntryFp = -6;
+static const int kExitLinkSlotFromEntryFp = -5;
+static const int kSavedVMTagSlotFromEntryFp = -4;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index 84f8dc7..94c8c25 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -41,8 +41,9 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -23;
-static const int kExitLinkSlotFromEntryFp = -22;
+static const int kSavedContextSlotFromEntryFp = -24;
+static const int kExitLinkSlotFromEntryFp = -23;
+static const int kSavedVMTagSlotFromEntryFp = -22;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index dcd964a..d85e8ec 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,8 +45,9 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -9;
-static const int kExitLinkSlotFromEntryFp = -8;
+static const int kSavedContextSlotFromEntryFp = -10;
+static const int kExitLinkSlotFromEntryFp = -9;
+static const int kSavedVMTagSlotFromEntryFp = -8;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index aa913be..602253a 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -20,8 +20,8 @@
 // List of stubs created in the VM isolate, these stubs are shared by different
 // isolates running in this dart process.
 #define VM_STUB_CODE_LIST(V)                                                   \
-  V(CallToRuntime)                                                             \
   V(PrintStopMessage)                                                          \
+  V(CallToRuntime)                                                             \
   V(CallBootstrapCFunction)                                                    \
   V(CallNativeCFunction)                                                       \
   V(AllocateArray)                                                             \
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index ea1334f..6b40a5c 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -15,6 +15,7 @@
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -24,7 +25,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -58,6 +58,21 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ LoadImmediate(R6, VMTag::kVMTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
   ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -85,6 +100,10 @@
   // Call runtime or redirection via simulator.
   __ blx(R5);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -154,6 +173,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // R0) and align frame before entering the C++ world.
@@ -207,6 +241,10 @@
 
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -257,6 +295,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // R0) and align frame before entering the C++ world.
@@ -288,6 +341,10 @@
   // Call native function or redirection via simulator.
   __ blx(R5);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -837,6 +894,15 @@
   // Load Isolate pointer from Context structure into temporary register R8.
   __ ldr(R8, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -25);
+  __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+  __ Push(R5);
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R5, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+
   // Save the top exit frame info. Use R5 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ LoadFromOffset(kWord, R5, R8, Isolate::top_exit_frame_info_offset());
@@ -852,8 +918,8 @@
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -25);
-  ASSERT(kSavedContextSlotFromEntryFp == -26);
+  ASSERT(kExitLinkSlotFromEntryFp == -26);
+  ASSERT(kSavedContextSlotFromEntryFp == -27);
   __ PushList((1 << R4) | (1 << R5));
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -903,6 +969,10 @@
   __ StoreToOffset(kWord, R4, CTX, Isolate::top_context_offset());
   __ StoreToOffset(kWord, R5, CTX, Isolate::top_exit_frame_info_offset());
 
+  // Restore the current VMTag from the stack.
+  __ Pop(R4);
+  __ StoreToOffset(kWord, R4, CTX, Isolate::vm_tag_offset());
+
   // Restore C++ ABI callee-saved registers.
   // Restore FPU registers. 2 D registers per Q register.
   __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 525e8ce..edc3f12 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -16,6 +16,7 @@
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 
 #define __ assembler->
@@ -26,7 +27,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -58,6 +58,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ movl(CTX, EAX);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EAX, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EAX, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
   // Reserve space for arguments and align frame before entering C++ world.
   __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments)));
   if (OS::ActivationFrameAlignment() > 1) {
@@ -75,6 +89,10 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -148,6 +166,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movl(CTX, EDI);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure, the outgoing parameters
   // (pointer to the native arguments structure, the C function entry point)
   // and align frame before entering the C++ world.
@@ -177,6 +210,10 @@
   __ call(ECX);
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -229,6 +266,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movl(CTX, EDI);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure, the outgoing parameter
   // (pointer to the native arguments structure) and align frame before
   // entering the C++ world.
@@ -247,6 +299,10 @@
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
   __ call(ECX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -816,11 +872,20 @@
   // Load Isolate pointer from Context structure into EDI.
   __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -4);
+  __ movl(ECX, Address(EDI, Isolate::vm_tag_offset()));
+  __ pushl(ECX);
+
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(EDI, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Save the top exit frame info. Use EDX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -4);
+  ASSERT(kExitLinkSlotFromEntryFp == -5);
   __ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset()));
   __ pushl(EDX);
   __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -832,7 +897,7 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -5);
+  ASSERT(kSavedContextSlotFromEntryFp == -6);
   __ movl(ECX, Address(EDI, Isolate::top_context_offset()));
   __ pushl(ECX);
 
@@ -892,6 +957,10 @@
   __ popl(EDX);
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), EDX);
 
+  // Restore the current VMTag from the stack.
+  __ popl(ECX);
+  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+
   // Restore C++ ABI callee-saved registers.
   __ popl(EDI);
   __ popl(ESI);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ad15047..17ed5e6 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -15,6 +15,7 @@
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -24,7 +25,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -62,6 +62,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ LoadImmediate(T0, VMTag::kVMTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
   ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -96,6 +110,10 @@
   __ delay_slot()->addiu(A3, A2, Immediate(kWordSize));
   __ TraceSimMsg("CallToRuntimeStub return");
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -171,6 +189,20 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
@@ -231,6 +263,10 @@
 
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -287,6 +323,20 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
@@ -324,6 +374,10 @@
   __ jalr(T9);
   __ TraceSimMsg("CallNativeCFunctionStub return");
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -945,8 +999,8 @@
 
   // Save new context and C++ ABI callee-saved registers.
 
-  // The new context, the top exit frame, and the old context.
-  const intptr_t kPreservedContextSlots = 3;
+  // The new context, saved vm tag, the top exit frame, and the old context.
+  const intptr_t kPreservedContextSlots = 4;
   const intptr_t kNewContextOffsetFromFp =
       -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
   const intptr_t kPreservedRegSpace =
@@ -969,7 +1023,7 @@
     __ swc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ sw(A3, Address(SP, 2 * kWordSize));
+  __ sw(A3, Address(SP, 3 * kWordSize));
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -988,6 +1042,15 @@
   // Load Isolate pointer from Context structure into temporary register R8.
   __ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -22);
+  __ lw(T1, Address(T2, Isolate::vm_tag_offset()));
+  __ sw(T1, Address(SP, 2 * kWordSize));
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(T0, VMTag::kScriptTagId);
+  __ sw(T0, Address(T2, Isolate::vm_tag_offset()));
+
   // Save the top exit frame info. Use T0 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
@@ -1002,8 +1065,8 @@
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -22);
-  ASSERT(kSavedContextSlotFromEntryFp == -23);
+  ASSERT(kExitLinkSlotFromEntryFp == -23);
+  ASSERT(kSavedContextSlotFromEntryFp == -24);
   __ sw(T0, Address(SP, 1 * kWordSize));
   __ sw(T1, Address(SP, 0 * kWordSize));
 
@@ -1052,6 +1115,10 @@
   // Load Isolate pointer from Context structure into CTX. Drop Context.
   __ lw(CTX, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Restore the current VMTag from the stack.
+  __ lw(T1, Address(SP, 2 * kWordSize));
+  __ sw(T1, Address(CTX, Isolate::vm_tag_offset()));
+
   // Restore the saved Context pointer into the Isolate structure.
   // Uses T1 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
@@ -1077,7 +1144,7 @@
     __ lwc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ lw(A3, Address(SP, 2 * kWordSize));
+  __ lw(A3, Address(SP, 3 * kWordSize));
   __ addiu(SP, SP, Immediate(kPreservedRegSpace));
 
   // Restore the frame pointer and return.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a079813..0580f513 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -16,7 +16,7 @@
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
-
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -26,7 +26,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -59,6 +58,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ movq(CTX, RAX);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(RAX, Immediate(VMTag::kScriptTagId));
+    __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
   // Reserve space for arguments and align frame before entering C++ world.
   __ subq(RSP, Immediate(sizeof(NativeArguments)));
   if (OS::ActivationFrameAlignment() > 1) {
@@ -76,6 +89,10 @@
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
   __ call(RBX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -140,12 +157,27 @@
   // to transition to native code.
   __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
 
-  // Save current Context pointer into Isolate structure.
+// Save current Context pointer into Isolate structure.
   __ movq(Address(R8, Isolate::top_context_offset()), CTX);
 
   // Cache Isolate pointer into CTX while executing native code.
   __ movq(CTX, R8);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(R8, Immediate(VMTag::kScriptTagId));
+    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // RDI) and align frame before entering the C++ world.
@@ -174,6 +206,10 @@
   __ call(RBX);
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -224,6 +260,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movq(CTX, R8);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(R8, Immediate(VMTag::kScriptTagId));
+    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // RDI) and align frame before entering the C++ world.
@@ -241,6 +292,10 @@
   __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
   __ call(RBX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -820,11 +875,20 @@
   // Load Isolate pointer from Context structure into R8.
   __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -8);
+  __ movq(RAX, Address(R8, Isolate::vm_tag_offset()));
+  __ pushq(RAX);
+
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(R8, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Save the top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -8);
+  ASSERT(kExitLinkSlotFromEntryFp == -9);
   __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
   __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -836,7 +900,7 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -9);
+  ASSERT(kSavedContextSlotFromEntryFp == -10);
   __ movq(RAX, Address(R8, Isolate::top_context_offset()));
   __ pushq(RAX);
 
@@ -893,6 +957,10 @@
   __ popq(RDX);
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
 
+  // Restore the current VMTag from the stack.
+  __ popq(RDX);
+  __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
+
   // Restore C++ ABI callee-saved registers.
   __ popq(R15);
   __ popq(R14);
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
new file mode 100644
index 0000000..84b40f4
--- /dev/null
+++ b/runtime/vm/tags.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "vm/tags.h"
+
+#include "vm/isolate.h"
+
+namespace dart {
+
+const char* VMTag::TagName(uword id) {
+  ASSERT(id != kInvalidTagId);
+  ASSERT(id < kNumVMTags);
+  const TagEntry& entry = entries_[id];
+  ASSERT(entry.id == id);
+  return entry.name;
+}
+
+
+VMTag::TagEntry VMTag::entries_[] = {
+  { "InvalidTag", kInvalidTagId, },
+#define DEFINE_VM_TAG_ENTRY(tag)                                               \
+  { ""#tag, k##tag##TagId },
+  VM_TAG_LIST(DEFINE_VM_TAG_ENTRY)
+#undef DEFINE_VM_TAG_ENTRY
+  { "kNumVMTags", kNumVMTags },
+};
+
+
+VMTagScope::VMTagScope(Isolate* base_isolate, uword tag)
+    : StackResource(base_isolate) {
+  ASSERT(isolate() != NULL);
+  previous_tag_ = isolate()->vm_tag();
+  isolate()->set_vm_tag(tag);
+}
+
+
+VMTagScope::~VMTagScope() {
+  ASSERT(isolate() != NULL);
+  isolate()->set_vm_tag(previous_tag_);
+}
+
+
+}  // namespace dart
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
new file mode 100644
index 0000000..98be468
--- /dev/null
+++ b/runtime/vm/tags.h
@@ -0,0 +1,58 @@
+// 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.
+
+#ifndef VM_TAGS_H_
+#define VM_TAGS_H_
+
+#include "vm/allocation.h"
+
+class Isolate;
+
+namespace dart {
+
+#define VM_TAG_LIST(V)                                                         \
+  V(VM) /* Catch all */                                                        \
+  V(Compile)                                                                   \
+  V(Script)                                                                    \
+  V(GCNewSpace)                                                                \
+  V(GCOldSpace)                                                                \
+  V(RuntimeNative)                                                             \
+  V(Idle)                                                                      \
+
+
+class VMTag : public AllStatic {
+ public:
+  enum VMTagId {
+    kInvalidTagId = 0,
+#define DEFINE_VM_TAG_ID(tag)                                                  \
+    k##tag##TagId,
+    VM_TAG_LIST(DEFINE_VM_TAG_ID)
+#undef DEFINE_VM_TAG_KIND
+    kNumVMTags,
+  };
+
+  static const char* TagName(uword id);
+
+ private:
+  struct TagEntry {
+    const char* name;
+    uword id;
+  };
+  static TagEntry entries_[];
+};
+
+class VMTagScope : StackResource {
+ public:
+  VMTagScope(Isolate* isolate, uword tag);
+  ~VMTagScope();
+ private:
+  uword previous_tag_;
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(VMTagScope);
+};
+
+}  // namespace dart
+
+#endif  // VM_TAGS_H_
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 2481ac61..94434e2 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -350,6 +350,8 @@
     'stub_code_x64_test.cc',
     'symbols.cc',
     'symbols.h',
+    'tags.cc',
+    'tags.h',
     'thread.h',
     'thread_interrupter.cc',
     'thread_interrupter.h',
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 72b7b3d..76de97a 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -43,7 +43,8 @@
       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 ThisElement(element, compiler.types.dynamicType));
       } else {
         assert(element.isField());
         VariableElement field = element;
@@ -53,7 +54,8 @@
         } else {
           assert(element.isInstanceMember());
           closureMappingCache[node] =
-              new ClosureClassMap(null, null, null, new ThisElement(element));
+              new ClosureClassMap(null, null, null,
+                  new ThisElement(element, compiler.types.dynamicType));
         }
       }
       assert(closureMappingCache[node] != null);
@@ -77,7 +79,7 @@
 // more general solution.
 class ClosureFieldElement extends ElementX implements VariableElement {
   /// The source variable this element refers to.
-  final Element variableElement;
+  final TypedElement variableElement;
 
   ClosureFieldElement(String name,
                       this.variableElement,
@@ -94,9 +96,11 @@
   bool isAssignable() => false;
 
   DartType computeType(Compiler compiler) {
-    return variableElement.computeType(compiler);
+    return variableElement.type;
   }
 
+  DartType get type => variableElement.type;
+
   String toString() => "ClosureFieldElement($name)";
 
   accept(ElementVisitor visitor) => visitor.visitClosureFieldElement(this);
@@ -128,12 +132,12 @@
         ? compiler.boundClosureClass
         : compiler.closureClass;
     superclass.ensureResolved(compiler);
-    supertype = superclass.computeType(compiler);
+    supertype = superclass.thisType;
     interfaces = const Link<DartType>();
     thisType = rawType = new InterfaceType(this);
     allSupertypesAndSelf =
         superclass.allSupertypesAndSelf.extendClass(thisType);
-    callType = methodElement.computeType(compiler);
+    callType = methodElement.type;
   }
 
   bool isClosure() => true;
@@ -145,7 +149,7 @@
   /**
    * The most outer method this closure is declared into.
    */
-  final Element methodElement;
+  final TypedElement methodElement;
 
   // A [ClosureClassElement] is nested inside a function or initializer in terms
   // of [enclosingElement], but still has to be treated as a top-level
@@ -160,11 +164,13 @@
 // 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 {
-  BoxElement(String name, Element enclosingElement)
+class BoxElement extends ElementX implements TypedElement {
+  final DartType type;
+
+  BoxElement(String name, Element enclosingElement, this.type)
       : super(name, ElementKind.VARIABLE_LIST, enclosingElement);
 
-  DartType computeType(Compiler compiler) => compiler.types.dynamicType;
+  DartType computeType(Compiler compiler) => type;
 
   accept(ElementVisitor visitor) => visitor.visitBoxElement(this);
 }
@@ -172,17 +178,17 @@
 // 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 {
+class BoxFieldElement extends ElementX implements TypedElement {
   BoxFieldElement(String name,
                   this.variableElement,
                   BoxElement enclosingBox)
       : super(name, ElementKind.FIELD, enclosingBox);
 
-  DartType computeType(Compiler compiler) {
-    return variableElement.computeType(compiler);
-  }
+  DartType computeType(Compiler compiler) => type;
 
-  final Element variableElement;
+  DartType get type => variableElement.type;
+
+  final VariableElement variableElement;
 
   accept(ElementVisitor visitor) => visitor.visitBoxFieldElement(this);
 }
@@ -190,8 +196,10 @@
 // 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 {
-  ThisElement(Element enclosing)
+class ThisElement extends ElementX implements TypedElement {
+  final DartType type;
+
+  ThisElement(Element enclosing, this.type)
       : super('this', ElementKind.PARAMETER, enclosing);
 
   bool isAssignable() => false;
@@ -454,7 +462,7 @@
          !link.isEmpty;
          link = link.tail) {
       Node definition = link.head;
-      Element element = elements[definition];
+      VariableElement element = elements[definition];
       assert(element != null);
       declareLocal(element);
       // We still need to visit the right-hand sides of the init-assignments.
@@ -547,7 +555,8 @@
     if (Elements.isLocal(element)) {
       mutatedVariables.add(element);
       if (compiler.enableTypeAssertions) {
-        analyzeTypeVariables(element.computeType(compiler));
+        TypedElement typedElement = element;
+        analyzeTypeVariables(typedElement.type);
       }
     }
     super.visitSendSet(node);
@@ -604,7 +613,8 @@
           // TODO(floitsch): construct better box names.
           String boxName =
               namer.getClosureVariableName('box', closureFieldCounter++);
-          box = new BoxElement(boxName, currentElement);
+          box = new BoxElement(
+              boxName, currentElement, compiler.types.dynamicType);
         }
         String elementName = element.name;
         String boxedName =
@@ -700,7 +710,8 @@
     return sb.toString();
   }
 
-  ClosureClassMap globalizeClosure(FunctionExpression node, Element element) {
+  ClosureClassMap globalizeClosure(FunctionExpression node,
+                                   TypedElement element) {
     String closureName = computeClosureName(element);
     ClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.getCompilationUnit());
@@ -718,7 +729,7 @@
                                callElement, thisElement);
   }
 
-  void visitInvokable(Element element, Node node, void visitChildren()) {
+  void visitInvokable(TypedElement element, Node node, void visitChildren()) {
     bool oldInsideClosure = insideClosure;
     Element oldFunctionElement = currentElement;
     ClosureClassMap oldClosureData = closureData;
@@ -732,7 +743,7 @@
       outermostElement = element;
       Element thisElement = null;
       if (element.isInstanceMember() || element.isGenerativeConstructor()) {
-        thisElement = new ThisElement(element);
+        thisElement = new ThisElement(element, compiler.types.dynamicType);
       }
       closureData = new ClosureClassMap(null, null, null, thisElement);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index aeeae12..b02a293 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -118,8 +118,8 @@
         if (compiler.enableTypeAssertions &&
             value != null &&
             element.isField()) {
-          DartType elementType = element.computeType(compiler);
-          if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) {
+          DartType elementType = element.type;
+          if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
             if (isConst) {
               ErroneousElement element = elementType.element;
               compiler.reportFatalError(
@@ -312,7 +312,7 @@
     bool onlyStringKeys = true;
     Constant protoValue = null;
     for (var key in keys) {
-      if (key.isString()) {
+      if (key.isString) {
         if (key.value == MapConstant.PROTO_PROPERTY) {
           protoValue = map[key];
         }
@@ -377,10 +377,10 @@
       DartString expressionString;
       if (expression == null) {
         return signalNotCompileTimeConstant(part.expression);
-      } else if (expression.isNum() || expression.isBool()) {
+      } else if (expression.isNum || expression.isBool) {
         PrimitiveConstant primitive = expression;
         expressionString = new DartString.literal(primitive.value.toString());
-      } else if (expression.isString()) {
+      } else if (expression.isString) {
         PrimitiveConstant primitive = expression;
         expressionString = primitive.value;
       } else {
@@ -395,7 +395,7 @@
   }
 
   Constant visitLiteralSymbol(LiteralSymbol node) {
-    InterfaceType type = compiler.symbolClass.computeType(compiler);
+    InterfaceType type = compiler.symbolClass.rawType;
     List<Constant> createArguments(_) {
       return [constantSystem.createString(
         new DartString.literal(node.slowNameString))];
@@ -404,17 +404,51 @@
         node, type, compiler.symbolConstructor, createArguments);
   }
 
-  Constant makeTypeConstant(Element element) {
-    DartType elementType = element.computeType(compiler).asRaw();
+  Constant makeTypeConstant(TypeDeclarationElement element) {
+    DartType elementType = element.rawType;
     DartType constantType =
         compiler.backend.typeImplementation.computeType(compiler);
     return new TypeConstant(elementType, constantType);
   }
 
+  /// Returns true if the prefix of the send resolves to a deferred import
+  /// prefix.
+  bool isDeferredUse(Send send) {
+    // We handle:
+    // 1. Send(Send(Send(null, Prefix), className), staticName)
+    // 2. Send(Send(Prefix, Classname), staticName)
+    // 3. Send(Send(null, Prefix), staticName | className)
+    // 4. Send(Send(Prefix), staticName | className)
+    // Nodes of the forms 2,4 occur in metadata.
+    if (send == null) return false;
+    while (send.receiver is Send) {
+      send = send.receiver;
+    }
+    Identifier prefixNode;
+    if (send.receiver is Identifier) {
+      prefixNode = send.receiver;
+    } else if (send.receiver == null &&
+        send.selector is Identifier) {
+      prefixNode = send.selector;
+    }
+    if (prefixNode != null) {
+      Element maybePrefix = elements[prefixNode.asIdentifier()];
+      if (maybePrefix != null && maybePrefix.isPrefix() &&
+          (maybePrefix as PrefixElement).isDeferred) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   // TODO(floitsch): provide better error-messages.
   Constant visitSend(Send send) {
     Element element = elements[send];
     if (send.isPropertyAccess) {
+      if (isDeferredUse(send)) {
+        return signalNotCompileTimeConstant(send,
+            message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
+      }
       if (Elements.isStaticOrTopLevelFunction(element)) {
         return new FunctionConstant(element);
       } else if (Elements.isStaticOrTopLevelField(element)) {
@@ -533,7 +567,7 @@
           folded = constantSystem.greaterEqual.fold(left, right);
           break;
         case "==":
-          if (left.isPrimitive() && right.isPrimitive()) {
+          if (left.isPrimitive && right.isPrimitive) {
             folded = constantSystem.equal.fold(left, right);
           }
           break;
@@ -541,7 +575,7 @@
           folded = constantSystem.identity.fold(left, right);
           break;
         case "!=":
-          if (left.isPrimitive() && right.isPrimitive()) {
+          if (left.isPrimitive && right.isPrimitive) {
             BoolConstant areEquals = constantSystem.equal.fold(left, right);
             if (areEquals == null) {
               folded = null;
@@ -570,7 +604,7 @@
     Constant condition = evaluate(node.condition);
     if (condition == null) {
       return null;
-    } else if (!condition.isBool()) {
+    } else if (!condition.isBool) {
       DartType conditionType = condition.computeType(compiler);
       if (isEvaluatingConstant) {
         compiler.reportFatalError(
@@ -630,16 +664,9 @@
 
     // Deferred types can not be used in const instance creation expressions.
     // Check if the constructor comes from a deferred library.
-    Send selectorSend = node.send.selector.asSend();
-    if (selectorSend != null) {
-      Identifier receiver = selectorSend.receiver.asIdentifier();
-      if (receiver != null) {
-        Element element = elements[receiver];
-        if (element.isPrefix() && (element as PrefixElement).isDeferred) {
-          return signalNotCompileTimeConstant(node,
-              message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
-        }
-      }
+    if (isDeferredUse(node.send.selector.asSend())) {
+      return signalNotCompileTimeConstant(node,
+          message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION);
     }
 
     // TODO(ahe): This is nasty: we must eagerly analyze the
@@ -828,9 +855,11 @@
     return super.visitSend(send);
   }
 
-  void potentiallyCheckType(Node node, Element element, Constant constant) {
+  void potentiallyCheckType(Node node,
+                            TypedElement element,
+                            Constant constant) {
     if (compiler.enableTypeAssertions) {
-      DartType elementType = element.computeType(compiler);
+      DartType elementType = element.type;
       DartType constantType = constant.computeType(compiler);
       // TODO(ngeoffray): Handle type parameters.
       if (elementType.element.isTypeVariable()) return;
@@ -842,7 +871,7 @@
     }
   }
 
-  void updateFieldValue(Node node, Element element, Constant constant) {
+  void updateFieldValue(Node node, TypedElement element, Constant constant) {
     potentiallyCheckType(node, element, constant);
     fieldValues[element] = constant;
   }
@@ -854,7 +883,7 @@
    */
   void assignArgumentsToParameters(List<Constant> arguments) {
     // Assign arguments to parameters.
-    FunctionSignature parameters = constructor.computeSignature(compiler);
+    FunctionSignature parameters = constructor.functionSignature;
     int index = 0;
     parameters.orderedForEachParameter((Element parameter) {
       Constant argument = arguments[index++];
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 05fe6c7..b3044bb 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -803,9 +803,13 @@
       try {
         if (!hasCrashed) {
           hasCrashed = true;
-          reportDiagnostic(new SourceSpan(uri, 0, 0),
-                           MessageKind.COMPILER_CRASHED.message(),
-                           api.Diagnostic.CRASH);
+          if (error is SpannableAssertionFailure) {
+            reportAssertionFailure(error);
+          } else {
+            reportDiagnostic(new SourceSpan(uri, 0, 0),
+                             MessageKind.COMPILER_CRASHED.message(),
+                             api.Diagnostic.CRASH);
+          }
           pleaseReportCrash();
         }
       } catch (doubleFault) {
@@ -1295,6 +1299,8 @@
            element.isGetter() ||
            element.isSetter(),
            message: 'Unexpected element kind: ${element.kind}'));
+    assert(invariant(element, element is AnalyzableElement,
+        message: 'Element $element is not analyzable.'));
     assert(invariant(element, element.isDeclaration));
     ResolutionEnqueuer world = enqueuer.resolution;
     TreeElements elements = world.getCachedElements(element);
@@ -1458,7 +1464,7 @@
     String message = (ex.message != null) ? tryToString(ex.message)
                                           : tryToString(ex);
     SourceSpan span = spanFromSpannable(ex.node);
-    reportError(ex.node, MessageKind.GENERIC, {'text': message});
+    reportInternalError(ex.node, MessageKind.GENERIC, {'text': message});
   }
 
   SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index cf86e65..df33125 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -10,7 +10,7 @@
   final String name = '~';
   const BitNotOperation();
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       return DART_CONSTANT_SYSTEM.createInt(~intConstant.value);
     }
@@ -22,11 +22,11 @@
   final String name = 'negate';
   const NegateOperation();
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       return DART_CONSTANT_SYSTEM.createInt(-intConstant.value);
     }
-    if (constant.isDouble()) {
+    if (constant.isDouble) {
       DoubleConstant doubleConstant = constant;
       return DART_CONSTANT_SYSTEM.createDouble(-doubleConstant.value);
     }
@@ -38,7 +38,7 @@
   final String name = '!';
   const NotOperation();
   Constant fold(Constant constant) {
-    if (constant.isBool()) {
+    if (constant.isBool) {
       BoolConstant boolConstant = constant;
       return DART_CONSTANT_SYSTEM.createBool(!boolConstant.value);
     }
@@ -52,7 +52,7 @@
 abstract class BinaryBitOperation implements BinaryOperation {
   const BinaryBitOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isInt() && right.isInt()) {
+    if (left.isInt && right.isInt) {
       IntConstant leftInt = left;
       IntConstant rightInt = right;
       int resultValue = foldInts(leftInt.value, rightInt.value);
@@ -111,7 +111,7 @@
 abstract class BinaryBoolOperation implements BinaryOperation {
   const BinaryBoolOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isBool() && right.isBool()) {
+    if (left.isBool && right.isBool) {
       BoolConstant leftBool = left;
       BoolConstant rightBool = right;
       bool resultValue = foldBools(leftBool.value, rightBool.value);
@@ -140,18 +140,18 @@
 abstract class ArithmeticNumOperation implements BinaryOperation {
   const ArithmeticNumOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       num foldedValue;
-      if (left.isInt() && right.isInt()) {
+      if (left.isInt && right.isInt) {
         foldedValue = foldInts(leftNum.value, rightNum.value);
       } else {
         foldedValue = foldNums(leftNum.value, rightNum.value);
       }
       // A division by 0 means that we might not have a folded value.
       if (foldedValue == null) return null;
-      if (left.isInt() && right.isInt() && !isDivide() ||
+      if (left.isInt && right.isInt && !isDivide() ||
           isTruncatingDivide()) {
         assert(foldedValue is int);
         return DART_CONSTANT_SYSTEM.createInt(foldedValue);
@@ -221,12 +221,12 @@
   final String name = '+';
   const AddOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isInt() && right.isInt()) {
+    if (left.isInt && right.isInt) {
       IntConstant leftInt = left;
       IntConstant rightInt = right;
       int result = leftInt.value + rightInt.value;
       return DART_CONSTANT_SYSTEM.createInt(result);
-    } else if (left.isNum() && right.isNum()) {
+    } else if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       double result = leftNum.value + rightNum.value;
@@ -241,7 +241,7 @@
 abstract class RelationalNumOperation implements BinaryOperation {
   const RelationalNumOperation();
   Constant fold(Constant left, Constant right) {
-    if (!left.isNum() || !right.isNum()) return null;
+    if (!left.isNum || !right.isNum) return null;
     NumConstant leftNum = left;
     NumConstant rightNum = right;
     bool foldedValue = foldNums(leftNum.value, rightNum.value);
@@ -284,7 +284,7 @@
   final String name = '==';
   const EqualsOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       // Numbers need to be treated specially because: NaN != NaN, -0.0 == 0.0,
       // and 1 == 1.0.
       NumConstant leftNum = left;
@@ -292,7 +292,7 @@
       bool result = leftNum.value == rightNum.value;
       return DART_CONSTANT_SYSTEM.createBool(result);
     }
-    if (left.isConstructedObject()) {
+    if (left.isConstructedObject) {
       // Unless we know that the user-defined object does not implement the
       // equality operator we cannot fold here.
       return null;
@@ -309,7 +309,7 @@
     // In order to preserve runtime semantics which says that NaN !== NaN don't
     // constant fold NaN === NaN. Otherwise the output depends on inlined
     // variables and other optimizations.
-    if (left.isNaN() && right.isNaN()) return null;
+    if (left.isNaN && right.isNaN) return null;
     return DART_CONSTANT_SYSTEM.createBool(left == right);
   }
   apply(left, right) => identical(left, right);
@@ -353,11 +353,11 @@
   BoolConstant createBool(bool value) => new BoolConstant(value);
   NullConstant createNull() => new NullConstant();
 
-  bool isInt(Constant constant) => constant.isInt();
-  bool isDouble(Constant constant) => constant.isDouble();
-  bool isString(Constant constant) => constant.isString();
-  bool isBool(Constant constant) => constant.isBool();
-  bool isNull(Constant constant) => constant.isNull();
+  bool isInt(Constant constant) => constant.isInt;
+  bool isDouble(Constant constant) => constant.isDouble;
+  bool isString(Constant constant) => constant.isString;
+  bool isBool(Constant constant) => constant.isBool;
+  bool isNull(Constant constant) => constant.isNull;
 
   bool isSubtype(Compiler compiler, DartType s, DartType t) {
     return compiler.types.isSubtype(s, t);
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 213f28b..b5bb3c0 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -23,31 +23,30 @@
 abstract class Constant {
   const Constant();
 
-  // TODO: Make all the isXXX in Constant checks getters.
-  bool isNull() => false;
-  bool isBool() => false;
-  bool isTrue() => false;
-  bool isFalse() => false;
-  bool isInt() => false;
-  bool isDouble() => false;
-  bool isNum() => false;
-  bool isString() => false;
-  bool isList() => false;
-  bool isMap() => false;
-  bool isConstructedObject() => false;
-  bool isFunction() => false;
+  bool get isNull => false;
+  bool get isBool => false;
+  bool get isTrue => false;
+  bool get isFalse => false;
+  bool get isInt => false;
+  bool get isDouble => false;
+  bool get isNum => false;
+  bool get isString => false;
+  bool get isList => false;
+  bool get isMap => false;
+  bool get isConstructedObject => false;
+  bool get isFunction => false;
   /** Returns true if the constant is null, a bool, a number or a string. */
-  bool isPrimitive() => false;
+  bool get isPrimitive => false;
   /** Returns true if the constant is a list, a map or a constructed object. */
-  bool isObject() => false;
-  bool isType() => false;
-  bool isInterceptor() => false;
-  bool isDummy() => false;
+  bool get isObject => false;
+  bool get isType => false;
+  bool get isInterceptor => false;
+  bool get isDummy => false;
 
-  bool isNaN() => false;
-  bool isMinusZero() => false;
-  bool isZero() => false;
-  bool isOne() => false;
+  bool get isNaN => false;
+  bool get isMinusZero => false;
+  bool get isZero => false;
+  bool get isOne => false;
 
   // TODO(johnniwinther): Replace with a 'type' getter.
   DartType computeType(Compiler compiler);
@@ -64,7 +63,7 @@
 
   FunctionConstant(this.element);
 
-  bool isFunction() => true;
+  bool get isFunction => true;
 
   bool operator ==(var other) {
     if (other is !FunctionConstant) return false;
@@ -92,7 +91,7 @@
 abstract class PrimitiveConstant extends Constant {
   get value;
   const PrimitiveConstant();
-  bool isPrimitive() => true;
+  bool get isPrimitive => true;
 
   bool operator ==(var other) {
     if (other is !PrimitiveConstant) return false;
@@ -115,7 +114,7 @@
 
   factory NullConstant() => const NullConstant._internal();
   const NullConstant._internal();
-  bool isNull() => true;
+  bool get isNull => true;
   get value => null;
 
   DartType computeType(Compiler compiler) {
@@ -136,7 +135,7 @@
 abstract class NumConstant extends PrimitiveConstant {
   num get value;
   const NumConstant();
-  bool isNum() => true;
+  bool get isNum => true;
 }
 
 class IntConstant extends NumConstant {
@@ -160,15 +159,15 @@
     }
   }
   const IntConstant._internal(this.value);
-  bool isInt() => true;
+  bool get isInt => true;
   bool isUInt31() => value >= 0 && value < (1 << 31);
   bool isUInt32() => value >= 0 && value < (1 << 32);
   bool isPositive() => value >= 0;
-  bool isZero() => value == 0;
-  bool isOne() => value == 1;
+  bool get isZero => value == 0;
+  bool get isOne => value == 1;
 
   DartType computeType(Compiler compiler) {
-    return compiler.intClass.computeType(compiler);
+    return compiler.intClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -212,15 +211,15 @@
     }
   }
   const DoubleConstant._internal(this.value);
-  bool isDouble() => true;
-  bool isNaN() => value.isNaN;
+  bool get isDouble => true;
+  bool get isNaN => value.isNaN;
   // We need to check for the negative sign since -0.0 == 0.0.
-  bool isMinusZero() => value == 0.0 && value.isNegative;
-  bool isZero() => value == 0.0;
-  bool isOne() => value == 1.0;
+  bool get isMinusZero => value == 0.0 && value.isNegative;
+  bool get isZero => value == 0.0;
+  bool get isOne => value == 1.0;
 
   DartType computeType(Compiler compiler) {
-    return compiler.doubleClass.computeType(compiler);
+    return compiler.doubleClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -228,7 +227,7 @@
     // -0.0 is an integer.
     // TODO(17235): this kind of special casing should only happen in the
     // backend.
-    if (isMinusZero() && compiler.backend.constantSystem.isInt(this)) {
+    if (isMinusZero && compiler.backend.constantSystem.isInt(this)) {
       return compiler.typesTask.uint31Type;
     }
     assert(!compiler.backend.constantSystem.isInt(this));
@@ -259,10 +258,10 @@
     return value ? new TrueConstant() : new FalseConstant();
   }
   const BoolConstant._internal();
-  bool isBool() => true;
+  bool get isBool => true;
 
   DartType computeType(Compiler compiler) {
-    return compiler.boolClass.computeType(compiler);
+    return compiler.boolClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -277,7 +276,7 @@
 
   factory TrueConstant() => const TrueConstant._internal();
   const TrueConstant._internal() : super._internal();
-  bool isTrue() => true;
+  bool get isTrue => true;
 
   FalseConstant negate() => new FalseConstant();
 
@@ -295,7 +294,7 @@
 
   factory FalseConstant() => const FalseConstant._internal();
   const FalseConstant._internal() : super._internal();
-  bool isFalse() => true;
+  bool get isFalse => true;
 
   TrueConstant negate() => new TrueConstant();
 
@@ -318,10 +317,10 @@
   StringConstant(DartString value)
       : this.value = value,
         this.hashCode = value.slowToString().hashCode;
-  bool isString() => true;
+  bool get isString => true;
 
   DartType computeType(Compiler compiler) {
-    return compiler.stringClass.computeType(compiler);
+    return compiler.stringClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -349,7 +348,7 @@
 
   ObjectConstant(this.type);
 
-  bool isObject() => true;
+  bool get isObject => true;
 
   DartType computeType(Compiler compiler) => type;
 }
@@ -360,7 +359,7 @@
 
   TypeConstant(this.representedType, type) : super(type);
 
-  bool isType() => true;
+  bool get isType => true;
 
   bool operator ==(other) {
     return other is TypeConstant && representedType == other.representedType;
@@ -387,7 +386,7 @@
       : this.entries = entries,
         hashCode = _computeHash(type, entries),
         super(type);
-  bool isList() => true;
+  bool get isList => true;
 
   static int _computeHash(DartType type, List<Constant> entries) {
     // TODO(floitsch): create a better hash.
@@ -463,7 +462,7 @@
       : this.values = values,
         this.hashCode = computeHash(type, values),
         super(type);
-  bool isMap() => true;
+  bool get isMap => true;
 
   static int computeHash(DartType type, List<Constant> values) {
     // TODO(floitsch): create a better hash.
@@ -529,7 +528,7 @@
 
   InterceptorConstant(this.dispatchedType);
 
-  bool isInterceptor() => true;
+  bool get isInterceptor => true;
 
   bool operator ==(other) {
     return other is InterceptorConstant
@@ -558,7 +557,7 @@
 
   DummyConstant(this.typeMask);
 
-  bool isDummy() => true;
+  bool get isDummy => true;
 
   bool operator ==(other) {
     return other is DummyConstant
@@ -590,7 +589,7 @@
       super(type) {
     assert(type != null);
   }
-  bool isConstructedObject() => true;
+  bool get isConstructedObject => true;
 
   static int computeHash(DartType type, List<Constant> fields) {
     // TODO(floitsch): create a better hash.
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index ed9fd82..5c058f4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -17,7 +17,8 @@
          CompilationUnitElementX,
          LibraryElementX,
          PrefixElementX,
-         VoidElementX;
+         VoidElementX,
+         AnalyzableElement;
 import 'js_backend/js_backend.dart' as js_backend;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 57e36da..19c3976 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -59,17 +59,17 @@
    */
   bool isSafeToRemoveTypeDeclarations(
       Map<ClassElement, Set<Element>> classMembers) {
+    ClassElement typeErrorElement = compiler.coreLibrary.find('TypeError');
+    if (classMembers.containsKey(typeErrorElement) ||
+        compiler.resolverWorld.isChecks.any(
+            (DartType type) => type.element == typeErrorElement)) {
+      return false;
+    }
     Set<DartType> processedTypes = new Set<DartType>();
     List<DartType> workQueue = new List<DartType>();
     workQueue.addAll(
         classMembers.keys.map((classElement) => classElement.thisType));
     workQueue.addAll(compiler.resolverWorld.isChecks);
-    Element typeErrorElement =
-        compiler.coreLibrary.find('TypeError');
-    DartType typeErrorType = typeErrorElement.computeType(compiler);
-    if (workQueue.indexOf(typeErrorType) != -1) {
-      return false;
-    }
 
     while (!workQueue.isEmpty) {
       DartType type = workQueue.removeLast();
@@ -302,14 +302,8 @@
       SynthesizedConstructorElementX constructor =
           new SynthesizedConstructorElementX(
               classElement.name, null, classElement, false);
-      constructor.type = new FunctionType(
-          constructor,
-          compiler.types.voidType,
-          const Link<DartType>(),
-          const Link<DartType>(),
-          const Link<String>(),
-          const Link<DartType>()
-          );
+      constructor.typeCache =
+          new FunctionType(constructor, compiler.types.voidType);
       constructor.cachedNode = new FunctionExpression(
           new Send(classNode.name, synthesizedIdentifier),
           new NodeList(new StringToken.fromString(OPEN_PAREN_INFO, '(', -1),
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 6faf905..528673f 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -392,7 +392,7 @@
       // Do not forget to rename them as well.
       FunctionElement constructorFunction = constructor;
       Link<Element> optionalParameters =
-          constructorFunction.computeSignature(compiler).optionalParameters;
+          constructorFunction.functionSignature.optionalParameters;
       for (final argument in send.argumentsNode) {
         NamedArgument named = argument.asNamedArgument();
         if (named == null) continue;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index aedc7ea..4177c5b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -8,7 +8,11 @@
 
 import 'dart2jslib.dart' show Compiler, invariant, Script, Message;
 import 'elements/modelx.dart'
-    show VoidElementX, LibraryElementX, BaseClassElementX;
+    show VoidElementX,
+         LibraryElementX,
+         BaseClassElementX,
+         TypeDeclarationElementX,
+         TypedefElementX;
 import 'elements/elements.dart';
 import 'ordered_typeset.dart' show OrderedTypeSet;
 import 'util/util.dart' show Link, LinkBuilder, CURRENT_ELEMENT_SPANNABLE;
@@ -356,11 +360,20 @@
 }
 
 abstract class GenericType extends DartType {
+  final TypeDeclarationElement element;
   final Link<DartType> typeArguments;
 
-  GenericType(Link<DartType> this.typeArguments);
-
-  TypeDeclarationElement get element;
+  GenericType(TypeDeclarationElementX element,
+              Link<DartType> this.typeArguments,
+              {bool checkTypeArgumentCount: true})
+      : this.element = element {
+    assert(invariant(element,
+        !checkTypeArgumentCount ||
+        element.thisTypeCache == null ||
+        typeArguments.slowLength() == element.typeVariables.slowLength(),
+        message: () => 'Invalid type argument count on ${element.thisType}. '
+                       'Provided type arguments: $typeArguments.'));
+  }
 
   /// Creates a new instance of this type using the provided type arguments.
   GenericType createInstantiation(Link<DartType> newTypeArguments);
@@ -444,22 +457,18 @@
 }
 
 class InterfaceType extends GenericType {
-  final ClassElement element;
-
-  InterfaceType(this.element,
+  InterfaceType(BaseClassElementX element,
                 [Link<DartType> typeArguments = const Link<DartType>()])
-      : super(typeArguments) {
+      : super(element, typeArguments) {
     assert(invariant(element, element.isDeclaration));
-    assert(invariant(element, element.thisType == null ||
-        typeArguments.slowLength() == element.typeVariables.slowLength(),
-        message: () => 'Invalid type argument count on ${element.thisType}. '
-                       'Provided type arguments: $typeArguments.'));
   }
 
-  InterfaceType.forUserProvidedBadType(this.element,
+  InterfaceType.forUserProvidedBadType(BaseClassElementX element,
                                        [Link<DartType> typeArguments =
                                            const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments, checkTypeArgumentCount: false);
+
+  ClassElement get element => super.element;
 
   TypeKind get kind => TypeKind.INTERFACE;
 
@@ -749,27 +758,25 @@
 }
 
 class TypedefType extends GenericType {
-  final TypedefElement element;
-
-  // TODO(johnniwinther): Assert that the number of arguments and parameters
-  // match, like for [InterfaceType].
-  TypedefType(this.element,
+  TypedefType(TypedefElementX element,
               [Link<DartType> typeArguments = const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments);
 
-  TypedefType createInstantiation(Link<DartType> newTypeArguments) {
-    return new TypedefType(element, newTypeArguments);
-  }
-
-  TypedefType.forUserProvidedBadType(this.element,
+  TypedefType.forUserProvidedBadType(TypedefElementX element,
                                      [Link<DartType> typeArguments =
                                          const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments, checkTypeArgumentCount: false);
+
+  TypedefElement get element => super.element;
 
   TypeKind get kind => TypeKind.TYPEDEF;
 
   String get name => element.name;
 
+  TypedefType createInstantiation(Link<DartType> newTypeArguments) {
+    return new TypedefType(element, newTypeArguments);
+  }
+
   DartType unalias(Compiler compiler) {
     // TODO(ahe): This should be [ensureResolved].
     compiler.resolveTypedef(element);
@@ -1178,7 +1185,7 @@
     LibraryElement library = new LibraryElementX(new Script(null, null, null));
     VoidType voidType = new VoidType(new VoidElementX(library));
     DynamicType dynamicType = new DynamicType(dynamicElement);
-    dynamicElement.rawTypeCache = dynamicElement.thisType = dynamicType;
+    dynamicElement.rawTypeCache = dynamicElement.thisTypeCache = dynamicType;
     MoreSpecificVisitor moreSpecificVisitor =
         new MoreSpecificVisitor(compiler, dynamicType, voidType);
     SubtypeVisitor subtypeVisitor =
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 3e92c1c..08c1775 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -497,7 +497,7 @@
     for (Constant constant in allConstants) {
       // If the constant is not a "constructed" constant, it can stay where
       // it is.
-      if (!constant.isConstructedObject()) continue;
+      if (!constant.isConstructedObject) continue;
       OutputUnit constantUnit = _constantToOutputUnit[constant];
       Setlet<Import> constantImports = constantUnit.imports;
       ConstructedConstant constructed = constant;
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 63eb7ea..29f0ace 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -378,7 +378,7 @@
     }
     List contents = [];
     if (emittedCode != null) {
-      FunctionSignature signature = element.computeSignature(compiler);
+      FunctionSignature signature = element.functionSignature;
       signature.forEachParameter((parameter) {
         contents.add(new InferredInfoNode(
             description: "parameter",
@@ -412,7 +412,7 @@
       return null;
     }
     return new ElementInfoNode(
-        type: element.type.toString(),
+        type: element.computeType(compiler).toString(),
         kind: kindString,
         name: nameString,
         size: size,
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 010438f..1615fcf 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -186,8 +186,7 @@
 
   /// Do not use [computeType] outside of the resolver; instead retrieve the
   /// type from the corresponding field:
-  /// - `variables.type` for fields and variables.
-  /// - `type` for function elements.
+  /// - `type` for fields, variables, type variable, and function elements.
   /// - `thisType` or `rawType` for [TypeDeclarationElement]s (classes and
   ///    typedefs), depending on the use case.
   /// Trying to access a type that has not been computed in resolution is an
@@ -279,6 +278,8 @@
 
   void diagnose(Element context, DiagnosticListener listener);
 
+  TreeElements get treeElements;
+
   accept(ElementVisitor visitor);
 }
 
@@ -765,7 +766,7 @@
   void checkCyclicReference(Compiler compiler);
 }
 
-abstract class VariableElement extends Element {
+abstract class VariableElement extends Element implements TypedElement {
   Expression get initializer;
 }
 
@@ -814,7 +815,8 @@
   bool isCompatibleWith(FunctionSignature constructorSignature);
 }
 
-abstract class FunctionElement extends Element implements ClosureContainer {
+abstract class FunctionElement extends Element
+    implements TypedElement, ClosureContainer {
   FunctionExpression get cachedNode;
   DartType get type;
   FunctionSignature get functionSignature;
@@ -838,10 +840,13 @@
   void set defaultImplementation(FunctionElement value);
 
   void setPatch(FunctionElement patchElement);
-  FunctionSignature computeSignature(Compiler compiler);
-  int requiredParameterCount(Compiler compiler);
-  int optionalParameterCount(Compiler compiler);
-  int parameterCount(Compiler compiler);
+
+  /// Do not use [computeSignature] outside of the resolver; instead retrieve
+  /// the signature through the [functionSignature] field.
+  /// Trying to access a function signature that has not been computed in
+  /// resolution is an error and calling [computeSignature] covers that error.
+  /// This method will go away!
+  @deprecated FunctionSignature computeSignature(Compiler compiler);
 
   FunctionExpression parseNode(DiagnosticListener listener);
 }
@@ -902,7 +907,6 @@
   bool get hasLocalScopeMembers;
 
   // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set thisType(InterfaceType value);
   void set supertype(DartType value);
   void set interfaces(Link<DartType> value);
   void set patch(ClassElement value);
@@ -927,7 +931,7 @@
   /// Returns `true` if the class hierarchy for this class contains errors.
   bool get hasIncompleteHierarchy;
 
-  ClassElement ensureResolved(Compiler compiler);
+  void ensureResolved(Compiler compiler);
 
   void addMember(Element element, DiagnosticListener listener);
   void addToScope(Element element, DiagnosticListener listener);
@@ -1023,13 +1027,14 @@
   LabelElement addLabel(Label label, String labelName);
 }
 
-abstract class TypeVariableElement extends Element {
+/// The [Element] for a type variable declaration on a generic class or typedef.
+abstract class TypeVariableElement extends Element implements TypedElement {
+  /// The [type] defined by the type variable.
   TypeVariableType get type;
-  DartType get bound;
 
-  // TODO(kasperl): Try to get rid of these.
-  void set type(TypeVariableType value);
-  void set bound(DartType value);
+  /// The upper bound on the type variable. If not explicitly declared, this is
+  /// `Object`.
+  DartType get bound;
 }
 
 abstract class MetadataAnnotation implements Spannable {
@@ -1048,6 +1053,11 @@
 
 abstract class VoidElement extends Element {}
 
+/// An [Element] that has a type.
+abstract class TypedElement extends Element {
+  DartType get type;
+}
+
 /// A [MemberSignature] is a member of an interface.
 ///
 /// A signature is either a method or a getter or setter, possibly implicitly
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 707aaa8..eb48b99 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -67,6 +67,7 @@
     metadata = metadata.prepend(annotation);
   }
 
+
   bool isFunction() => identical(kind, ElementKind.FUNCTION);
   bool isConstructor() => isFactoryConstructor() || isGenerativeConstructor();
   bool isClosure() => false;
@@ -298,6 +299,8 @@
   FunctionElement get targetConstructor => null;
 
   void diagnose(Element context, DiagnosticListener listener) {}
+
+  TreeElements get treeElements => enclosingElement.treeElements;
 }
 
 /**
@@ -577,7 +580,7 @@
   }
 }
 
-class CompilationUnitElementX extends ElementX
+class CompilationUnitElementX extends ElementX with AnalyzableElement
     implements CompilationUnitElement {
   final Script script;
   PartOf partTag;
@@ -750,7 +753,8 @@
   Element operator [](String name) => importScope[name];
 }
 
-class LibraryElementX extends ElementX implements LibraryElement {
+class LibraryElementX extends ElementX with AnalyzableElement
+    implements LibraryElement {
   final Uri canonicalUri;
   CompilationUnitElement entryCompilationUnit;
   Link<CompilationUnitElement> compilationUnits =
@@ -1043,30 +1047,12 @@
   }
 }
 
-class TypedefElementX extends ElementX implements TypedefElement {
+class TypedefElementX extends ElementX
+    with AnalyzableElement, TypeDeclarationElementX<TypedefType>
+    implements TypedefElement {
   Typedef cachedNode;
 
   /**
-   * The type of this typedef in which the type arguments are the type
-   * variables.
-   *
-   * This resembles the [ClassElement.thisType] though a typedef has no notion
-   * of [:this:].
-   *
-   * This type is computed in [computeType].
-   */
-  TypedefType thisType;
-
-  /**
-   * Canonicalized raw version of [thisType].
-   *
-   * See [ClassElement.rawType] for motivation.
-   *
-   * The [rawType] is computed together with [thisType] in [computeType].
-   */
-  TypedefType rawType;
-
-  /**
    * The type annotation which defines this typedef.
    */
   DartType alias;
@@ -1074,10 +1060,7 @@
   /// [:true:] if the typedef has been checked for cyclic reference.
   bool hasBeenCheckedForCycles = false;
 
-  bool get isResolved => mapping != null;
-
-  // TODO(johnniwinther): Store the mapping in the resolution enqueuer instead.
-  TreeElements mapping;
+  bool get isResolved => hasTreeElements;
 
   TypedefElementX(String name, Element enclosing)
       : super(name, ElementKind.TYPEDEF, enclosing);
@@ -1093,26 +1076,16 @@
   FunctionSignature functionSignature;
 
   TypedefType computeType(Compiler compiler) {
-    if (thisType != null) return thisType;
+    if (thisTypeCache != null) return thisTypeCache;
     Typedef node = parseNode(compiler);
-    Link<DartType> parameters =
-        TypeDeclarationElementX.createTypeVariables(this, node.typeParameters);
-    thisType = new TypedefType(this, parameters);
-    if (parameters.isEmpty) {
-      rawType = thisType;
-    } else {
-      var dynamicParameters = const Link<DartType>();
-      parameters.forEach((_) {
-        dynamicParameters =
-            dynamicParameters.prepend(compiler.types.dynamicType);
-      });
-      rawType = new TypedefType(this, dynamicParameters);
-    }
+    setThisAndRawTypes(compiler, createTypeVariables(node.typeParameters));
     compiler.resolveTypedef(this);
-    return thisType;
+    return thisTypeCache;
   }
 
-  Link<DartType> get typeVariables => thisType.typeArguments;
+  TypedefType createType(Link<DartType> typeArguments) {
+    return new TypedefType(this, typeArguments);
+  }
 
   Scope buildScope() {
     return new TypeDeclarationScope(enclosingElement.buildScope(), this);
@@ -1152,7 +1125,8 @@
   DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX implements VariableElement {
+class VariableElementX extends ElementX with AnalyzableElement
+    implements VariableElement {
   final Token token;
   final VariableList variables;
   VariableDefinitions definitionsCache;
@@ -1236,6 +1210,12 @@
     return variables.computeType(this, compiler);
   }
 
+  DartType get type {
+    assert(invariant(this, variables.type != null,
+        message: "Type has not been computed for $this."));
+    return variables.type;
+  }
+
   bool isInstanceMember() => isMember() && !modifiers.isStatic();
 
   // Note: cachedNode.getBeginToken() will not be correct in all
@@ -1489,9 +1469,10 @@
   }
 }
 
-class FunctionElementX extends ElementX implements FunctionElement {
+class FunctionElementX extends ElementX with AnalyzableElement
+    implements FunctionElement {
   FunctionExpression cachedNode;
-  DartType type;
+  DartType typeCache;
   final Modifiers modifiers;
 
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
@@ -1622,10 +1603,16 @@
   }
 
   FunctionType computeType(Compiler compiler) {
-    if (type != null) return type;
-    type = compiler.computeFunctionType(declaration,
-                                        computeSignature(compiler));
-    return type;
+    if (typeCache != null) return typeCache;
+    typeCache = compiler.computeFunctionType(declaration,
+                                             computeSignature(compiler));
+    return typeCache;
+  }
+
+  FunctionType get type {
+    assert(invariant(this, typeCache != null,
+        message: "Type has not been computed for $this."));
+    return typeCache;
   }
 
   FunctionExpression parseNode(DiagnosticListener listener) {
@@ -1767,49 +1754,25 @@
   accept(ElementVisitor visitor) => visitor.visitVoidElement(this);
 }
 
-class TypeDeclarationElementX {
+abstract class TypeDeclarationElementX<T extends GenericType>
+    implements TypeDeclarationElement {
   /**
-   * Creates the type variables, their type and corresponding element, for the
-   * type variables declared in [parameter] on [element]. The bounds of the type
-   * variables are not set until [element] has been resolved.
-   */
-  static Link<DartType> createTypeVariables(TypeDeclarationElement element,
-                                            NodeList parameters) {
-    if (parameters == null) return const Link<DartType>();
-
-    // Create types and elements for type variable.
-    var arguments = new LinkBuilder<DartType>();
-    for (Link link = parameters.nodes; !link.isEmpty; link = link.tail) {
-      TypeVariable node = link.head;
-      String variableName = node.name.source;
-      TypeVariableElement variableElement =
-          new TypeVariableElementX(variableName, element, node);
-      TypeVariableType variableType = new TypeVariableType(variableElement);
-      variableElement.type = variableType;
-      arguments.addLast(variableType);
-    }
-    return arguments.toLink();
-  }
-}
-
-abstract class BaseClassElementX extends ElementX implements ClassElement {
-  final int id;
-
-  /**
-   * The type of [:this:] for this class declaration.
+   * The `this type` for this type declaration.
    *
-   * The type of [:this:] is the interface type based on this element in which
+   * The type of [:this:] is the generic type based on this element in which
    * the type arguments are the declared type variables. For instance,
    * [:List<E>:] for [:List:] and [:Map<K,V>:] for [:Map:].
    *
+   * For a class declaration this is the type of [:this:].
+   *
    * This type is computed in [computeType].
    */
-  InterfaceType thisType;
+  T thisTypeCache;
 
   /**
-   * The raw type for this class declaration.
+   * The raw type for this type declaration.
    *
-   * The raw type is the interface type base on this element in which the type
+   * The raw type is the generic type base on this element in which the type
    * arguments are all [dynamic]. For instance [:List<dynamic>:] for [:List:]
    * and [:Map<dynamic,dynamic>:] for [:Map:]. For non-generic classes [rawType]
    * is the same as [thisType].
@@ -1824,7 +1787,70 @@
    *
    * This type is computed together with [thisType] in [computeType].
    */
-  InterfaceType rawTypeCache;
+  T rawTypeCache;
+
+  T get thisType {
+    assert(invariant(this, thisTypeCache != null,
+                     message: 'This type has not been computed for $this'));
+    return thisTypeCache;
+  }
+
+  T get rawType {
+    assert(invariant(this, rawTypeCache != null,
+                     message: 'Raw type has not been computed for $this'));
+    return rawTypeCache;
+  }
+
+  T createType(Link<DartType> typeArguments);
+
+  void setThisAndRawTypes(Compiler compiler, Link<DartType> typeParameters) {
+    assert(invariant(this, thisTypeCache == null,
+        message: "This type has already been set on $this."));
+    assert(invariant(this, rawTypeCache == null,
+        message: "Raw type has already been set on $this."));
+    thisTypeCache = createType(typeParameters);
+    if (typeParameters.isEmpty) {
+      rawTypeCache = thisTypeCache;
+    } else {
+      Link<DartType> dynamicParameters = const Link<DartType>();
+      typeParameters.forEach((_) {
+        dynamicParameters =
+            dynamicParameters.prepend(compiler.types.dynamicType);
+      });
+      rawTypeCache = createType(dynamicParameters);
+    }
+  }
+
+  Link<DartType> get typeVariables => thisType.typeArguments;
+
+  /**
+   * Creates the type variables, their type and corresponding element, for the
+   * type variables declared in [parameter] on [element]. The bounds of the type
+   * variables are not set until [element] has been resolved.
+   */
+  Link<DartType> createTypeVariables(NodeList parameters) {
+    if (parameters == null) return const Link<DartType>();
+
+    // Create types and elements for type variable.
+    LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
+    for (Link<Node> link = parameters.nodes; !link.isEmpty; link = link.tail) {
+      TypeVariable node = link.head;
+      String variableName = node.name.source;
+      TypeVariableElementX variableElement =
+          new TypeVariableElementX(variableName, this, node);
+      TypeVariableType variableType = new TypeVariableType(variableElement);
+      variableElement.typeCache = variableType;
+      arguments.addLast(variableType);
+    }
+    return arguments.toLink();
+  }
+}
+
+abstract class BaseClassElementX extends ElementX
+    with AnalyzableElement, TypeDeclarationElementX<InterfaceType>
+    implements ClassElement {
+  final int id;
+
   DartType supertype;
   Link<DartType> interfaces;
   String nativeTagInfo;
@@ -1865,40 +1891,26 @@
 
   bool get isUnnamedMixinApplication => false;
 
+  InterfaceType computeType(Compiler compiler) {
+    if (thisTypeCache == null) {
+      computeThisAndRawType(compiler, computeTypeParameters(compiler));
+    }
+    return thisTypeCache;
+  }
+
   void computeThisAndRawType(Compiler compiler, Link<DartType> typeVariables) {
-    if (thisType == null) {
+    if (thisTypeCache == null) {
       if (origin == null) {
-        Link<DartType> parameters = typeVariables;
-        thisType = new InterfaceType(this, parameters);
-        if (parameters.isEmpty) {
-          rawTypeCache = thisType;
-        } else {
-          var dynamicParameters = const Link<DartType>();
-          parameters.forEach((_) {
-            dynamicParameters =
-                dynamicParameters.prepend(compiler.types.dynamicType);
-          });
-          rawTypeCache = new InterfaceType(this, dynamicParameters);
-        }
+        setThisAndRawTypes(compiler, typeVariables);
       } else {
-        thisType = origin.computeType(compiler);
+        thisTypeCache = origin.computeType(compiler);
         rawTypeCache = origin.rawType;
       }
     }
   }
 
-  // TODO(johnniwinther): Add [thisType] getter similar to [rawType].
-  InterfaceType computeType(Compiler compiler) {
-    if (thisType == null) {
-      computeThisAndRawType(compiler, computeTypeParameters(compiler));
-    }
-    return thisType;
-  }
-
-  InterfaceType get rawType {
-    assert(invariant(this, rawTypeCache != null,
-                     message: 'Raw type has not been computed for $this'));
-    return rawTypeCache;
+  InterfaceType createType(Link<DartType> typeArguments) {
+    return new InterfaceType(this, typeArguments);
   }
 
   Link<DartType> computeTypeParameters(Compiler compiler);
@@ -1909,13 +1921,10 @@
   bool isObject(Compiler compiler) =>
       identical(declaration, compiler.objectClass);
 
-  Link<DartType> get typeVariables => thisType.typeArguments;
-
-  ClassElement ensureResolved(Compiler compiler) {
+  void ensureResolved(Compiler compiler) {
     if (resolutionState == STATE_NOT_STARTED) {
       compiler.resolver.resolveClass(this);
     }
-    return this;
   }
 
   void setDefaultConstructor(FunctionElement constructor, Compiler compiler);
@@ -2299,8 +2308,7 @@
 
   Link<DartType> computeTypeParameters(Compiler compiler) {
     ClassNode node = parseNode(compiler);
-    return TypeDeclarationElementX.createTypeVariables(
-        this, node.typeParameters);
+    return createTypeVariables(node.typeParameters);
   }
 
   Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this);
@@ -2399,8 +2407,7 @@
           "Type variables on unnamed mixin applications must be set on "
           "creation.");
     }
-    return TypeDeclarationElementX.createTypeVariables(
-        this, named.typeParameters);
+    return createTypeVariables(named.typeParameters);
   }
 
   accept(ElementVisitor visitor) => visitor.visitMixinApplicationElement(this);
@@ -2476,15 +2483,26 @@
 
 class TypeVariableElementX extends ElementX implements TypeVariableElement {
   final Node cachedNode;
-  TypeVariableType type;
-  DartType bound;
+  TypeVariableType typeCache;
+  DartType boundCache;
 
-  TypeVariableElementX(String name, Element enclosing, this.cachedNode,
-                       [this.type, this.bound])
+  TypeVariableElementX(String name, Element enclosing, this.cachedNode)
     : super(name, ElementKind.TYPE_VARIABLE, enclosing);
 
   TypeVariableType computeType(compiler) => type;
 
+  TypeVariableType get type {
+    assert(invariant(this, typeCache != null,
+        message: "Type has not been set on $this."));
+    return typeCache;
+  }
+
+  DartType get bound {
+    assert(invariant(this, boundCache != null,
+        message: "Bound has not been set on $this."));
+    return boundCache;
+  }
+
   Node parseNode(compiler) => cachedNode;
 
   String toString() => "${enclosingElement.toString()}.${name}";
@@ -2558,3 +2576,4 @@
 
   Token get endToken => metadata.getEndToken();
 }
+
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 85c558e..c700d59 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -631,6 +631,8 @@
   }
 
   void internalAddToWorkList(Element element) {
+    assert(invariant(element, element is AnalyzableElement,
+        message: 'Element $element is not analyzable.'));
     if (getCachedElements(element) != null) return;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
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 3533dcc..e926165 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -1573,7 +1573,7 @@
       FunctionElement function,
       ArgumentsTypes<ConcreteType> argumentsTypes) {
     final Map<Element, ConcreteType> result = new Map<Element, ConcreteType>();
-    final FunctionSignature signature = function.computeSignature(compiler);
+    final FunctionSignature signature = function.functionSignature;
 
     // guard 1: too many arguments
     if (argumentsTypes.length > signature.parameterCount) {
@@ -1798,7 +1798,7 @@
                                    ConcreteTypesEnvironment environment) {
     // We trust the return type of native elements
     if (isNativeElement(element)) {
-      var elementType = element.computeType(compiler);
+      var elementType = element.type;
       assert(elementType.kind == TypeKind.FUNCTION);
       return typeOfNativeBehavior(
           native.NativeBehavior.ofMethod(element, compiler));
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index f15a77f..5b7a33d 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -369,10 +369,10 @@
     }
   }
 
-  void update(Element local, T type, Node node) {
+  void update(TypedElement local, T type, Node node) {
     assert(type != null);
     if (compiler.trustTypeAnnotations || compiler.enableTypeAssertions) {
-      type = types.narrowType(type, local.computeType(compiler));
+      type = types.narrowType(type, local.type);
     }
     updateLocal() {
       T currentType = locals[local];
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 03d318f..0cae963 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -470,7 +470,7 @@
     }
 
     FunctionElement function = analyzedElement;
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.forEachOptionalParameter((element) {
       ast.Expression defaultValue = element.initializer;
       T type = (defaultValue == null) ? types.nullType : visit(defaultValue);
@@ -947,7 +947,7 @@
                && compiler.world.fieldNeverChanges(element)) {
       var constant =
           compiler.constantHandler.getConstantForVariable(element);
-      if (constant != null && constant.isInt()) {
+      if (constant != null && constant.isInt) {
         return constant.value;
       }
     }
@@ -1180,8 +1180,8 @@
   T synthesizeForwardingCall(Spannable node, FunctionElement element) {
     element = element.implementation;
     FunctionElement function = analyzedElement;
-    FunctionSignature signature = function.computeSignature(compiler);
-    FunctionSignature calleeSignature = element.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
+    FunctionSignature calleeSignature = element.functionSignature;
     if (!calleeSignature.isCompatibleWith(signature)) {
       return types.nonNullEmpty();
     }
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 bac4d44..cfe1661 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -646,7 +646,7 @@
             Constant value =
                 compiler.constantHandler.getConstantForVariable(element);
             if (value != null) {
-              if (value.isFunction()) {
+              if (value.isFunction) {
                 FunctionConstant functionConstant = value;
                 type = types.allocateClosure(node, functionConstant.element);
               } else {
@@ -761,7 +761,7 @@
           types.allocatedClosures.add(info);
         }
         FunctionElement function = callee.implementation;
-        FunctionSignature signature = function.computeSignature(compiler);
+        FunctionSignature signature = function.functionSignature;
         signature.forEachParameter((Element parameter) {
           ElementTypeInformation info = types.getInferredTypeOf(parameter);
           info.giveUp(this, clearAssignments: false);
@@ -770,7 +770,7 @@
       }
     } else {
       FunctionElement function = callee.implementation;
-      FunctionSignature signature = function.computeSignature(compiler);
+      FunctionSignature signature = function.functionSignature;
       int parameterIndex = 0;
       bool visitingRequiredParameter = true;
       signature.forEachParameter((Element parameter) {
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 b411f48..2c45b4a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -325,7 +325,8 @@
         assert(element.isFunction() ||
                element.isGetter() ||
                element.isSetter());
-        var elementType = element.computeType(inferrer.compiler);
+        TypedElement typedElement = element;
+        var elementType = typedElement.type;
         if (elementType.kind != TypeKind.FUNCTION) {
           return type;
         } else {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 2f0f639..1b87d53 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -10,7 +10,7 @@
 import '../source_file.dart';
 import '../tree/tree.dart' as ast;
 import '../scanner/scannerlib.dart' show Token;
-import '../js_backend/js_backend.dart' show JavaScriptBackend;
+import '../dart_backend/dart_backend.dart' show DartBackend;
 import 'ir_pickler.dart' show Unpickler, IrConstantPool;
 
 /**
@@ -81,7 +81,6 @@
             nodes[element] = function;
           }
         }
-        ensureIr(element);
       });
     });
   }
@@ -89,7 +88,7 @@
   bool irEnabled() {
     // TODO(lry): support checked-mode checks.
     if (compiler.enableTypeAssertions ||
-        compiler.backend is !JavaScriptBackend ||
+        compiler.backend is !DartBackend ||
         compiler.enableConcreteTypeInference) {
       return false;
     }
@@ -102,20 +101,12 @@
     if (function == null) return false;
 
     // TODO(lry): support functions with parameters.
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     if (signature.parameterCount > 0) return false;
 
-    // TODO(lry): support intercepted methods. Then the dependency on
-    // JavaScriptBackend will go away.
-    JavaScriptBackend backend = compiler.backend;
-    if (backend.isInterceptedMethod(element)) return false;
-
     // TODO(lry): support native functions (also in [visitReturn]).
     if (function.isNative()) return false;
 
-    // Methods annotated @IrRepresentation(false).
-    if (enforceAstRepresentation(function)) return false;
-
     return true;
   }
 
@@ -125,50 +116,6 @@
     return result;
   }
 
-  bool enforceAstRepresentation(Element element) {
-    return irRepresentationValue(element, false);
-  }
-
-  bool enforceIrRepresentation(Element element) {
-    return irRepresentationValue(element, true);
-  }
-
-  /**
-   * In host-checked mode, the @IrRepresentation annotation can be used to
-   * enforce the internal representation of a function.
-   */
-  bool irRepresentationValue(Element element, bool expected) {
-    if (!inCheckedMode || compiler.backend is !JavaScriptBackend) return false;
-    JavaScriptBackend backend = compiler.backend;
-    for (MetadataAnnotation metadata in element.metadata) {
-      if (metadata.value == null ||
-          !metadata.value.isConstructedObject()) {
-        continue;
-      }
-      ObjectConstant value = metadata.value;
-      ClassElement cls = value.type.element;
-      if (cls == backend.irRepresentationClass) {
-        ConstructedConstant classConstant = value;
-        BoolConstant constant = classConstant.fields[0];
-        return constant.value == expected;
-      }
-    }
-    return false;
-  }
-
-  void ensureIr(Element element) {
-    // If no IR was built for [element], ensure it is not annotated
-    // @IrRepresentation(true).
-    if (inCheckedMode &&
-        !compiler.irBuilder.hasIr(element) &&
-        enforceIrRepresentation(element)) {
-      compiler.reportFatalError(
-          element,
-          MessageKind.GENERIC,
-          {'text': "Error: cannot build IR for $element."});
-    }
-  }
-
   SourceFile elementSourceFile(Element element) {
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
@@ -183,10 +130,10 @@
  * to the [builder] and return the last added statement for trees that represent
  * an expression.
  */
-class IrBuilder extends ResolvedVisitor<ir.Trivial> {
+class IrBuilder extends ResolvedVisitor<ir.Definition> {
   final SourceFile sourceFile;
   ir.Continuation returnContinuation = null;
-  
+
   // The IR builder maintains a context, which is an expression with a hole in
   // it.  The hole represents the focus where new expressions can be added.
   // The context is implemented by 'root' which is the root of the expression
@@ -202,17 +149,17 @@
   // expression and current is null.
   //
   // Conceptually again, visiting an expression takes a context as input and
-  // returns either a pair of a new context and a trivial expression denoting
+  // returns either a pair of a new context and a definition denoting
   // the expression's value, or else an expression without a hole if all
   // control-flow paths through the expression have exited.
   //
   // We do not pass and return contexts, rather we use the current context
   // (root, current) as the visitor state and mutate current.  Visiting a
   // statement returns null; visiting an expression optionally returns the
-  // trivial expression denoting its value.
+  // definition denoting its value.
   ir.Expression root = null;
   ir.Expression current = null;
-  
+
   IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
       : super(elements, compiler);
 
@@ -258,7 +205,7 @@
       current = current.plug(expr);
     }
   }
-  
+
   /**
    * Add an explicit [:return null:] for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
@@ -271,13 +218,13 @@
     add(new ir.InvokeContinuation(returnContinuation, constant));
     current = null;
   }
-  
-  ir.Trivial visitEmptyStatement(ast.EmptyStatement node) {
+
+  ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
     assert(isOpen);
     return null;
   }
 
-  ir.Trivial visitBlock(ast.Block node) {
+  ir.Definition visitBlock(ast.Block node) {
     assert(isOpen);
     for (var n in node.statements.nodes) {
       n.accept(this);
@@ -289,11 +236,11 @@
   // Build(Return)    = let val x = null in InvokeContinuation(return, x)
   // Build(Return(e)) = C[InvokeContinuation(return, x)]
   //   where (C, x) = Build(e)
-  ir.Trivial visitReturn(ast.Return node) {
+  ir.Definition visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
     if (node.beginToken.value == 'native') return giveup();
-    ir.Trivial value;
+    ir.Definition value;
     if (node.expression == null) {
       value = new ir.Constant(constantSystem.createNull());
       add(new ir.LetVal(value));
@@ -305,10 +252,10 @@
     current = null;
     return null;
   }
-  
+
   // For all simple literals:
   // Build(Literal(c)) = (let val x = Constant(c) in [], x)
-  ir.Trivial visitLiteralBool(ast.LiteralBool node) {
+  ir.Definition visitLiteralBool(ast.LiteralBool node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createBool(node.value));
@@ -316,7 +263,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralDouble(ast.LiteralDouble node) {
+  ir.Definition visitLiteralDouble(ast.LiteralDouble node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createDouble(node.value));
@@ -324,7 +271,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralInt(ast.LiteralInt node) {
+  ir.Definition visitLiteralInt(ast.LiteralInt node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createInt(node.value));
@@ -332,7 +279,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralString(ast.LiteralString node) {
+  ir.Definition visitLiteralString(ast.LiteralString node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createString(node.dartString));
@@ -340,7 +287,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralNull(ast.LiteralNull node) {
+  ir.Definition visitLiteralNull(ast.LiteralNull node) {
     assert(isOpen);
     ir.Constant constant = new ir.Constant(constantSystem.createNull());
     add(new ir.LetVal(constant));
@@ -353,29 +300,29 @@
 //  IrNode visitLiteralMapEntry(LiteralMapEntry node) => visitNode(node);
 //  IrNode visitLiteralSymbol(LiteralSymbol node) => visitExpression(node);
 
-  ir.Trivial visitAssert(ast.Send node) {
+  ir.Definition visitAssert(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitClosureSend(ast.Send node) {
+  ir.Definition visitClosureSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitDynamicSend(ast.Send node) {
+  ir.Definition visitDynamicSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitGetterSend(ast.Send node) {
+  ir.Definition visitGetterSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitOperatorSend(ast.Send node) {
+  ir.Definition visitOperatorSend(ast.Send node) {
     return giveup();
   }
 
   // Build(StaticSend(f, a...)) = C[InvokeStatic(f, x...)]
   //   where (C, x...) = BuildList(a...)
-  ir.Trivial visitStaticSend(ast.Send node) {
+  ir.Definition visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
     // TODO(lry): support static fields. (separate IR instruction?)
@@ -415,17 +362,17 @@
     return v;
   }
 
-  ir.Trivial visitSuperSend(ast.Send node) {
+  ir.Definition visitSuperSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitTypeReferenceSend(ast.Send node) {
+  ir.Definition visitTypeReferenceSend(ast.Send node) {
     return giveup();
   }
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Trivial giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Definition giveup() => throw ABORT_IRNODE_BUILDER;
 
   ir.Function nullIfGiveup(ir.Function action()) {
     try {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index b2ed5a6..4825e68 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -23,64 +23,64 @@
   Expression plug(Expression expr) => throw 'impossible';
 }
 
-// Trivial is the base class of things that variables can refer to: primitives,
-// continuations, function and continuation parameters, etc.
-abstract class Trivial extends Node {
+/// The base class of things that variables can refer to: primitives,
+/// continuations, function and continuation parameters, etc.
+abstract class Definition extends Node {
   // The head of a linked-list of occurrences, in no particular order.
   Variable firstUse = null;
 }
 
-// Operands to invocations and primitives are always variables.  They point to
-// their definition and are linked into a list of occurrences.
+/// Operands to invocations and primitives are always variables.  They point to
+/// their definition and are linked into a list of occurrences.
 class Variable {
-  Trivial definition;
+  Definition definition;
   Variable nextUse = null;
-  
+
   Variable(this.definition) {
     nextUse = definition.firstUse;
     definition.firstUse = this;
   }
 }
 
-// Binding a value (primitive or constant): 'let val x = V in E'.  The bound
-// value is in scope in the body.
-// During one-pass construction a LetVal with an empty body is used to
-// represent one-level context 'let val x = V in []'.
+/// Binding a value (primitive or constant): 'let val x = V in E'.  The bound
+/// value is in scope in the body.
+/// During one-pass construction a LetVal with an empty body is used to
+/// represent one-level context 'let val x = V in []'.
 class LetVal extends Expression {
-  final Trivial value;
+  final Definition value;
   Expression body = null;
-  
+
   LetVal(this.value);
-  
+
   Expression plug(Expression expr) {
     assert(body == null);
     return body = expr;
   }
-  
+
   accept(Visitor visitor) => visitor.visitLetVal(this);
 }
 
 
-// Binding a continuation: 'let cont k(v) = E in E'.  The bound continuation is
-// in scope in the body and the continuation parameter is in scope in the
-// continuation body.
-// During one-pass construction a LetCont with an empty continuation body is
-// used to represent the one-level context 'let cont k(v) = [] in E'.
+/// Binding a continuation: 'let cont k(v) = E in E'.  The bound continuation
+/// is in scope in the body and the continuation parameter is in scope in the
+/// continuation body.
+/// During one-pass construction a LetCont with an empty continuation body is
+/// used to represent the one-level context 'let cont k(v) = [] in E'.
 class LetCont extends Expression {
   final Continuation continuation;
   final Expression body;
-  
+
   LetCont(this.continuation, this.body);
-  
+
   Expression plug(Expression expr) {
     assert(continuation.body == null);
     return continuation.body = expr;
   }
-  
+
   accept(Visitor visitor) => visitor.visitLetCont(this);
 }
 
-// Invoke a static function in tail position.
+/// Invoke a static function in tail position.
 class InvokeStatic extends Expression {
   final FunctionElement target;
 
@@ -93,9 +93,9 @@
 
   final Variable continuation;
   final List<Variable> arguments;
-  
+
   InvokeStatic(this.target, this.selector, Continuation cont,
-               List<Trivial> args)
+               List<Definition> args)
       : continuation = new Variable(cont),
         arguments = args.map((t) => new Variable(t)).toList(growable: false) {
     assert(selector.kind == SelectorKind.CALL);
@@ -105,54 +105,52 @@
   accept(Visitor visitor) => visitor.visitInvokeStatic(this);
 }
 
-// Invoke a continuation in tail position.
+/// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
   final Variable continuation;
   final Variable argument;
-  
-  InvokeContinuation(Continuation cont, Trivial arg)
+
+  InvokeContinuation(Continuation cont, Definition arg)
       : continuation = new Variable(cont),
         argument = new Variable(arg);
-  
+
   accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
 }
 
-// Constants are values, they are always bound by 'let val'.
-class Constant extends Trivial {
+class Constant extends Definition {
   final dart2js.Constant value;
-  
+
   Constant(this.value);
-  
+
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
-// Function and continuation parameters are trivial.
-class Parameter extends Trivial {
+class Parameter extends Definition {
   Parameter();
-  
+
   accept(Visitor visitor) => visitor.visitParameter(this);
 }
 
-// Continuations are trivial.  They are normally bound by 'let cont'.  A
-// continuation with no parameter (or body) is used to represent a function's
-// return continuation.
-class Continuation extends Trivial {
+/// Continuations are normally bound by 'let cont'.  A continuation with no
+/// parameter (or body) is used to represent a function's return continuation.
+/// The return continuation is bound by the Function, not by 'let cont'.
+class Continuation extends Definition {
   final Parameter parameter;
   Expression body = null;
-  
+
   Continuation(this.parameter);
-  
+
   Continuation.retrn() : parameter = null;
-  
+
   accept(Visitor visitor) => visitor.visitContinuation(this);
 }
 
-// A function definition, consisting of parameters and a body.  The parameters
-// include a distinguished continuation parameter.
-class Function extends Expression {
+/// A function definition, consisting of parameters and a body.  The parameters
+/// include a distinguished continuation parameter.
+class Function extends Node {
   final int endOffset;
   final int namePosition;
-  
+
   final Continuation returnContinuation;
   final Expression body;
 
@@ -168,39 +166,39 @@
 
 abstract class Visitor<T> {
   T visitNode(Node node) => node.accept(this);
-  
+
   T visitFunction(Function node) => visitNode(node);
   T visitExpression(Expression node) => visitNode(node);
-  T visitTrivial(Trivial node) => visitNode(node);
-  
+  T visitDefinition(Definition node) => visitNode(node);
+
   T visitLetVal(LetVal expr) => visitExpression(expr);
   T visitLetCont(LetCont expr) => visitExpression(expr);
   T visitInvokeStatic(InvokeStatic expr) => visitExpression(expr);
   T visitInvokeContinuation(InvokeContinuation expr) => visitExpression(expr);
-  
-  T visitConstant(Constant triv) => visitTrivial(triv);
-  T visitParameter(Parameter triv) => visitTrivial(triv);
-  T visitContinuation(Continuation triv) => visitTrivial(triv);
+
+  T visitConstant(Constant triv) => visitDefinition(triv);
+  T visitParameter(Parameter triv) => visitDefinition(triv);
+  T visitContinuation(Continuation triv) => visitDefinition(triv);
 }
 
-// Generate a Lisp-like S-expression representation of an IR node as a string.
-// The representation is not pretty-printed, but it can easily be quoted and
-// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
-// pretty-printed.
+/// Generate a Lisp-like S-expression representation of an IR node as a string.
+/// The representation is not pretty-printed, but it can easily be quoted and
+/// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
+/// pretty-printed.
 class SExpressionStringifier extends Visitor<String> {
-  final Map<Trivial, String> names = <Trivial, String>{};
-  
+  final Map<Definition, String> names = <Definition, String>{};
+
   int _valueCounter = 0;
   int _continuationCounter = 0;
-  
+
   String newValueName() => 'v${_valueCounter++}';
   String newContinuationName() => 'k${_continuationCounter++}';
-  
+
   String visitFunction(Function node) {
     names[node.returnContinuation] = 'return';
     return '(Function ${node.body.accept(this)})';
   }
-  
+
   String visitLetVal(LetVal expr) {
     String name = newValueName();
     names[expr.value] = name;
@@ -208,7 +206,7 @@
     String body = expr.body.accept(this);
     return '(LetVal $name $value) $body';
   }
-  
+
   String visitLetCont(LetCont expr) {
     String cont = newContinuationName();
     String param = newValueName();
@@ -218,7 +216,7 @@
     String body = expr.body == null ? 'null' : expr.body.accept(this);
     return '(LetCont ($cont $param) $contBody) $body';
   }
-  
+
   String visitInvokeStatic(InvokeStatic expr) {
     String name = expr.target.name;
     String cont = names[expr.continuation.definition];
@@ -226,21 +224,21 @@
         expr.arguments.map((v) => names[v.definition]).toList(growable: false);
     return '(InvokeStatic $name $cont ${args.join(' ')})';
   }
-  
+
   String visitInvokeContinuation(InvokeContinuation expr) {
     String cont = names[expr.continuation.definition];
     String arg = names[expr.argument.definition];
     return '(InvokeContinuation $cont $arg)';
   }
-  
+
   String visitConstant(Constant triv) {
     return '(Constant ${triv.value})';
   }
-  
+
   String visitParameter(Parameter triv) {
     return '(Unexpected Parameter)';
   }
-  
+
   String visitContinuation(Continuation triv) {
     return '(Unexpected Continuation)';
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 2ac626b..075d0f1 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -121,7 +121,7 @@
     int tag = readByte();
     switch (tag) {
       case Pickles.NODE_CONSTANT:
-        ir.Trivial constant = readConstantNode();
+        ir.Definition constant = readConstantNode();
         unpickled[index++] = constant;
         addExpression(new ir.LetVal(constant));
         break;
@@ -169,9 +169,9 @@
     return unpickled[entryIndex];
   }
 
-  List<ir.Trivial> readBackReferenceList() {
+  List<ir.Definition> readBackReferenceList() {
     int length = readInt();
-    List<ir.Trivial> result = new List<ir.Trivial>(length);
+    List<ir.Definition> result = new List<ir.Definition>(length);
     for (int i = 0; i < length; i++) {
       result[i] = readBackReference();
     }
@@ -199,14 +199,14 @@
     FunctionElement functionElement = readElement();
     Selector selector = readSelector();
     ir.Continuation continuation = readBackReference();
-    List<ir.Trivial> arguments = readBackReferenceList();
+    List<ir.Definition> arguments = readBackReferenceList();
     return new ir.InvokeStatic(functionElement, selector, continuation,
                                arguments);
   }
 
   ir.InvokeContinuation readInvokeContinuationNode() {
     ir.Continuation continuation = readBackReference();
-    ir.Trivial argument = readBackReference();
+    ir.Definition argument = readBackReference();
     return new ir.InvokeContinuation(continuation, argument);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index d157b56..78f901f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -652,14 +652,14 @@
     DartType type = constant.computeType(compiler);
     registerInstantiatedConstantType(type, elements);
 
-    if (constant.isFunction()) {
+    if (constant.isFunction) {
       FunctionConstant function = constant;
       compiler.enqueuer.codegen.registerGetOfStaticFunction(function.element);
-    } else if (constant.isInterceptor()) {
+    } else if (constant.isInterceptor) {
       // An interceptor constant references the class's prototype chain.
       InterceptorConstant interceptor = constant;
       registerInstantiatedConstantType(interceptor.dispatchedType, elements);
-    } else if (constant.isType()) {
+    } else if (constant.isType) {
       TypeConstant typeConstant = constant;
       registerTypeLiteral(typeConstant.representedType.element,
           compiler.enqueuer.codegen, elements);
@@ -1820,7 +1820,7 @@
     bool hasNoSideEffects = false;
     for (MetadataAnnotation metadata in element.metadata) {
       metadata.ensureResolved(compiler);
-      if (!metadata.value.isConstructedObject()) continue;
+      if (!metadata.value.isConstructedObject) continue;
       ObjectConstant value = metadata.value;
       ClassElement cls = value.type.element;
       if (cls == noInlineClass) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 206b3df..68fb5dc7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -12,7 +12,7 @@
   Constant fold(Constant constant) {
     if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
       // In JavaScript we don't check for -0 and treat it as if it was zero.
-      if (constant.isMinusZero()) constant = DART_CONSTANT_SYSTEM.createInt(0);
+      if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
       IntConstant intConstant = constant;
       // We convert the result of bit-operations to 32 bit unsigned integers.
       return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.value);
@@ -34,8 +34,8 @@
 
   Constant fold(Constant left, Constant right) {
     // In JavaScript we don't check for -0 and treat it as if it was zero.
-    if (left.isMinusZero()) left = DART_CONSTANT_SYSTEM.createInt(0);
-    if (right.isMinusZero()) right = DART_CONSTANT_SYSTEM.createInt(0);
+    if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
+    if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
     IntConstant result = dartBitOperation.fold(left, right);
     if (result != null) {
       // We convert the result of bit-operations to 32 bit unsigned integers.
@@ -52,7 +52,7 @@
 
   Constant fold(Constant left, Constant right) {
     // Truncate the input value to 32 bits if necessary.
-    if (left.isInt()) {
+    if (left.isInt) {
       IntConstant intConstant = left;
       int value = intConstant.value;
       int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
@@ -81,7 +81,7 @@
   String get name => dartNegateOperation.name;
 
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       if (intConstant.value == 0) {
         return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
@@ -119,7 +119,7 @@
     if (result == null || result.value) return result;
     // In JavaScript -0.0 === 0 and all doubles are equal to their integer
     // values. Furthermore NaN !== NaN.
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       double leftDouble = leftNum.value.toDouble();
@@ -181,7 +181,7 @@
   }
 
   NumConstant convertToJavaScriptConstant(NumConstant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       int intValue = intConstant.value;
       if (integerBecomesNanOrInfinity(intValue)) {
@@ -193,11 +193,11 @@
       if (floorValue != intValue) {
         return new IntConstant(floorValue);
       }
-    } else if (constant.isDouble()) {
+    } else if (constant.isDouble) {
       DoubleConstant doubleResult = constant;
       double doubleValue = doubleResult.value;
       if (!doubleValue.isInfinite && !doubleValue.isNaN &&
-          !constant.isMinusZero()) {
+          !constant.isMinusZero) {
         int intValue = doubleValue.truncate();
         if (intValue == doubleValue) {
           return new IntConstant(intValue);
@@ -217,12 +217,12 @@
   NullConstant createNull() => new NullConstant();
 
   // Integer checks don't verify that the number is not -0.0.
-  bool isInt(Constant constant) => constant.isInt() || constant.isMinusZero();
+  bool isInt(Constant constant) => constant.isInt || constant.isMinusZero;
   bool isDouble(Constant constant)
-      => constant.isDouble() && !constant.isMinusZero();
-  bool isString(Constant constant) => constant.isString();
-  bool isBool(Constant constant) => constant.isBool();
-  bool isNull(Constant constant) => constant.isNull();
+      => constant.isDouble && !constant.isMinusZero;
+  bool isString(Constant constant) => constant.isString;
+  bool isBool(Constant constant) => constant.isBool;
+  bool isNull(Constant constant) => constant.isNull;
 
   bool isSubtype(Compiler compiler, DartType s, DartType t) {
     // At runtime, an integer is both an integer and a double: the
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 2a9c15f..8fa9596 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -171,8 +171,8 @@
   }
 
   TypeConstant makeTypeConstant(ClassElement element) {
-    DartType elementType = element.computeType(compiler).asRaw();
-    DartType constantType = backend.typeImplementation.computeType(compiler);
+    DartType elementType = element.rawType;
+    DartType constantType = backend.typeImplementation.rawType;
     return new TypeConstant(elementType, constantType);
   }
 
@@ -187,7 +187,7 @@
       if (member.isGenerativeConstructor()) {
         // Ignore constructors that cannot be called with zero arguments.
         FunctionElement constructor = member;
-        FunctionSignature parameters = constructor.computeSignature(compiler);
+        FunctionSignature parameters = constructor.functionSignature;
         if (parameters.requiredParameterCount == 0) {
           result.add(member);
         }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index e148cee..19519e8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -305,7 +305,7 @@
     // In the current implementation it doesn't make sense to give names to
     // function constants since the function-implementation itself serves as
     // constant and can be accessed directly.
-    assert(!constant.isFunction());
+    assert(!constant.isFunction);
     String result = constantNames[constant];
     if (result == null) {
       String longName = constantLongName(constant);
@@ -382,7 +382,7 @@
     if (element.isGenerativeConstructorBody()) {
       name = Elements.reconstructConstructorNameSourceString(element);
     }
-    FunctionSignature signature = element.computeSignature(compiler);
+    FunctionSignature signature = element.functionSignature;
     String methodName =
         '${privateName(library, name)}\$${signature.parameterCount}';
     if (signature.optionalParametersAreNamed &&
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index d6a2229..0f50edd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -370,19 +370,19 @@
       List<jsAst.Statement> statements,
       FunctionElement member,
       List<jsAst.Parameter> stubParameters) {
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     Element converter =
         compiler.findHelper('convertDartClosureToJS');
     String closureConverter = backend.namer.isolateAccess(converter);
     Set<String> stubParameterNames = new Set<String>.from(
         stubParameters.map((param) => param.name));
-    parameters.forEachParameter((Element parameter) {
+    parameters.forEachParameter((ParameterElement parameter) {
       String name = parameter.name;
       // If [name] is not in [stubParameters], then the parameter is an optional
       // parameter that was not provided for this stub.
       for (jsAst.Parameter stubParameter in stubParameters) {
         if (stubParameter.name == name) {
-          DartType type = parameter.computeType(compiler).unalias(compiler);
+          DartType type = parameter.type.unalias(compiler);
           if (type is FunctionType) {
             // The parameter type is a function type either directly or through
             // typedef(s).
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index df46098..0f0cb0c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -186,8 +186,8 @@
           potentiallyAddForRti(contextClass);
         }
         if (type.kind == TypeKind.FUNCTION) {
-          void analyzeMethod(Element method) {
-            DartType memberType = method.computeType(compiler);
+          void analyzeMethod(TypedElement method) {
+            DartType memberType = method.type;
             ClassElement contextClass = Types.getClassContext(memberType);
             if (contextClass != null &&
                 compiler.types.isPotentialSubtype(memberType, type)) {
@@ -201,8 +201,8 @@
       }
     });
     if (compiler.enableTypeAssertions) {
-      void analyzeMethod(Element method) {
-        DartType memberType = method.computeType(compiler);
+      void analyzeMethod(TypedElement method) {
+        DartType memberType = method.type;
         ClassElement contextClass = Types.getClassContext(memberType);
         if (contextClass != null) {
           potentiallyAddForRti(contextClass);
@@ -282,14 +282,14 @@
       }
     }
     for (FunctionElement element in universe.staticFunctionsNeedingGetter) {
-      instantiatedTypes.add(element.computeType(compiler));
+      instantiatedTypes.add(element.type);
     }
     // TODO(johnniwinther): We should get this information through the
     // [neededClasses] computed in the emitter instead of storing it and pulling
     // it from resolution, but currently it would introduce a cyclic dependency
     // between [computeRequiredChecks] and [computeNeededClasses].
-    for (Element element in compiler.resolverWorld.closurizedMembers) {
-      instantiatedTypes.add(element.computeType(compiler));
+    for (TypedElement element in compiler.resolverWorld.closurizedMembers) {
+      instantiatedTypes.add(element.type);
     }
     return instantiatedTypes;
   }
@@ -432,7 +432,7 @@
       return true;
     }
 
-    InterfaceType originalType = cls.computeType(compiler);
+    InterfaceType originalType = cls.thisType;
     InterfaceType type = originalType.asInstanceOf(check);
     // [type] is not a subtype of [check]. we do not generate a check and do not
     // need a substitution.
@@ -498,7 +498,7 @@
     // Unnamed mixin application classes do not need substitutions, because they
     // are never instantiated and their checks are overwritten by the class that
     // they are mixed into.
-    InterfaceType type = cls.computeType(compiler);
+    InterfaceType type = cls.thisType;
     InterfaceType target = type.asInstanceOf(check);
     Link<DartType> typeVariables = cls.typeVariables;
     if (typeVariables.isEmpty && !alwaysGenerateFunction) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index 746f7f8..a847d3e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -63,7 +63,7 @@
         return;
       }
 
-      InterfaceType typeVariableType = typeVariableClass.computeType(compiler);
+      InterfaceType typeVariableType = typeVariableClass.thisType;
       List<int> constants = <int>[];
       evaluator = new CompileTimeConstantEvaluator(
           compiler.constantHandler,
@@ -100,7 +100,8 @@
     if (!enqueuer.isResolutionQueue || typeVariableClasses == null) return;
     backend.enqueueClass(
           enqueuer, typeVariableClass, compiler.globalDependencies);
-    Link constructors = typeVariableClass.ensureResolved(compiler).constructors;
+    typeVariableClass.ensureResolved(compiler);
+    Link constructors = typeVariableClass.constructors;
     if (constructors.isEmpty && constructors.tail.isEmpty) {
       compiler.reportInternalError(
           typeVariableClass,
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index b28becf..c3b54b1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -494,10 +494,10 @@
     return field is ClosureFieldElement;
   }
 
-  bool canAvoidGeneratedCheckedSetter(Element member) {
+  bool canAvoidGeneratedCheckedSetter(VariableElement member) {
     // We never generate accessors for top-level/static fields.
     if (!member.isInstanceMember()) return true;
-    DartType type = member.computeType(compiler);
+    DartType type = member.type;
     return type.treatAsDynamic || (type.element == compiler.objectClass);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index d0218e4..4cb149e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -703,9 +703,9 @@
           isConstructor = true;
           name = Elements.reconstructConstructorName(function);
         }
-        requiredParameterCount = function.requiredParameterCount(compiler);
-        optionalParameterCount = function.optionalParameterCount(compiler);
-        FunctionSignature signature = function.computeSignature(compiler);
+        FunctionSignature signature = function.functionSignature;
+        requiredParameterCount = signature.requiredParameterCount;
+        optionalParameterCount = signature.optionalParameterCount;
         if (signature.optionalParametersAreNamed) {
           var names = [];
           for (Element e in signature.optionalParameters) {
@@ -922,7 +922,7 @@
       }
 
       String name = namer.constantName(constant);
-      if (constant.isList()) emitMakeConstantListIfNotEmitted(buffer);
+      if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
       jsAst.Expression init = js(
           '${namer.globalObjectForConstant(constant)}.$name = #',
           constantInitializerExpression(constant));
@@ -932,9 +932,9 @@
   }
 
   bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
-    if (constant.isFunction()) return true;    // Already emitted.
-    if (constant.isPrimitive()) return true;   // Inlined.
-    if (constant.isDummy()) return true;       // Inlined.
+    if (constant.isFunction) return true;    // Already emitted.
+    if (constant.isPrimitive) return true;   // Inlined.
+    if (constant.isDummy) return true;       // Inlined.
     // The name is null when the constant is already a JS constant.
     // TODO(floitsch): every constant should be registered, so that we can
     // share the ones that take up too much space (like some strings).
@@ -1009,7 +1009,7 @@
 
         js('var rootProperty = "_${generateIsolateTagRoot()}"'),
         js.for_('var i = 0', null, 'i++', [
-            js('property = intern(rootProperty + "_" + i + "_")'),
+            js('var property = intern(rootProperty + "_" + i + "_")'),
             js.if_('!(property in usedProperties)', [
                 js('usedProperties[property] = 1'),
                 js('init.isolateTag = property'),
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 836bc58..6111f23 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -30,7 +30,7 @@
                         Selector selector,
                         AddStubFunction addStub,
                         Set<String> alreadyGenerated) {
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     int positionalArgumentCount = selector.positionalArgumentCount;
     if (positionalArgumentCount == parameters.parameterCount) {
       assert(selector.namedArgumentCount == 0);
@@ -103,7 +103,7 @@
           if (value == null) {
             argumentsBuffer[count] = task.constantReference(new NullConstant());
           } else {
-            if (!value.isNull()) {
+            if (!value.isNull) {
               // If the value is the null constant, we should not pass it
               // down to the native method.
               indexOfLastOptionalArgumentInParameters = count;
@@ -349,7 +349,7 @@
     if (code == null) return;
     String name = namer.getNameOfMember(member);
     task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     bool needsStubs = !parameters.optionalParameters.isEmpty;
     bool canTearOff = false;
     bool isClosure = false;
@@ -472,9 +472,9 @@
       DartType memberType;
       if (member.isGenerativeConstructorBody()) {
         var body = member;
-        memberType = body.constructor.computeType(compiler);
+        memberType = body.constructor.type;
       } else {
-        memberType = member.computeType(compiler);
+        memberType = member.type;
       }
       if (memberType.containsTypeVariables) {
         jsAst.Expression thisAccess = js(r'this.$receiver');
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
index b6eb5c8..43ec0dd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
@@ -43,7 +43,7 @@
   }
 
   List<int> reifyDefaultArguments(FunctionElement function) {
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     if (signature.optionalParameterCount == 0) return const [];
     List<int> defaultValues = <int>[];
     for (Element element in signature.optionalParameters) {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
index c3c2b39..e8f5a70 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
@@ -21,17 +21,12 @@
 }
 
 abstract class InstanceMirrorMixin implements InstanceMirror {
-
   bool get hasReflectee => false;
 
   get reflectee {
     throw new UnsupportedError('InstanceMirror.reflectee unsupported.');
   }
 
-  Function operator [](Symbol name) {
-    throw new UnsupportedError('InstanceMirror.operator [] unsupported.');
-  }
-
   delegate(Invocation invocation) {
     throw new UnsupportedError('InstanceMirror.delegate unsupported');
   }
@@ -68,8 +63,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Dart2JsConstantMirror extends Object
-    with ObjectMirrorMixin, InstanceMirrorMixin
-    implements InstanceMirror {
+    with ObjectMirrorMixin, InstanceMirrorMixin {
   final Dart2JsMirrorSystem mirrorSystem;
   final Constant _constant;
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
index 132308b..82e593d 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
@@ -153,6 +153,8 @@
   bool get isImport => _node.asImport() != null;
 
   bool get isExport => _node.asExport() != null;
+
+  List<InstanceMirror> get metadata => const <InstanceMirror>[];
 }
 
 class Dart2JsCombinatorMirror implements CombinatorSourceMirror {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index 64ba2d3..0400664 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -136,11 +136,11 @@
 
   List<ParameterMirror> get parameters {
     return _parametersFromFunctionSignature(this,
-        _function.computeSignature(mirrorSystem.compiler));
+        _function.functionSignature);
   }
 
   TypeMirror get returnType => owner._getTypeMirror(
-      _function.computeSignature(mirrorSystem.compiler).returnType);
+      _function.functionSignature.returnType);
 
   bool get isAbstract => _function.isAbstract;
 
@@ -194,8 +194,7 @@
 
   bool get isConst => _variable.modifiers.isConst();
 
-  TypeMirror get type =>
-      owner._getTypeMirror(_variable.computeType(mirrorSystem.compiler));
+  TypeMirror get type => owner._getTypeMirror(_variable.type);
 
 
 }
@@ -227,9 +226,8 @@
 
   ParameterElement get _element => super._element;
 
-  TypeMirror get type => owner._getTypeMirror(
-      _element.computeType(mirrorSystem.compiler),
-      _element.functionSignature);
+  TypeMirror get type => owner._getTypeMirror(_element.type,
+                                              _element.functionSignature);
 
 
   bool get isFinal => false;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 5359a09..37f542b 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -343,13 +343,11 @@
     return null;
   }
 
-  DeclarationMirror _getTypeDeclarationMirror(Element element) {
+  DeclarationMirror _getTypeDeclarationMirror(TypeDeclarationElement element) {
     if (element.isClass()) {
-      return new Dart2JsClassDeclarationMirror(
-          this, element.computeType(compiler));
+      return new Dart2JsClassDeclarationMirror(this, element.thisType);
     } else if (element.isTypedef()) {
-      return new Dart2JsTypedefDeclarationMirror(this,
-          element.computeType(compiler));
+      return new Dart2JsTypedefDeclarationMirror(this, element.thisType);
     }
     compiler.internalError("Unexpected element $element");
     return null;
@@ -395,15 +393,16 @@
 DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system,
                                                      Element element) {
   if (element.isTypeVariable()) {
-    return new Dart2JsTypeVariableMirror(
-        system, element.computeType(system.compiler));
+    TypeVariableElement typeVariable = element;
+    return new Dart2JsTypeVariableMirror(system, typeVariable.type);
   }
 
   Dart2JsLibraryMirror library = system._libraryMap[element.getLibrary()];
   if (element.isLibrary()) return library;
   if (element.isTypedef()) {
+    TypedefElement typedefElement = element;
     return new Dart2JsTypedefMirror.fromLibrary(
-        library, element.computeType(system.compiler));
+        library, typedefElement.thisType);
   }
 
   Dart2JsDeclarationMirror container = library;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
index 3d3b668..1ac23d0 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -167,8 +167,7 @@
 
 class Dart2JsInterfaceTypeMirror
     extends Dart2JsGenericTypeMirror
-    with ObjectMirrorMixin, InstanceMirrorMixin, ClassMirrorMixin,
-         ContainerMixin
+    with ObjectMirrorMixin, ClassMirrorMixin, ContainerMixin
     implements ClassMirror {
   Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
                              InterfaceType interfaceType)
@@ -255,7 +254,7 @@
       Dart2JsClassDeclarationMirror otherDeclaration =
           other.originalDeclaration;
       return _element.isSubclassOf(otherDeclaration._element);
-    } else if (other is TypeMirror) {
+    } else if (other is FunctionTypeMirror) {
       return false;
     }
     throw new ArgumentError(other);
@@ -351,8 +350,7 @@
 }
 
 class Dart2JsFunctionTypeMirror extends Dart2JsTypeMirror
-    with ObjectMirrorMixin, InstanceMirrorMixin,
-         ClassMirrorMixin, DeclarationMixin
+    with ObjectMirrorMixin, ClassMirrorMixin, DeclarationMixin
     implements FunctionTypeMirror {
   final FunctionSignature _functionSignature;
   List<ParameterMirror> _parameters;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index d9e860d..034d209 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -395,16 +395,16 @@
   /// and a hint is emitted).
   List convertConstantToUsageList(
       Constant constant, { bool onlyStrings: false }) {
-    if (constant.isNull()) {
+    if (constant.isNull) {
       return null;
-    } else if (constant.isList()) {
+    } else if (constant.isList) {
       ListConstant list = constant;
       List result = onlyStrings ? <String> [] : [];
       for (Constant entry in list.entries) {
-        if (entry.isString()) {
+        if (entry.isString) {
           StringConstant string = entry;
           result.add(string.value.slowToString());
-        } else if (!onlyStrings && entry.isType()) {
+        } else if (!onlyStrings && entry.isType) {
           TypeConstant type = entry;
           result.add(type.representedType);
         } else {
@@ -418,10 +418,10 @@
         }
       }
       return result;
-    } else if (!onlyStrings && constant.isType()) {
+    } else if (!onlyStrings && constant.isType) {
       TypeConstant type = constant;
       return [type.representedType];
-    } else if (constant.isString()) {
+    } else if (constant.isString) {
       StringConstant string = constant;
       var iterable =
           string.value.slowToString().split(',').map((e) => e.trim());
@@ -445,7 +445,8 @@
     if (type.kind == TypeKind.INTERFACE && library.isInternalLibrary) {
       InterfaceType interface = type;
       ClassElement cls = type.element;
-      for (DartType supertype in cls.ensureResolved(compiler).allSupertypes) {
+      cls.ensureResolved(compiler);
+      for (DartType supertype in cls.allSupertypes) {
         if (supertype.kind == TypeKind.INTERFACE
             && !supertype.element.getLibrary().isInternalLibrary) {
           return interface.asInstanceOf(supertype.element);
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 12563b5..966c5b3 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -815,9 +815,9 @@
     // TODO(sra): Optional arguments are currently missing from the
     // DartType. This should be fixed so the following work-around can be
     // removed.
-    method.computeSignature(compiler).forEachOptionalParameter(
-        (Element parameter) {
-          behavior._escape(parameter.computeType(compiler), compiler);
+    method.functionSignature.forEachOptionalParameter(
+        (ParameterElement parameter) {
+          behavior._escape(parameter.type, compiler);
         });
 
     behavior._overrideWithAnnotations(method, compiler);
@@ -853,7 +853,7 @@
       if (e is! ClassElement) return null;
       ClassElement cls = e;
       cls.ensureResolved(compiler);
-      return cls.computeType(compiler);
+      return cls.thisType;
     }
 
     NativeEnqueuer enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
@@ -1090,7 +1090,7 @@
     nativeEmitter.nativeMethods.add(element);
   }
 
-  FunctionSignature parameters = element.computeSignature(builder.compiler);
+  FunctionSignature parameters = element.functionSignature;
   if (!hasBody) {
     List<String> arguments = <String>[];
     List<HInstruction> inputs = <HInstruction>[];
@@ -1099,8 +1099,8 @@
       receiver = '#.';
       inputs.add(builder.localsHandler.readThis());
     }
-    parameters.forEachParameter((Element parameter) {
-      DartType type = parameter.computeType(compiler).unalias(compiler);
+    parameters.forEachParameter((ParameterElement parameter) {
+      DartType type = parameter.type.unalias(compiler);
       HInstruction input = builder.localsHandler.readLocal(parameter);
       if (type is FunctionType) {
         // The parameter type is a function type either directly or through
diff --git a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
index c21996e..d9af606 100644
--- a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
+++ b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
@@ -121,7 +121,7 @@
   void add(Compiler compiler, InterfaceType type) {
     if (type.element == cls) {
       if (type.element != compiler.objectClass) {
-        allSupertypes.addLast(compiler.objectClass.computeType(compiler));
+        allSupertypes.addLast(compiler.objectClass.rawType);
       }
       _addAtDepth(compiler, type, maxDepth + 1);
     } else {
@@ -141,7 +141,7 @@
       if (existingType.element == type.element) {
         compiler.reportInternalError(cls,
             MessageKind.MULTI_INHERITANCE,
-            {'thisType': cls.computeType(compiler),
+            {'thisType': cls.thisType,
              'firstType': existingType,
              'secondType': type});
         return;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 3e5e15f..832b2cd 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -271,10 +271,6 @@
 
       if (identical(kind, ElementKind.FIELD)) return resolveField(element);
 
-      if (identical(kind, ElementKind.PARAMETER) ||
-          identical(kind, ElementKind.FIELD_PARAMETER)) {
-        return resolveParameter(element);
-      }
       if (element.isClass()) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
@@ -452,7 +448,7 @@
     }
   }
 
-  TreeElements resolveMethodElement(FunctionElement element) {
+  TreeElements resolveMethodElement(FunctionElementX element) {
     assert(invariant(element, element.isDeclaration));
     return compiler.withCurrentElement(element, () {
       bool isConstructor =
@@ -462,7 +458,7 @@
       if (elements != null) {
         // TODO(karlklose): Remove the check for [isConstructor]. [elememts]
         // should never be non-null, not even for constructors.
-        assert(invariant(element, isConstructor,
+        assert(invariant(element, element.isConstructor(),
             message: 'Non-constructor element $element '
                      'has already been analyzed.'));
         return elements;
@@ -477,7 +473,7 @@
           compiler.enqueuer.resolution.registerStaticUse(
               element.targetConstructor);
         }
-        return new TreeElementMapping(element);
+        return _ensureTreeElements(element);
       }
       if (element.isPatched) {
         checkMatchingPatchSignatures(element, element.patch);
@@ -550,8 +546,7 @@
   /// This method should only be used by this library (or tests of
   /// this library).
   ResolverVisitor visitorFor(Element element) {
-    var mapping = new TreeElementMapping(element);
-    return new ResolverVisitor(compiler, element, mapping);
+    return new ResolverVisitor(compiler, element, _ensureTreeElements(element));
   }
 
   TreeElements resolveField(VariableElementX element) {
@@ -580,6 +575,9 @@
       compiler.reportError(element, MessageKind.CONST_WITHOUT_INITIALIZER);
     } else if (modifiers.isFinal() && !element.isInstanceMember()) {
       compiler.reportError(element, MessageKind.FINAL_WITHOUT_INITIALIZER);
+    } else {
+      compiler.enqueuer.resolution.registerInstantiatedClass(
+          compiler.nullClass, visitor.mapping);
     }
 
     if (Elements.isStaticOrTopLevelField(element)) {
@@ -593,9 +591,6 @@
           // unnecessary registrations.
           compiler.backend.registerLazyField(visitor.mapping);
         }
-      } else {
-        compiler.enqueuer.resolution.registerInstantiatedClass(
-            compiler.nullClass, visitor.mapping);
       }
     }
 
@@ -605,13 +600,6 @@
     return visitor.mapping;
   }
 
-  TreeElements resolveParameter(ParameterElement element) {
-    element.parseNode(compiler);
-    ResolverVisitor visitor = visitorFor(element.enclosingElement);
-    visitor.visit(element.initializer);
-    return visitor.mapping;
-  }
-
   DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
     DartType type = resolveReturnType(element, annotation);
     if (type == compiler.types.voidType) {
@@ -768,11 +756,11 @@
    * Warning: Do not call this method directly. Instead use
    * [:element.ensureResolved(compiler):].
    */
-  void resolveClass(ClassElement element) {
+  TreeElements resolveClass(BaseClassElementX element) {
     _resolveTypeDeclaration(element, () {
       // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
-      TreeElementMapping mapping = new TreeElementMapping(element);
-      resolveClassInternal(element, mapping);
+      resolveClassInternal(element, _ensureTreeElements(element));
+      return element.treeElements;
     });
   }
 
@@ -1139,7 +1127,7 @@
   }
 
 
-  FunctionSignature resolveSignature(FunctionElement element) {
+  FunctionSignature resolveSignature(FunctionElementX element) {
     MessageKind defaultValuesError = null;
     if (element.isFactoryConstructor()) {
       FunctionExpression body = element.parseNode(compiler);
@@ -1152,19 +1140,15 @@
           compiler.parser.measure(() => element.parseNode(compiler));
       return measure(() => SignatureResolver.analyze(
           compiler, node.parameters, node.returnType, element,
-          // TODO(johnniwinther): Use the [TreeElements] used for resolution of
-          // the method body.
-          new TreeElementMapping(element),
+          _ensureTreeElements(element),
           defaultValuesError: defaultValuesError));
     });
   }
 
   TreeElements resolveTypedef(TypedefElementX element) {
-    if (element.isResolved) return element.mapping;
+    if (element.isResolved) return element.treeElements;
     return _resolveTypeDeclaration(element, () {
-      TreeElementMapping mapping = new TreeElementMapping(element);
-      // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
-      element.mapping = mapping;
+      TreeElementMapping mapping = _ensureTreeElements(element);
       return compiler.withCurrentElement(element, () {
         return measure(() {
           Typedef node =
@@ -1218,6 +1202,8 @@
       annotation.resolutionState = STATE_STARTED;
 
       Node node = annotation.parseNode(compiler);
+      // TODO(johnniwinther): Find the right analyzable element to hold the
+      // [TreeElements] for the annotation.
       Element annotatedElement = annotation.annotatedElement;
       Element context = annotatedElement.enclosingElement;
       if (context == null) {
@@ -2859,9 +2845,9 @@
         world.registerDynamicInvocation(selector);
       }
     } else if (Elements.isStaticOrTopLevel(target)) {
-      // TODO(kasperl): It seems like we're not supposed to register
-      // the use of classes. Wouldn't it be simpler if we just did?
-      if (!target.isClass()) {
+      // Avoid registration of type variables since they are not analyzable but
+      // instead resolved through their enclosing type declaration.
+      if (!target.isTypeVariable()) {
         // [target] might be the implementation element and only declaration
         // elements may be registered.
         world.registerStaticUse(target.declaration);
@@ -3108,7 +3094,7 @@
         Node argumentNode = node.send.arguments.head;
         Constant name = compiler.constantHandler.compileNodeWithDefinitions(
             argumentNode, mapping, isConst: true);
-        if (!name.isString()) {
+        if (!name.isString) {
           DartType type = name.computeType(compiler);
           compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED,
                                    {'type': type});
@@ -3141,7 +3127,7 @@
   void checkConstMapKeysDontOverrideEquals(Spannable spannable,
                                            MapConstant map) {
     for (Constant key in map.keys.entries) {
-      if (!key.isObject()) continue;
+      if (!key.isObject) continue;
       ObjectConstant objectConstant = key;
       DartType keyType = objectConstant.type;
       ClassElement cls = keyType.element;
@@ -3160,7 +3146,7 @@
       Constant constant = compiler.constantHandler.compileNodeWithDefinitions(
           node, mapping, isConst: isConst);
 
-      if (isConst && constant != null && constant.isMap()) {
+      if (isConst && constant != null && constant.isMap) {
         checkConstMapKeysDontOverrideEquals(node, constant);
       }
 
@@ -3169,7 +3155,7 @@
       // native class dispatch record referencing the interceptor.
       if (argumentsToJsInterceptorConstant != null &&
           argumentsToJsInterceptorConstant.contains(node)) {
-        if (constant.isType()) {
+        if (constant.isType) {
           TypeConstant typeConstant = constant;
           if (typeConstant.representedType is InterfaceType) {
             world.registerInstantiatedType(typeConstant.representedType,
@@ -3508,13 +3494,13 @@
   }
 
   DartType typeOfConstant(Constant constant) {
-    if (constant.isInt()) return compiler.intClass.rawType;
-    if (constant.isBool()) return compiler.boolClass.rawType;
-    if (constant.isDouble()) return compiler.doubleClass.rawType;
-    if (constant.isString()) return compiler.stringClass.rawType;
-    if (constant.isNull()) return compiler.nullClass.rawType;
-    if (constant.isFunction()) return compiler.functionClass.rawType;
-    assert(constant.isObject());
+    if (constant.isInt) return compiler.intClass.rawType;
+    if (constant.isBool) return compiler.boolClass.rawType;
+    if (constant.isDouble) return compiler.doubleClass.rawType;
+    if (constant.isString) return compiler.stringClass.rawType;
+    if (constant.isNull) return compiler.nullClass.rawType;
+    if (constant.isFunction) return compiler.functionClass.rawType;
+    assert(constant.isObject);
     ObjectConstant objectConstant = constant;
     return objectConstant.type;
   }
@@ -3564,7 +3550,7 @@
           } else if (caseType.element == compiler.functionClass) {
             compiler.reportError(node, MessageKind.SWITCH_CASE_FORBIDDEN,
                                  {'type': "Function"});
-          } else if (constant.isObject() && overridesEquals(caseType)) {
+          } else if (constant.isObject && overridesEquals(caseType)) {
             compiler.reportError(firstCase.expression,
                 MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
                 {'type': caseType});
@@ -3789,11 +3775,11 @@
       }
       nameSet.add(typeName);
 
-      TypeVariableElement variableElement = typeVariable.element;
+      TypeVariableElementX variableElement = typeVariable.element;
       if (typeNode.bound != null) {
         DartType boundType = typeResolver.resolveTypeAnnotation(
             this, typeNode.bound);
-        variableElement.bound = boundType;
+        variableElement.boundCache = boundType;
 
         void checkTypeVariableBound() {
           Link<TypeVariableElement> seenTypeVariables =
@@ -3817,7 +3803,7 @@
         }
         addDeferredAction(element, checkTypeVariableBound);
       } else {
-        variableElement.bound = objectType;
+        variableElement.boundCache = objectType;
       }
       nodeLink = nodeLink.tail;
       typeLink = typeLink.tail;
@@ -4112,9 +4098,9 @@
     Link<DartType> link = typeVariables;
     element.typeVariables.forEach((TypeVariableType type) {
       TypeVariableType typeVariable = link.head;
-      TypeVariableElement typeVariableElement = typeVariable.element;
-      typeVariableElement.type = typeVariable;
-      typeVariableElement.bound =
+      TypeVariableElementX typeVariableElement = typeVariable.element;
+      typeVariableElement.typeCache = typeVariable;
+      typeVariableElement.boundCache =
           type.element.bound.subst(typeVariables, element.typeVariables);
       link = link.tail;
     });
@@ -4688,3 +4674,22 @@
                       Scope scope, String name) {
   return Elements.unwrap(scope.lookup(name), compiler, node);
 }
+
+TreeElements _ensureTreeElements(AnalyzableElement element) {
+  if (element._treeElements == null) {
+    element._treeElements = new TreeElementMapping(element);
+  }
+  return element._treeElements;
+}
+
+abstract class AnalyzableElement implements Element {
+  TreeElements _treeElements;
+
+  bool get hasTreeElements => _treeElements != null;
+
+  TreeElements get treeElements {
+    assert(invariant(this, _treeElements !=null,
+        message: "TreeElements have not been computed for $this."));
+    return _treeElements;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index fd29dc9..10ddfe0 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -8,6 +8,7 @@
  * [SignatureResolver] resolves function signatures.
  */
 class SignatureResolver extends MappingVisitor<ParameterElementX> {
+  final ResolverVisitor resolver;
   final Element enclosingElement;
   final Scope scope;
   final MessageKind defaultValuesError;
@@ -23,6 +24,8 @@
                     {this.defaultValuesError})
       : this.enclosingElement = enclosingElement,
         this.scope = enclosingElement.buildScope(),
+        this.resolver =
+            new ResolverVisitor(compiler, enclosingElement, treeElements),
         super(compiler, treeElements);
 
   bool get defaultValuesAllowed => defaultValuesError == null;
@@ -84,8 +87,7 @@
 
   void computeParameterType(ParameterElementX element) {
     if (currentDefinitions.type != null) {
-      element.type = compiler.resolver.resolveTypeAnnotation(element,
-          currentDefinitions.type);
+      element.type = resolveTypeAnnotation(currentDefinitions.type);
     } else {
       // Is node.definitions exactly one FunctionExpression?
       Link<Node> link = currentDefinitions.definitions.nodes;
@@ -254,15 +256,14 @@
     }
     DartType returnType;
     if (element.isFactoryConstructor()) {
-      returnType = element.getEnclosingClass().computeType(compiler);
+      returnType = element.getEnclosingClass().thisType;
       // Because there is no type annotation for the return type of
       // this element, we explicitly add one.
       if (compiler.enableTypeAssertions) {
-        compiler.enqueuer.resolution.registerIsCheck(
-            returnType, new TreeElementMapping(element));
+        compiler.enqueuer.resolution.registerIsCheck(returnType, mapping);
       }
     } else {
-      returnType = compiler.resolver.resolveReturnType(element, returnNode);
+      returnType = visitor.resolveReturnType(returnNode);
     }
 
     if (element.isSetter() && (requiredParameterCount != 1 ||
@@ -281,10 +282,27 @@
                                   returnType);
   }
 
+  DartType resolveTypeAnnotation(TypeAnnotation annotation) {
+    DartType type = resolveReturnType(annotation);
+    if (type == compiler.types.voidType) {
+      compiler.reportError(annotation, MessageKind.VOID_NOT_ALLOWED);
+    }
+    return type;
+  }
+
+  DartType resolveReturnType(TypeAnnotation annotation) {
+    if (annotation == null) return compiler.types.dynamicType;
+    DartType result = resolver.resolveTypeAnnotation(annotation);
+    if (result == null) {
+      return compiler.types.dynamicType;
+    }
+    return result;
+  }
+
   // TODO(ahe): This is temporary.
   void resolveExpression(Node node) {
     if (node == null) return;
-    node.accept(new ResolverVisitor(compiler, enclosingElement, mapping));
+    node.accept(resolver);
   }
 
   // TODO(ahe): This is temporary.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index f785e40..3202bdc 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -6,10 +6,10 @@
 
 /**
  * A special element for the extra parameter taken by intercepted
- * methods. We need to override [Element.computeType] because our
+ * methods. We need to implement [TypedElement.type] because our
  * optimizers may look at its declared type.
  */
-class InterceptedElement extends ElementX {
+class InterceptedElement extends ElementX implements TypedElement {
   final DartType type;
   InterceptedElement(this.type, String name, Element enclosing)
       : super(name, ElementKind.PARAMETER, enclosing);
@@ -60,7 +60,7 @@
         assert(graph.isValid());
         if (!identical(kind, ElementKind.FIELD)) {
           FunctionElement function = element;
-          FunctionSignature signature = function.computeSignature(compiler);
+          FunctionSignature signature = function.functionSignature;
           signature.forEachOptionalParameter((Element parameter) {
             // This ensures the default value will be computed.
             Constant constant =
@@ -231,7 +231,7 @@
 
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
-      FunctionSignature params = functionElement.computeSignature(compiler);
+      FunctionSignature params = functionElement.functionSignature;
       params.orderedForEachParameter((Element parameterElement) {
         if (element.isGenerativeConstructorBody()) {
           ClosureScope scopeData = closureData.capturingScopes[node];
@@ -293,7 +293,7 @@
       bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
       String name = isInterceptorClass ? 'receiver' : '_';
       Element parameter = new InterceptedElement(
-          cls.computeType(compiler), name, element);
+          cls.thisType, name, element);
       HParameterValue value =
           new HParameterValue(parameter, builder.getTypeOfThis());
       builder.graph.explicitReceiverParameter = value;
@@ -305,7 +305,7 @@
       }
     } else if (isNativeUpgradeFactory) {
       Element parameter = new InterceptedElement(
-          cls.computeType(compiler), 'receiver', element);
+          cls.thisType, 'receiver', element);
       // Unlike `this`, receiver is nullable since direct calls to generative
       // constructor call the constructor with `null`.
       HParameterValue value =
@@ -885,7 +885,6 @@
  * This class builds SSA nodes for functions represented in AST.
  */
 class SsaBuilder extends ResolvedVisitor {
-  final Compiler compiler;
   final JavaScriptBackend backend;
   final ConstantSystem constantSystem;
   final CodegenWorkItem work;
@@ -964,10 +963,9 @@
   List<HInstruction> stack = <HInstruction>[];
 
   SsaBuilder(JavaScriptBackend backend,
-                    CodegenWorkItem work,
-                    this.nativeEmitter)
+             CodegenWorkItem work,
+             this.nativeEmitter)
     : this.backend = backend,
-      this.compiler = backend.compiler,
       this.constantSystem = backend.constantSystem,
       this.work = work,
       this.rti = backend.rti,
@@ -1101,7 +1099,7 @@
       FunctionElement function,
       List<HInstruction> providedArguments) {
     assert(selector.applies(function, compiler));
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     List<HInstruction> compiledArguments = new List<HInstruction>(
         signature.parameterCount + 1); // Plus one for receiver.
 
@@ -1447,7 +1445,7 @@
     // to be the first parameter.
     graph.entry.addBefore(graph.entry.last, parameter);
     HInstruction value =
-        potentiallyCheckType(parameter, field.computeType(compiler));
+        potentiallyCheckType(parameter, field.type);
     add(new HFieldSet(field, thisInstruction, value));
     return closeFunction();
   }
@@ -1458,7 +1456,7 @@
     assert(variable.initializer != null);
     visit(variable.initializer);
     HInstruction value = pop();
-    value = potentiallyCheckType(value, variable.computeType(compiler));
+    value = potentiallyCheckType(value, variable.type);
     closeAndGotoExit(new HReturn(value));
     return closeFunction();
   }
@@ -1545,7 +1543,7 @@
           compiledArguments[argumentIndex++]);
     }
 
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.orderedForEachParameter((Element parameter) {
       HInstruction argument = compiledArguments[argumentIndex++];
       localsHandler.updateLocal(parameter, argument);
@@ -1618,10 +1616,10 @@
    * function.
    */
   void potentiallyCheckInlinedParameterTypes(FunctionElement function) {
-    FunctionSignature signature = function.computeSignature(compiler);
-    signature.orderedForEachParameter((Element parameter) {
+    FunctionSignature signature = function.functionSignature;
+    signature.orderedForEachParameter((ParameterElement parameter) {
       HInstruction argument = localsHandler.readLocal(parameter);
-      potentiallyCheckType(argument, parameter.computeType(compiler));
+      potentiallyCheckType(argument, parameter.type);
     });
   }
 
@@ -1676,7 +1674,7 @@
       }
 
       int index = 0;
-      FunctionSignature params = callee.computeSignature(compiler);
+      FunctionSignature params = callee.functionSignature;
       params.orderedForEachParameter((Element parameter) {
         HInstruction argument = compiledArguments[index++];
         // Because we are inlining the initializer, we must update
@@ -1828,7 +1826,7 @@
     classElement.forEachInstanceField(
         (ClassElement enclosingClass, VariableElement member) {
           compiler.withCurrentElement(member, () {
-            TreeElements definitions = compiler.analyzeElement(member);
+            TreeElements definitions = member.treeElements;
             ast.Node node = member.parseNode(compiler);
             ast.Expression initializer = member.initializer;
             if (initializer == null) {
@@ -1885,7 +1883,7 @@
     buildFieldInitializers(classElement, fieldValues);
 
     // Compile field-parameters such as [:this.x:].
-    FunctionSignature params = functionElement.computeSignature(compiler);
+    FunctionSignature params = functionElement.functionSignature;
     params.orderedForEachParameter((Element element) {
       if (element.kind == ElementKind.FIELD_PARAMETER) {
         // If the [element] is a field-parameter then
@@ -1906,7 +1904,7 @@
     List<Element> fields = <Element>[];
 
     classElement.forEachInstanceField(
-        (ClassElement enclosingClass, Element member) {
+        (ClassElement enclosingClass, VariableElement member) {
           HInstruction value = fieldValues[member];
           if (value == null) {
             // Uninitialized native fields are pre-initialized by the native
@@ -1914,13 +1912,20 @@
             assert(isNativeUpgradeFactory);
           } else {
             fields.add(member);
-            constructorArguments.add(
-                potentiallyCheckType(value, member.computeType(compiler)));
+            DartType type = member.type;
+            if (enclosingClass.isMixinApplication) {
+              // TODO(johnniwinther): Add a member-like abstraction for fields
+              // that normalizes this.
+              type = type.substByContext(
+                  enclosingClass.thisType.asInstanceOf(
+                      member.enclosingElement));
+            }
+            constructorArguments.add(potentiallyCheckType(value, type));
           }
         },
         includeSuperAndInjectedMembers: true);
 
-    InterfaceType type = classElement.computeType(compiler);
+    InterfaceType type = classElement.thisType;
     TypeMask ssaType = new TypeMask.nonNullExact(classElement.declaration);
     List<DartType> instantiatedTypes;
     addInlinedInstantiation(type);
@@ -2030,8 +2035,7 @@
       List bodyCallInputs = <HInstruction>[];
       if (isNativeUpgradeFactory) {
         if (interceptor == null) {
-          Constant constant = new InterceptorConstant(
-              classElement.computeType(compiler));
+          Constant constant = new InterceptorConstant(classElement.thisType);
           interceptor = graph.addConstant(constant, compiler);
         }
         bodyCallInputs.add(interceptor);
@@ -2043,7 +2047,7 @@
       ClosureClassMap parameterClosureData =
           compiler.closureToClassMapper.getMappingForNestedFunction(node);
 
-      FunctionSignature functionSignature = body.computeSignature(compiler);
+      FunctionSignature functionSignature = body.functionSignature;
       // Provide the parameters to the generative constructor body.
       functionSignature.orderedForEachParameter((parameter) {
         // If [parameter] is boxed, it will be a field in the box passed as the
@@ -2119,13 +2123,13 @@
 
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
-      FunctionSignature signature = functionElement.computeSignature(compiler);
+      FunctionSignature signature = functionElement.functionSignature;
 
       // Put the type checks in the first successor of the entry,
       // because that is where the type guards will also be inserted.
       // This way we ensure that a type guard will dominate the type
       // check.
-      signature.orderedForEachParameter((Element parameterElement) {
+      signature.orderedForEachParameter((ParameterElement parameterElement) {
         if (element.isGenerativeConstructorBody()) {
           ClosureScope scopeData =
               localsHandler.closureData.capturingScopes[node];
@@ -2139,7 +2143,7 @@
         }
         HInstruction newParameter = potentiallyCheckType(
             localsHandler.directLocals[parameterElement],
-            parameterElement.computeType(compiler));
+            parameterElement.type);
         localsHandler.directLocals[parameterElement] = newParameter;
       });
 
@@ -2235,7 +2239,7 @@
     if (compiler.enableTypeAssertions) {
       return potentiallyCheckType(
           value,
-          compiler.boolClass.computeType(compiler),
+          compiler.boolClass.rawType,
           kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
     }
     HInstruction result = new HBoolify(value, backend.boolType);
@@ -3012,8 +3016,9 @@
         pushInvokeStatic(location, element, <HInstruction>[value]);
         pop();
       } else {
+        VariableElement field = element;
         value =
-            potentiallyCheckType(value, element.computeType(compiler));
+            potentiallyCheckType(value, field.type);
         addWithPosition(new HStaticStore(element, value), location);
       }
       stack.add(value);
@@ -3431,7 +3436,7 @@
     // and implementation signatures. Currently it is need because the
     // signatures have different elements for parameters.
     FunctionElement implementation = function.implementation;
-    FunctionSignature params = implementation.computeSignature(compiler);
+    FunctionSignature params = implementation.functionSignature;
     if (params.optionalParameterCount != 0) {
       compiler.cancel(
           '"$name" does not handle closure with optional parameters',
@@ -4133,8 +4138,8 @@
         stack.add(addConstant(node));
       }
     } else if (element.isTypeVariable()) {
-      HInstruction value =
-          addTypeVariableReference(element.computeType(compiler));
+      TypeVariableElement typeVariable = element;
+      HInstruction value = addTypeVariableReference(typeVariable.type);
       pushInvokeStatic(node,
                        backend.getRuntimeTypeToString(),
                        [value],
@@ -4236,7 +4241,7 @@
                                        FunctionElement function,
                                        Link<ast.Node> argumentNodes) {
     List<String> existingArguments = <String>[];
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.forEachParameter((Element parameter) {
       existingArguments.add(parameter.name);
     });
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index bd98b6b..5bcc8fe 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1413,7 +1413,7 @@
 
     if (condition.isConstant()) {
       HConstant constant = condition;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         generateStatements(info.thenGraph);
       } else {
         generateStatements(info.elseGraph);
@@ -1746,11 +1746,11 @@
   }
 
   void generateConstant(Constant constant) {
-    if (constant.isFunction()) {
+    if (constant.isFunction) {
       FunctionConstant function = constant;
       world.registerStaticUse(function.element);
     }
-    if (constant.isType()) {
+    if (constant.isType) {
       // If the type is a web component, we need to ensure the constructors are
       // available to 'upgrade' the native object.
       TypeConstant type = constant;
@@ -2537,7 +2537,7 @@
       // TODO(5022): We currently generate $isFunction checks for
       // function types.
       world.registerIsCheck(
-          compiler.functionClass.computeType(compiler), work.resolutionTree);
+          compiler.functionClass.rawType, work.resolutionTree);
     }
     world.registerIsCheck(type, work.resolutionTree);
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index 1e83906..5dbea83 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -285,16 +285,66 @@
         markAsGenerateAtUseSite(instruction);
         continue;
       }
-      if (instruction.isJsStatement()) {
-        expectedInputs.clear();
-      }
       if (instruction.isPure()) {
         if (pureInputs.contains(instruction)) {
           tryGenerateAtUseSite(instruction);
         } else {
           // If the input is not in the [pureInputs] set, it has not
-          // been visited.
+          // been visited or should not be generated at use-site. The most
+          // likely reason for the latter, is that the instruction is used
+          // in more than one location.
+          // We must either clear the expectedInputs, or move the pure
+          // instruction's inputs in front of the existing ones.
+          // Example:
+          //   t1 = foo();  // side-effect.
+          //   t2 = bar();  // side-effect.
+          //   t3 = pure(t2);    // used more than once.
+          //   f(t1, t3);   // expected inputs of 'f': t1.
+          //   use(t3);
+          //
+          // If we don't clear the expected inputs we end up in a situation
+          // where pure pushes "t2" on top of "t1" leading to:
+          //   t3 = pure(bar());
+          //   f(foo(), t3);
+          //   use(t3);
+          //
+          // If we clear the expected-inputs list we have the correct
+          // output:
+          //   t1 = foo();
+          //   t3 = pure(bar());
+          //   f(t1, t3);
+          //   use(t3);
+          //
+          // Clearing is, however, not optimal.
+          // Example:
+          //   t1 = foo();  // t1 is now used by `pure`.
+          //   t2 = bar();  // t2 is now used by `f`.
+          //   t3 = pure(t1);
+          //   f(t2, t3);
+          //   use(t3);
+          //
+          // If we clear the expected-inputs we can't generate-at-use any of
+          // the instructions.
+          //
+          // The optimal solution is to move the inputs of 'pure' in
+          // front of the expectedInputs list. This makes sense, since we
+          // push expected-inputs from left-to right, and the `pure` function
+          // invocation is "more left" (i.e. before) the first argument of `f`.
+          // With that approach we end up with:
+          //   t3 = pure(foo();
+          //   f(bar(), t3);
+          //   use(t3);
+          //
+          int oldLength = expectedInputs.length;
           instruction.accept(this);
+          if (oldLength != 0 && oldLength != expectedInputs.length) {
+            // Move the pure instruction's inputs to the front.
+            List<HInstruction> newInputs = expectedInputs.sublist(oldLength);
+            int newCount = newInputs.length;
+            expectedInputs.setRange(
+                newCount, newCount + oldLength, expectedInputs);
+            expectedInputs.setRange(0, newCount, newInputs);
+          }
         }
       } else {
         if (findInInputsAndPopNonMatching(instruction)) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 6e2f2fe..a25b079 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -149,8 +149,7 @@
       return graph.thisInstruction;
     }
 
-    Constant constant = new InterceptorConstant(
-        constantInterceptor.computeType(compiler));
+    Constant constant = new InterceptorConstant(constantInterceptor.thisType);
     return graph.addConstant(constant, compiler);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 3b0443e..ba34bb2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1932,17 +1932,17 @@
   accept(HVisitor visitor) => visitor.visitConstant(this);
 
   bool isConstant() => true;
-  bool isConstantBoolean() => constant.isBool();
-  bool isConstantNull() => constant.isNull();
-  bool isConstantNumber() => constant.isNum();
-  bool isConstantInteger() => constant.isInt();
-  bool isConstantString() => constant.isString();
-  bool isConstantList() => constant.isList();
-  bool isConstantMap() => constant.isMap();
-  bool isConstantFalse() => constant.isFalse();
-  bool isConstantTrue() => constant.isTrue();
+  bool isConstantBoolean() => constant.isBool;
+  bool isConstantNull() => constant.isNull;
+  bool isConstantNumber() => constant.isNum;
+  bool isConstantInteger() => constant.isInt;
+  bool isConstantString() => constant.isString;
+  bool isConstantList() => constant.isList;
+  bool isConstantMap() => constant.isMap;
+  bool isConstantFalse() => constant.isFalse;
+  bool isConstantTrue() => constant.isTrue;
 
-  bool isInterceptor(Compiler compiler) => constant.isInterceptor();
+  bool isInterceptor(Compiler compiler) => constant.isInterceptor;
 
   // Maybe avoid this if the literal is big?
   bool isCodeMotionInvariant() => true;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 7931074..b575772 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -184,7 +184,7 @@
     HInstruction input = inputs[0];
     if (input is HConstant) {
       HConstant constant = input;
-      bool isTrue = constant.constant.isTrue();
+      bool isTrue = constant.constant.isTrue;
       return graph.addConstantBool(!isTrue, compiler);
     } else if (input is HNot) {
       return input.inputs[0];
@@ -329,7 +329,7 @@
       } else {
         // TODO(ngeoffray): If the method has optional parameters,
         // we should pass the default values.
-        FunctionSignature parameters = method.computeSignature(compiler);
+        FunctionSignature parameters = method.functionSignature;
         if (parameters.optionalParameterCount == 0
             || parameters.parameterCount == node.selector.argumentCount) {
           node.element = element;
@@ -357,7 +357,7 @@
     //   foo() native 'return something';
     // They should not be used.
 
-    FunctionSignature signature = method.computeSignature(compiler);
+    FunctionSignature signature = method.functionSignature;
     if (signature.optionalParametersAreNamed) return null;
 
     // Return types on native methods don't need to be checked, since the
@@ -369,10 +369,10 @@
     List<HInstruction> inputs = node.inputs.sublist(1);
     int inputPosition = 1;  // Skip receiver.
     bool canInline = true;
-    signature.forEachParameter((Element element) {
+    signature.forEachParameter((ParameterElement element) {
       if (inputPosition < inputs.length && canInline) {
         HInstruction input = inputs[inputPosition++];
-        DartType type = element.computeType(compiler).unalias(compiler);
+        DartType type = element.type.unalias(compiler);
         if (type is FunctionType) {
           canInline = false;
         }
@@ -405,7 +405,7 @@
     if (index.isInteger(compiler)) return node;
     if (index.isConstant()) {
       HConstant constantInstruction = index;
-      assert(!constantInstruction.constant.isInt());
+      assert(!constantInstruction.constant.isInt);
       if (!constantSystem.isInt(constantInstruction.constant)) {
         // -0.0 is a double but will pass the runtime integer check.
         node.staticChecks = HBoundsCheck.ALWAYS_FALSE;
@@ -432,8 +432,8 @@
     // We can only perform this rewriting on Integer, as it is not
     // valid for -0.0.
     if (left.isInteger(compiler) && right.isInteger(compiler)) {
-      if (left is HConstant && left.constant.isZero()) return right;
-      if (right is HConstant && right.constant.isZero()) return left;
+      if (left is HConstant && left.constant.isZero) return right;
+      if (right is HConstant && right.constant.isZero) return left;
     }
     return super.visitAdd(node);
   }
@@ -442,8 +442,8 @@
     HInstruction left = node.left;
     HInstruction right = node.right;
     if (left.isNumber(compiler) && right.isNumber(compiler)) {
-      if (left is HConstant && left.constant.isOne()) return right;
-      if (right is HConstant && right.constant.isOne()) return left;
+      if (left is HConstant && left.constant.isOne) return right;
+      if (right is HConstant && right.constant.isOne) return left;
     }
     return super.visitMultiply(node);
   }
@@ -497,7 +497,7 @@
 
     if (left.isConstantBoolean() && right.isBoolean(compiler)) {
       HConstant constant = left;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         return right;
       } else {
         return new HNot(right, backend.boolType);
@@ -506,7 +506,7 @@
 
     if (right.isConstantBoolean() && left.isBoolean(compiler)) {
       HConstant constant = right;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         return left;
       } else {
         return new HNot(left, backend.boolType);
@@ -657,8 +657,8 @@
     return inputType.isInMask(checkedType, compiler) ? input : node;
   }
 
-  Element findConcreteFieldForDynamicAccess(HInstruction receiver,
-                                            Selector selector) {
+  VariableElement findConcreteFieldForDynamicAccess(HInstruction receiver,
+                                                    Selector selector) {
     TypeMask receiverType = receiver.instructionType;
     return compiler.world.locateSingleField(
         new TypedSelector(receiverType, selector));
@@ -746,14 +746,15 @@
     }
 
     HInstruction receiver = node.getDartReceiver(compiler);
-    Element field = findConcreteFieldForDynamicAccess(receiver, node.selector);
+    VariableElement field =
+        findConcreteFieldForDynamicAccess(receiver, node.selector);
     if (field == null || !field.isAssignable()) return node;
     // Use [:node.inputs.last:] in case the call follows the
     // interceptor calling convention, but is not a call on an
     // interceptor.
     HInstruction value = node.inputs.last;
     if (compiler.enableTypeAssertions) {
-      DartType type = field.computeType(compiler);
+      DartType type = field.type;
       if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) {
         // We cannot generate the correct type representation here, so don't
         // inline this access.
@@ -816,7 +817,7 @@
     if (input.isString(compiler)) return input;
     if (input.isConstant()) {
       HConstant constant = input;
-      if (!constant.constant.isPrimitive()) return node;
+      if (!constant.constant.isPrimitive) return node;
       PrimitiveConstant primitive = constant.constant;
       return graph.addConstant(constantSystem.createString(
           primitive.toDartString()), compiler);
@@ -1528,32 +1529,72 @@
 
     List<HInstruction> ifUsers = <HInstruction>[];
     List<HInstruction> notIfUsers = <HInstruction>[];
-    for (HInstruction user in instruction.usedBy) {
-      if (user is HIf) {
-        ifUsers.add(user);
-      } else if (user is HNot) {
-        for (HInstruction notUser in user.usedBy) {
-          if (notUser is HIf) notIfUsers.add(notUser);
-        }
-      }
-    }
+
+    collectIfUsers(instruction, ifUsers, notIfUsers);
 
     if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
 
     TypeMask convertedType = new TypeMask.nonNullSubtype(element);
     HInstruction input = instruction.expression;
+
     for (HIf ifUser in ifUsers) {
       changeUsesDominatedBy(ifUser.thenBlock, input, convertedType);
       // TODO(ngeoffray): Also change uses for the else block on a type
       // that knows it is not of a specific type.
     }
-
     for (HIf ifUser in notIfUsers) {
       changeUsesDominatedBy(ifUser.elseBlock, input, convertedType);
       // TODO(ngeoffray): Also change uses for the then block on a type
       // that knows it is not of a specific type.
     }
   }
+
+  void visitIdentity(HIdentity instruction) {
+    // At HIf(HIdentity(x, null)) strengthens x to non-null on else branch.
+    HInstruction left = instruction.left;
+    HInstruction right = instruction.right;
+    HInstruction input;
+
+    if (left.isConstantNull()) {
+      input = right;
+    } else if (right.isConstantNull()) {
+      input = left;
+    } else {
+      return;
+    }
+
+    if (!input.instructionType.isNullable) return;
+
+    List<HInstruction> ifUsers = <HInstruction>[];
+    List<HInstruction> notIfUsers = <HInstruction>[];
+
+    collectIfUsers(instruction, ifUsers, notIfUsers);
+
+    if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
+
+    TypeMask nonNullType = input.instructionType.nonNullable();
+
+    for (HIf ifUser in ifUsers) {
+      changeUsesDominatedBy(ifUser.elseBlock, input, nonNullType);
+      // Uses in thenBlock are `null`, but probably not common.
+    }
+    for (HIf ifUser in notIfUsers) {
+      changeUsesDominatedBy(ifUser.thenBlock, input, nonNullType);
+      // Uses in elseBlock are `null`, but probably not common.
+    }
+  }
+
+  collectIfUsers(HInstruction instruction,
+                 List<HInstruction> ifUsers,
+                 List<HInstruction> notIfUsers) {
+    for (HInstruction user in instruction.usedBy) {
+      if (user is HIf) {
+        ifUsers.add(user);
+      } else if (user is HNot) {
+        collectIfUsers(user, notIfUsers, ifUsers);
+      }
+    }
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 775cd43..19e3ab9 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -135,7 +135,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.add.fold(
         constantSystem.createInt(value), constantSystem.createInt(other.value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -145,7 +145,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.subtract.fold(
         constantSystem.createInt(value), constantSystem.createInt(other.value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -154,7 +154,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.negate.fold(
         constantSystem.createInt(value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -670,7 +670,7 @@
   Range visitConstant(HConstant constant) {
     if (!constant.isInteger(compiler)) return info.newUnboundRange();
     NumConstant constantNum = constant.constant;
-    if (constantNum.isMinusZero()) constantNum = new IntConstant(0);
+    if (constantNum.isMinusZero) constantNum = new IntConstant(0);
     Value value = info.newIntValue(constantNum.value);
     return info.newNormalizedRange(value, value);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index 559c5db..920aa45 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -437,17 +437,10 @@
     : ownName = new Map<HInstruction, String>(),
       copyHandlers = new Map<HBasicBlock, CopyHandler>(),
       allUsedNames = new Set<String>(),
-      swapTemp = computeFreshWithPrefix("t");
+      swapTemp = 't0';
 
   int get numberOfVariables => allUsedNames.length;
 
-  /** Returns a fresh variable with the given prefix. */
-  static String computeFreshWithPrefix(String prefix) {
-    String name = '${prefix}0';
-    int i = 1;
-    return name;
-  }
-
   String getName(HInstruction instruction) {
     return ownName[instruction];
   }
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index 048c1a8..401645f 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -156,8 +156,7 @@
     assert(element != null);
   }
 
-  DartType computeType(Compiler compiler) =>
-      compiler.typeClass.computeType(compiler);
+  DartType computeType(Compiler compiler) => compiler.typeClass.rawType;
 
   String toString() => 'TypeLiteralAccess($element)';
 }
@@ -297,7 +296,7 @@
   DartType getKnownType(VariableElement element) {
     TypePromotion typePromotion = getKnownTypePromotion(element);
     if (typePromotion != null) return typePromotion.type;
-    return element.computeType(compiler);
+    return element.type;
   }
 
   TypeCheckerVisitor(this.compiler, TreeElements elements, this.types)
@@ -312,7 +311,7 @@
     listType = compiler.listClass.computeType(compiler);
 
     if (currentClass != null) {
-      thisType = currentClass.computeType(compiler);
+      thisType = currentClass.thisType;
       superType = currentClass.supertype;
     }
   }
@@ -569,11 +568,10 @@
       type = types.dynamicType;
       returnType = types.voidType;
 
-      element.functionSignature.forEachParameter((Element parameter) {
+      element.functionSignature.forEachParameter((ParameterElement parameter) {
         if (parameter.isFieldParameter()) {
           FieldParameterElement fieldParameter = parameter;
-          checkAssignable(parameter,
-              parameter.computeType(compiler),
+          checkAssignable(parameter, parameter.type,
               fieldParameter.fieldElement.computeType(compiler));
         }
       });
@@ -1459,7 +1457,7 @@
   }
 
   DartType visitLiteralSymbol(LiteralSymbol node) {
-    return compiler.symbolClass.computeType(compiler);
+    return compiler.symbolClass.rawType;
   }
 
   DartType computeConstructorType(Element constructor, DartType type) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index ee598d7..27da00d 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -194,7 +194,7 @@
         return new Selector.indexSet();
       }
       FunctionSignature signature =
-          element.asFunctionElement().computeSignature(compiler);
+          element.asFunctionElement().functionSignature;
       int arity = signature.parameterCount;
       List<String> namedArguments = null;
       if (signature.optionalParametersAreNamed) {
@@ -407,7 +407,7 @@
     assert(invariant(element, element.isImplementation));
     if (!this.applies(element, compiler)) return false;
 
-    FunctionSignature parameters = element.computeSignature(compiler);
+    FunctionSignature parameters = element.functionSignature;
     parameters.forEachRequiredParameter((element) {
       list.add(compileArgument(arguments.head));
       arguments = arguments.tail;
@@ -465,7 +465,7 @@
       compileConstant(Element element),
       Compiler compiler) {
 
-    FunctionSignature signature = caller.computeSignature(compiler);
+    FunctionSignature signature = caller.functionSignature;
     Map mapping = new Map();
 
     // TODO(ngeoffray): This is a hack that fakes up AST nodes, so
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index ca5d04d..abbcb91 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -61,7 +61,7 @@
 }
 
 void useConstant(dart2jslib.Constant constant, dart2jslib.ConstantSystem cs) {
-  constant.isObject();
+  constant.isObject;
   cs.isBool(constant);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 0b51aed..dc4474e 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -37,7 +37,8 @@
   final String message;
   SpannableAssertionFailure(this.node, this.message);
 
-  String toString() => 'Assertion failure: $message';
+  String toString() => 'Assertion failure'
+                       '${message != null ? ': $message' : ''}';
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index a67dc21..e1f4f33 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -554,7 +554,11 @@
       "Not a compile-time constant.");
 
   static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT = const MessageKind(
-      "Deferred classes cannot be used to create compile-time constants.");
+      "A Deferred value cannot be used as a compile-time constant.");
+
+  static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION =
+      const MessageKind("A deferred class cannot be used to create a"
+          "compile-time constant.");
 
   static const MessageKind CYCLIC_COMPILE_TIME_CONSTANTS = const MessageKind(
       "Cycle in the compile-time constant computation.");
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 0bd0544..6e0821a 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -179,6 +179,9 @@
   patch static void _setExitCode(int status) {
     throw new UnsupportedError("ProcessUtils._setExitCode");
   }
+  patch static int _getExitCode() {
+    throw new UnsupportedError("ProcessUtils._getExitCode");
+  }
   patch static void _sleep(int millis) {
     throw new UnsupportedError("ProcessUtils._sleep");
   }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 74df1a4..d707a13 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -2100,51 +2100,51 @@
     case 1:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(){'
-              'return s(this)[n](r(this))'
+              'return f.call(s(this),r(this))'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 2:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a){'
-              'return s(this)[n](r(this),a)'
+              'return f.call(s(this),r(this),a)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 3:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b){'
-              'return s(this)[n](r(this),a,b)'
+              'return f.call(s(this),r(this),a,b)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 4:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c){'
-              'return s(this)[n](r(this),a,b,c)'
+              'return f.call(s(this),r(this),a,b,c)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 5:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c,d){'
-              'return s(this)[n](r(this),a,b,c,d)'
+              'return f.call(s(this),r(this),a,b,c,d)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 6:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c,d,e){'
-              'return s(this)[n](r(this),a,b,c,d,e)'
+              'return f.call(s(this),r(this),a,b,c,d,e)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     default:
       return JS(
           '',
@@ -2159,16 +2159,22 @@
   }
 
   static forwardInterceptedCallTo(function) {
+    String selfField = BoundClosure.selfFieldName();
+    String receiverField = BoundClosure.receiverFieldName();
     String stubName = JS('String|Null', '#.\$stubName', function);
     int arity = JS('int', '#.length', function);
     bool isCsp = JS('bool', 'typeof dart_precompiled == "function"');
     if (isCsp) {
       return cspForwardInterceptedCall(arity, stubName, function);
     } else if (arity == 1) {
-      return JS('', 'new Function(#)',
-                'return this.${BoundClosure.selfFieldName()}.$stubName('
-                    'this.${BoundClosure.receiverFieldName()});'
-                '${functionCounter++}');
+      return JS(
+          '',
+          '(new Function("F",#))(#)',
+          'return function(){'
+            'return F.call(this.$selfField, this.$receiverField);'
+            '${functionCounter++}'
+          '}',
+          function);
     } else if (1 < arity && arity < 28) {
       String arguments = JS(
           'String',
@@ -2176,12 +2182,12 @@
           arity - 1);
       return JS(
           '',
-          '(new Function(#))()',
+          '(new Function("F",#))(#)',
           'return function($arguments){'
-            'return this.${BoundClosure.selfFieldName()}.$stubName('
-                'this.${BoundClosure.receiverFieldName()},$arguments);'
+            'return F.call(this.$selfField, this.$receiverField, $arguments);'
             '${functionCounter++}'
-          '}');
+          '}',
+          function);
     } else {
       return cspForwardInterceptedCall(arity, stubName, function);
     }
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
new file mode 100644
index 0000000..43328e1
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.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.
+
+library pub.asset.serialize;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/span.dart';
+
+import 'serialize/exception.dart';
+
+export 'serialize/exception.dart';
+export 'serialize/transform.dart';
+export 'serialize/transformer.dart';
+
+/// Converts [id] into a serializable map.
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path};
+
+/// Converts a serializable map into an [AssetId].
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
+
+/// Converts [span] into a serializable map.
+Map serializeSpan(Span span) {
+  // TODO(nweiz): convert FileSpans to FileSpans.
+  return {
+    'type': 'fixed',
+    'sourceUrl': span.sourceUrl,
+    'start': serializeLocation(span.start),
+    'text': span.text,
+    'isIdentifier': span.isIdentifier
+  };
+}
+
+/// Converts a serializable map into a [Span].
+Span deserializeSpan(Map span) {
+  assert(span['type'] == 'fixed');
+  var location = deserializeLocation(span['start']);
+  return new FixedSpan(span['sourceUrl'], location.offset, location.line,
+      location.column, text: span['text'], isIdentifier: span['isIdentifier']);
+}
+
+/// Converts [location] into a serializable map.
+Map serializeLocation(Location location) {
+  // TODO(nweiz): convert FileLocations to FileLocations.
+  return {
+    'type': 'fixed',
+    'sourceUrl': location.sourceUrl,
+    'offset': location.offset,
+    'line': location.line,
+    'column': location.column
+  };
+}
+
+/// Converts a serializable map into a [Location].
+Location deserializeLocation(Map location) {
+  assert(location['type'] == 'fixed');
+  return new FixedLocation(location['offset'], location['sourceUrl'],
+      location['line'], location['column']);
+}
+
+/// Wraps [message] and sends it across [port], then waits for a response which
+/// should be sent using [respond].
+///
+/// The returned Future will complete to the value or error returned by
+/// [respond].
+Future call(SendPort port, message) {
+  var receivePort = new ReceivePort();
+  port.send({
+    'message': message,
+    'replyTo': receivePort.sendPort
+  });
+
+  return receivePort.first.then((response) {
+    if (response['type'] == 'success') return response['value'];
+    assert(response['type'] == 'error');
+    var exception = deserializeException(response['error']);
+    return new Future.error(exception, exception.stackTrace);
+  });
+}
+
+/// Responds to a message sent by [call].
+///
+/// [wrappedMessage] is the raw message sent by [call]. This unwraps it and
+/// passes the contents of the message to [callback], then sends the return
+/// value of [callback] back to [call]. If [callback] returns a Future or
+/// throws an error, that will also be sent.
+void respond(wrappedMessage, callback(message)) {
+  var replyTo = wrappedMessage['replyTo'];
+  new Future.sync(() => callback(wrappedMessage['message']))
+      .then((result) => replyTo.send({'type': 'success', 'value': result}))
+      .catchError((error, stackTrace) {
+    replyTo.send({
+      'type': 'error',
+      'error': serializeException(error, stackTrace)
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart b/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart
new file mode 100644
index 0000000..26040a9
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/exception.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 pub.asset.serialize.exception;
+
+import 'package:barback/barback.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+import '../utils.dart';
+
+/// An exception that was originally raised in another isolate.
+///
+/// Exception objects can't cross isolate boundaries in general, so this class
+/// wraps as much information as can be consistently serialized.
+class CrossIsolateException implements Exception {
+  /// The name of the type of exception thrown.
+  ///
+  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
+  /// that objects in different libraries may have the same type name.
+  final String type;
+
+  /// The exception's message, or its [toString] if it didn't expose a `message`
+  /// property.
+  final String message;
+
+  /// The exception's stack chain, or `null` if no stack chain was available.
+  final Chain stackTrace;
+
+  /// Loads a [CrossIsolateException] from a serialized representation.
+  ///
+  /// [error] should be the result of [CrossIsolateException.serialize].
+  CrossIsolateException.deserialize(Map error)
+      : type = error['type'],
+        message = error['message'],
+        stackTrace = error['stack'] == null ? null :
+            new Chain.parse(error['stack']);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(error, [StackTrace stack]) {
+    if (stack == null && error is Error) stack = error.stackTrace;
+    return {
+      'type': error.runtimeType.toString(),
+      'message': getErrorMessage(error),
+      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
+    };
+  }
+
+  String toString() => "$message\n$stackTrace";
+}
+
+/// An [AssetNotFoundException] that was originally raised in another isolate. 
+class _CrossIsolateAssetNotFoundException extends CrossIsolateException
+    implements AssetNotFoundException {
+  final AssetId id;
+
+  String get message => "Could not find asset $id.";
+
+  /// Loads a [_CrossIsolateAssetNotFoundException] from a serialized
+  /// representation.
+  ///
+  /// [error] should be the result of
+  /// [_CrossIsolateAssetNotFoundException.serialize].
+  _CrossIsolateAssetNotFoundException.deserialize(Map error)
+      : id = new AssetId(error['package'], error['path']),
+        super.deserialize(error);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(AssetNotFoundException error, [StackTrace stack]) {
+    var map = CrossIsolateException.serialize(error);
+    map['package'] = error.id.package;
+    map['path'] = error.id.path;
+    return map;
+  }
+}
+
+/// Serializes [error] to an object that can safely be passed across isolate
+/// boundaries.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+Map serializeException(error, [StackTrace stack]) {
+  if (error is AssetNotFoundException) {
+    return _CrossIsolateAssetNotFoundException.serialize(error, stack);
+  } else {
+    return CrossIsolateException.serialize(error, stack);
+  }
+}
+
+/// Loads an exception from a serialized representation.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+CrossIsolateException deserializeException(Map error) {
+  if (error['type'] == 'AssetNotFoundException') {
+    return new _CrossIsolateAssetNotFoundException.deserialize(error);
+  } else {
+    return new CrossIsolateException.deserialize(error);
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
new file mode 100644
index 0000000..cc5e052
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transform.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 pub.asset.serialize.transform;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import '../utils.dart';
+
+/// Converts [transform] into a serializable map.
+Map serializeTransform(Transform transform) {
+  var receivePort = new ReceivePort();
+  receivePort.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'getInput') {
+        return transform.getInput(deserializeId(message['id']))
+            .then((asset) => serializeAsset(asset));
+      }
+
+      if (message['type'] == 'addOutput') {
+        transform.addOutput(deserializeAsset(message['output']));
+        return null;
+      }
+
+      if (message['type'] == 'consumePrimary') {
+        transform.consumePrimary();
+        return null;
+      }
+
+      assert(message['type'] == 'log');
+      var method;
+      if (message['level'] == 'Info') {
+        method = transform.logger.info;
+      } else if (message['level'] == 'Fine') {
+        method = transform.logger.fine;
+      } else if (message['level'] == 'Warning') {
+        method = transform.logger.warning;
+      } else {
+        assert(message['level'] == 'Error');
+        method = transform.logger.error;
+      }
+
+      var assetId = message['assetId'] == null ? null :
+        deserializeId(message['assetId']);
+      var span = message['span'] == null ? null :
+        deserializeSpan(message['span']);
+      method(message['message'], asset: assetId, span: span);
+    });
+  });
+
+  return {
+    'port': receivePort.sendPort,
+    'primaryInput': serializeAsset(transform.primaryInput)
+  };
+}
+
+/// A wrapper for a [Transform] that's in the host isolate.
+///
+/// This retrieves inputs from and sends outputs and logs to the host isolate.
+class ForeignTransform implements Transform {
+  /// The port with which we communicate with the host isolate.
+  ///
+  /// This port and all messages sent across it are specific to this transform.
+  final SendPort _port;
+
+  final Asset primaryInput;
+
+  TransformLogger get logger => _logger;
+  TransformLogger _logger;
+
+  /// Creates a transform from a serializable map sent from the host isolate.
+  ForeignTransform(Map transform)
+      : _port = transform['port'],
+        primaryInput = deserializeAsset(transform['primaryInput']) {
+    _logger = new TransformLogger((assetId, level, message, span) {
+      call(_port, {
+        'type': 'log',
+        'level': level.name,
+        'message': message,
+        'assetId': assetId == null ? null : serializeId(assetId),
+        'span': span == null ? null : serializeSpan(span)
+      });
+    });
+  }
+
+  Future<Asset> getInput(AssetId id) {
+    return call(_port, {
+      'type': 'getInput',
+      'id': serializeId(id)
+    }).then(deserializeAsset);
+  }
+
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
+  void addOutput(Asset output) {
+    call(_port, {
+      'type': 'addOutput',
+      'output': serializeAsset(output)
+    });
+  }
+
+  void consumePrimary() {
+    call(_port, {'type': 'consumePrimary'});
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
new file mode 100644
index 0000000..608eaa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -0,0 +1,60 @@
+// 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.asset.serialize.transformer;
+
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import 'transform.dart';
+
+/// Converts [transformer] into a serializable map.
+Map serializeTransformer(Transformer transformer) {
+  var port = new ReceivePort();
+  port.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'isPrimary') {
+        return transformer.isPrimary(deserializeAsset(message['asset']));
+      } else {
+        assert(message['type'] == 'apply');
+
+        // Make sure we return null so that if the transformer's [apply] returns
+        // a non-serializable value it doesn't cause problems.
+        return transformer.apply(
+            new ForeignTransform(message['transform'])).then((_) => null);
+      }
+    });
+  });
+
+  return {
+    'type': 'Transformer',
+    'toString': transformer.toString(),
+    'port': port.sendPort
+  };
+}
+
+// Converts [group] into a serializable map.
+Map serializeTransformerGroup(TransformerGroup group) {
+  return {
+    'type': 'TransformerGroup',
+    'toString': group.toString(),
+    'phases': group.phases.map((phase) {
+      return phase.map(serializeTransformerOrGroup).toList();
+    }).toList()
+  };
+}
+
+/// Converts [transformerOrGroup] into a serializable map.
+Map serializeTransformerOrGroup(transformerOrGroup) {
+  if (transformerOrGroup is Transformer) {
+    return serializeTransformer(transformerOrGroup);
+  } else {
+    assert(transformerOrGroup is TransformerGroup);
+    return serializeTransformerGroup(transformerOrGroup);
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
new file mode 100644
index 0000000..5b6dfa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -0,0 +1,71 @@
+// 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.asset.transformer_isolate;
+
+import 'dart:convert';
+import 'dart:isolate';
+import 'dart:mirrors';
+
+import 'package:barback/barback.dart';
+
+import 'serialize.dart';
+
+/// Sets up the initial communication with the host isolate.
+void loadTransformers(SendPort replyTo) {
+  var port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.first.then((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      var library = Uri.parse(message['library']);
+      var configuration = JSON.decode(message['configuration']);
+      var mode = new BarbackMode(message['mode']);
+      return _initialize(library, configuration, mode).
+          map(serializeTransformerOrGroup).toList();
+    });
+  });
+}
+
+/// Loads all the transformers and groups defined in [uri].
+///
+/// Loads the library, finds any Transformer or TransformerGroup subclasses in
+/// it, instantiates them with [configuration] and [mode], and returns them.
+Iterable _initialize(Uri uri, Map configuration, BarbackMode mode) {
+  var mirrors = currentMirrorSystem();
+  var transformerClass = reflectClass(Transformer);
+  var groupClass = reflectClass(TransformerGroup);
+
+  // TODO(nweiz): if no valid transformers are found, throw an error message
+  // describing candidates and why they were rejected.
+  return mirrors.libraries[uri].declarations.values.map((declaration) {
+    if (declaration is! ClassMirror) return null;
+    var classMirror = declaration;
+    if (classMirror.isPrivate) return null;
+    if (classMirror.isAbstract) return null;
+    if (!classMirror.isSubtypeOf(transformerClass) &&
+        !classMirror.isSubtypeOf(groupClass)) {
+      return null;
+    }
+
+    var constructor = _getConstructor(classMirror, 'asPlugin');
+    if (constructor == null) return null;
+    if (constructor.parameters.isEmpty) {
+      if (configuration.isNotEmpty) return null;
+      return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
+    }
+    if (constructor.parameters.length != 1) return null;
+
+    return classMirror.newInstance(const Symbol('asPlugin'),
+        [new BarbackSettings(configuration, mode)]).reflectee;
+  }).where((classMirror) => classMirror != null);
+}
+
+// TODO(nweiz): clean this up when issue 13248 is fixed.
+MethodMirror _getConstructor(ClassMirror classMirror, String constructor) {
+  var name = new Symbol("${MirrorSystem.getName(classMirror.simpleName)}"
+      ".$constructor");
+  var candidate = classMirror.declarations[name];
+  if (candidate is MethodMirror && candidate.isConstructor) return candidate;
+  return null;
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/utils.dart b/sdk/lib/_internal/pub/asset/dart/utils.dart
new file mode 100644
index 0000000..72150ed
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/utils.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.
+
+/// Functions go in this file as opposed to lib/src/utils.dart if they need to
+/// be accessible to the transformer-loading isolate.
+library pub.asset.utils;
+
+import 'dart:async';
+
+/// A regular expression to match the exception prefix that some exceptions'
+/// [Object.toString] values contain.
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
+
+/// Get a string description of an exception.
+///
+/// Many exceptions include the exception class name at the beginning of their
+/// [toString], so we remove that if it exists.
+String getErrorMessage(error) =>
+  error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Returns a [Stream] that will emit the same values as the stream returned by
+/// [callback].
+///
+/// [callback] will only be called when the returned [Stream] gets a subscriber.
+Stream callbackStream(Stream callback()) {
+  var subscription;
+  var controller;
+  controller = new StreamController(onListen: () {
+    subscription = callback().listen(controller.add,
+        onError: controller.addError,
+        onDone: controller.close);
+  },
+      onCancel: () => subscription.cancel(),
+      onPause: () => subscription.pause(),
+      onResume: () => subscription.resume(),
+      sync: true);
+  return controller.stream;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
new file mode 100644
index 0000000..2c8cc19
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
@@ -0,0 +1,54 @@
+// 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.barback.build_environment;
+
+import 'dart:async';
+
+import 'package:watcher/watcher.dart';
+
+import 'build_environment.dart';
+import 'server.dart';
+
+/// A directory in the entrypoint package whose contents have been made
+/// available to barback and that are bound to a server.
+class BuildDirectory {
+  final BuildEnvironment _environment;
+
+  /// The relative directory path within the package.
+  final String directory;
+
+  /// The server bound to this directory.
+  BarbackServer get server => _server;
+  BarbackServer _server;
+
+  /// The subscription to the [DirectoryWatcher] used to watch this directory
+  /// for changes.
+  ///
+  /// If the directory is not being watched, this will be `null`.
+  StreamSubscription<WatchEvent> watchSubscription;
+
+  BuildDirectory(this._environment, this.directory);
+
+  /// Binds a server running on [hostname]:[port] to this directory.
+  Future<BarbackServer> serve(String hostname, int port) {
+    return BarbackServer.bind(_environment, hostname, port, directory)
+        .then((server) => _server = server);
+  }
+
+  /// Removes the build directory from the build environment.
+  ///
+  /// Closes the server, removes the assets from barback, and stops watching it.
+  Future close() {
+    var futures = [server.close()];
+
+    // Stop watching the directory.
+    if (watchSubscription != null) {
+      var cancel = watchSubscription.cancel();
+      if (cancel != null) futures.add(cancel);
+    }
+
+    return Future.wait(futures);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
index 9cc8128..99890b7 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -8,7 +8,7 @@
 import 'dart:io';
 
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
+import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 import 'package:watcher/watcher.dart';
 
@@ -17,6 +17,7 @@
 import '../log.dart' as log;
 import '../package.dart';
 import '../package_graph.dart';
+import 'build_directory.dart';
 import 'dart_forwarding_transformer.dart';
 import 'dart2js_transformer.dart';
 import 'load_all_transformers.dart';
@@ -52,7 +53,6 @@
   /// transformers, and server are loaded and ready.
   static Future<BuildEnvironment> create(Entrypoint entrypoint,
       String hostname, int basePort, BarbackMode mode, WatcherType watcherType,
-      Iterable<String> rootDirectories,
       {bool useDart2JS: true}) {
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
@@ -60,63 +60,16 @@
       barback.log.listen(_log);
 
       var environment = new BuildEnvironment._(graph, barback, mode,
-          watcherType, rootDirectories);
-      return environment._startServers(hostname, basePort).then((_) {
-        log.fine("Started servers.");
-        // If the entrypoint package manually configures the dart2js
-        // transformer, don't include it in the built-in transformer list.
-        //
-        // TODO(nweiz): if/when we support more built-in transformers, make
-        // this more general.
-        var containsDart2JS = graph.entrypoint.root.pubspec.transformers
-            .any((transformers) => transformers
-            .any((id) => id.package == '\$dart2js'));
+          watcherType, hostname, basePort);
 
-        if (!containsDart2JS && useDart2JS) {
-          environment._builtInTransformers.addAll([
-            new Dart2JSTransformer(environment, mode),
-            new DartForwardingTransformer(mode)
-          ]);
-        }
-
-        return environment._load(barback).then((_) => environment);
-      });
+      return environment._load(useDart2JS: useDart2JS)
+          .then((_) => environment);
     });
   }
 
-  /// Start the [BarbackServer]s that will serve [rootDirectories].
-  Future<List<BarbackServer>> _startServers(String hostname, int basePort) {
-    _bind(port, rootDirectory) {
-      if (basePort == 0) port = 0;
-      return BarbackServer.bind(this, hostname, port, rootDirectory);
-    }
-
-    var rootDirectoryList = _rootDirectories.toList();
-
-    // For consistency, "web/" should always have the first available port and
-    // "test/" should always have the second. Other directories are assigned
-    // the following ports in alphabetical order.
-    var serverFutures = [];
-    if (rootDirectoryList.remove('web')) {
-      serverFutures.add(_bind(basePort, 'web'));
-    }
-    if (rootDirectoryList.remove('test')) {
-      serverFutures.add(_bind(basePort + 1, 'test'));
-    }
-
-    var i = 0;
-    for (var dir in rootDirectoryList) {
-      serverFutures.add(_bind(basePort + 2 + i, dir));
-      i += 1;
-    }
-
-    return Future.wait(serverFutures).then((boundServers) {
-      servers.addAll(boundServers);
-    });
-  }
-
-  /// The servers serving this environment's assets.
-  final servers = <BarbackServer>[];
+  /// The public directories in the root package that are available for
+  /// building, keyed by their root directory.
+  final _directories = new Map<String, BuildDirectory>();
 
   /// The [Barback] instance used to process assets in this environment.
   final Barback barback;
@@ -137,13 +90,33 @@
   /// How source files should be watched.
   final WatcherType _watcherType;
 
-  /// The set of top-level directories in the entrypoint package that will be
-  /// exposed.
-  final Set<String> _rootDirectories;
+  /// The hostname that servers are bound to.
+  final String _hostname;
+
+  /// The starting number for ports that servers will be bound to.
+  ///
+  /// Servers will be bound to ports starting at this number and then
+  /// incrementing from there. However, if this is zero, then ephemeral port
+  /// numbers will be selected for each server.
+  final int _basePort;
+
+  /// The modified source assets that have not been sent to barback yet.
+  ///
+  /// The build environment can be paused (by calling [pauseUpdates]) and
+  /// resumed ([resumeUpdates]). While paused, all source asset updates that
+  /// come from watching or adding new directories are not sent to barback.
+  /// When resumed, all pending source updates are sent to barback.
+  ///
+  /// This lets pub serve and pub build create an environment and bind several
+  /// servers before barback starts building and producing results
+  /// asynchronously.
+  ///
+  /// If this is `null`, then the environment is "live" and all updates will
+  /// go to barback immediately.
+  Set<AssetId> _modifiedSources;
 
   BuildEnvironment._(this.graph, this.barback, this.mode, this._watcherType,
-      Iterable<String> rootDirectories)
-      : _rootDirectories = rootDirectories.toSet();
+      this._hostname, this._basePort);
 
   /// Gets the built-in [Transformer]s that should be added to [package].
   ///
@@ -159,16 +132,154 @@
     return _builtInTransformers;
   }
 
-  /// Gets the names of the top-level directories in [package] whose contents
-  /// should be provided as source assets.
-  Set<String> getPublicDirectories(String package) {
-    var directories = ["asset", "lib"];
-
-    if (package == graph.entrypoint.root.name) {
-      directories.addAll(_rootDirectories);
+  /// Binds a new port to serve assets from within [rootDirectory] in the
+  /// entrypoint package.
+  ///
+  /// Adds and watches the sources within that directory. Returns a [Future]
+  /// that completes to the bound server.
+  ///
+  /// If [rootDirectory] is already being served, returns that existing server.
+  Future<BarbackServer> serveDirectory(String rootDirectory) {
+    // See if there is already a server bound to the directory.
+    var directory = _directories[rootDirectory];
+    if (directory != null) {
+      log.fine('Already serving $rootDirectory on ${directory.server.url}.');
+      return new Future.value(directory.server);
     }
 
-    return directories.toSet();
+    var port = _basePort;
+
+    // If not using an ephemeral port, find the lowest-numbered available one.
+    if (port != 0) {
+      var boundPorts = _directories.values
+          .map((directory) => directory.server.port).toSet();
+      while (boundPorts.contains(port)) {
+        port++;
+      }
+    }
+
+    var buildDirectory = new BuildDirectory(this, rootDirectory);
+    _directories[rootDirectory] = buildDirectory;
+
+    return _provideDirectorySources(rootPackage, rootDirectory)
+        .then((subscription) {
+      buildDirectory.watchSubscription = subscription;
+      return buildDirectory.serve(_hostname, port);
+    });
+  }
+
+  /// Stops the server bound to [rootDirectory].
+  ///
+  /// Also removes any source files within that directory from barback. Returns
+  /// the URL of the unbound server, of `null` if [rootDirectory] was not
+  /// bound to a server.
+  Future<Uri> unserveDirectory(String rootDirectory) {
+    log.fine("Unserving $rootDirectory.");
+    var directory = _directories.remove(rootDirectory);
+    if (directory == null) return new Future.value();
+
+    var url = directory.server.url;
+    return directory.close().then((_) {
+      // Remove the sources from barback, unless some other build directory
+      // includes them.
+      return _removeDirectorySources(rootDirectory);
+    }).then((_) => url);
+  }
+
+  /// Return all URLs serving [assetPath] in this environment.
+  List<Uri> getUrlsForAssetPath(String assetPath) {
+    // Check the three (mutually-exclusive) places the path could be pointing.
+    var urls = _lookUpPathInServerRoot(assetPath);
+    if (urls.isEmpty) urls = _lookUpPathInPackagesDirectory(assetPath);
+    if (urls.isEmpty) urls = _lookUpPathInDependency(assetPath);
+    return urls.toList();
+  }
+
+  /// Look up [assetPath] in the root directories of servers running in the
+  /// entrypoint package.
+  Iterable<Uri> _lookUpPathInServerRoot(String assetPath) {
+    // Find all of the servers whose root directories contain the asset and
+    // generate appropriate URLs for each.
+    return _directories.values
+        .where((dir) => path.isWithin(dir.directory, assetPath))
+        .map((dir) {
+      var relativePath = path.relative(assetPath, from: dir.directory);
+      return dir.server.url.resolveUri(path.toUri(relativePath));
+    });
+  }
+
+  /// Look up [assetPath] in the "packages" directory in the entrypoint package.
+  Iterable<Uri> _lookUpPathInPackagesDirectory(String assetPath) {
+    var components = path.split(path.relative(assetPath));
+    if (components.first != "packages") return [];
+    if (!graph.packages.containsKey(components[1])) return [];
+    return _directories.values.map((dir) =>
+        dir.server.url.resolveUri(path.toUri(assetPath)));
+  }
+
+  /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
+  /// package.
+  Iterable<Uri> _lookUpPathInDependency(String assetPath) {
+    for (var package in graph.packages.values) {
+      var libDir = path.join(package.dir, 'lib');
+      var assetDir = path.join(package.dir, 'asset');
+
+      var uri;
+      if (path.isWithin(libDir, assetPath)) {
+        uri = path.toUri(path.join('packages', package.name,
+            path.relative(assetPath, from: libDir)));
+      } else if (path.isWithin(assetDir, assetPath)) {
+        uri = path.toUri(path.join('assets', package.name,
+            path.relative(assetPath, from: assetDir)));
+      } else {
+        continue;
+      }
+
+      return _directories.values.map((dir) => dir.server.url.resolveUri(uri));
+    }
+
+    return [];
+  }
+
+  /// Given a URL to an asset served by this environment, returns the ID of the
+  /// asset that would be accessed by that URL.
+  ///
+  /// If no server can serve [url], returns `null`.
+  AssetId getAssetIdForUrl(Uri url) {
+    var directory = _directories.values.firstWhere(
+        (dir) => dir.server.address.host == url.host &&
+            dir.server.port == url.port,
+        orElse: () => null);
+    if (directory == null) return null;
+
+    return directory.server.urlToId(url);
+  }
+
+  /// Determines if [sourcePath] is contained within any of the directories in
+  /// the root package that are visible to this build environment.
+  bool containsPath(String sourcePath) {
+    var directories = ["asset", "lib"];
+    directories.addAll(_directories.keys);
+
+    return directories.any((dir) => path.isWithin(dir, sourcePath));
+  }
+
+  /// Pauses sending source asset updates to barback.
+  void pauseUpdates() {
+    // Cannot pause while already paused.
+    assert(_modifiedSources == null);
+
+    _modifiedSources = new Set<AssetId>();
+  }
+
+  /// Sends any pending source updates to barback and begins the asynchronous
+  /// build process.
+  void resumeUpdates() {
+    // Cannot resume while not paused.
+    assert(_modifiedSources != null);
+
+    barback.updateSources(_modifiedSources);
+    _modifiedSources = null;
   }
 
   /// Loads the assets and transformers for this environment.
@@ -178,16 +289,53 @@
   /// in packages in [graph] and re-runs them as necessary when any input files
   /// change.
   ///
+  /// If [useDart2JS] is `true`, then the [Dart2JSTransformer] is implicitly
+  /// added to end of the root package's transformer phases.
+  ///
   /// Returns a [Future] that completes once all inputs and transformers are
   /// loaded.
-  Future _load(Barback barback) {
-    return _provideSources(barback).then((_) {
+  Future _load({bool useDart2JS}) {
+    // If the entrypoint package manually configures the dart2js
+    // transformer, don't include it in the built-in transformer list.
+    //
+    // TODO(nweiz): if/when we support more built-in transformers, make
+    // this more general.
+    var containsDart2JS = graph.entrypoint.root.pubspec.transformers
+        .any((transformers) => transformers
+        .any((id) => id.package == '\$dart2js'));
+
+    if (!containsDart2JS && useDart2JS) {
+      _builtInTransformers.addAll([
+        new Dart2JSTransformer(this, mode),
+        new DartForwardingTransformer(mode)
+      ]);
+    }
+
+    // "$pub" is a psuedo-package that allows pub's transformer-loading
+    // infrastructure to share code with pub proper. We provide it only during
+    // the initial transformer loading process.
+    var dartPath = assetPath('dart');
+    var pubSources = listDir(dartPath, recursive: true).map((library) {
+      return new AssetId('\$pub',
+          path.join('lib', path.relative(library, from: dartPath)));
+    });
+
+    // Bind a server that we can use to load the transformers.
+    var transformerServer;
+    return BarbackServer.bind(this, _hostname, 0, null).then((server) {
+      transformerServer = server;
+
+      return log.progress("Loading source assets", () {
+        barback.updateSources(pubSources);
+        return _provideSources();
+      });
+    }).then((_) {
       log.fine("Provided sources.");
       var completer = new Completer();
 
-      // If any errors get emitted either by barback or by the primary server,
-      // including non-programmatic barback errors, they should take down the
-      // whole program.
+      // If any errors get emitted either by barback or by the transformer
+      // server, including non-programmatic barback errors, they should take
+      // down the whole program.
       var subscriptions = [
         barback.errors.listen((error) {
           if (error is TransformerException) {
@@ -207,16 +355,16 @@
           if (completer.isCompleted) return;
           completer.completeError(error, stackTrace);
         }),
-        // We only listen to the first server here because that's the one used
-        // to initialize all the transformers during the initial load.
-        servers.first.results.listen((_) {}, onError: (error, stackTrace) {
+        transformerServer.results.listen((_) {}, onError: (error, stackTrace) {
           if (completer.isCompleted) return;
           completer.completeError(error, stackTrace);
         })
       ];
 
-      loadAllTransformers(this).then((_) {
+      loadAllTransformers(this, transformerServer).then((_) {
         log.fine("Loaded transformers.");
+        return transformerServer.close();
+      }).then((_) {
         if (!completer.isCompleted) completer.complete();
       }).catchError((error, stackTrace) {
         if (!completer.isCompleted) {
@@ -229,125 +377,179 @@
           subscription.cancel();
         }
       });
-    });
+    }).then((_) => barback.removeSources(pubSources));
   }
 
-  /// Provides all of the source assets in the environment to barback.
+  /// Provides the public source assets in the environment to barback.
   ///
   /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
-  Future _provideSources(Barback barback) {
-    if (_watcherType != WatcherType.NONE) {
-      return _watchSources(barback);
-    }
-
-    return _loadSources(barback);
-  }
-
-  /// Provides all of the source assets in the environment to barback.
-  Future _loadSources(Barback barback) {
-    return Future.wait(graph.packages.values.map(_updateSources));
-  }
-
-  /// Adds all of the source assets in this environment to barback and then
-  /// watches the public directories for changes.
-  ///
-  /// Returns a Future that completes when the sources are loaded and the
-  /// watchers are active.
-  Future _watchSources(Barback barback) {
+  Future _provideSources() {
     return Future.wait(graph.packages.values.map((package) {
-      // If this package comes from a cached source, its contents won't change
-      // so we don't need to monitor it. `packageId` will be null for the
-      // application package, since that's not locked.
-      var packageId = graph.lockFile.packages[package.name];
-      if (packageId != null &&
-          graph.entrypoint.cache.sources[packageId.source].shouldCache) {
-        return _updateSources(package);
-      }
-
-      // Watch the visible package directories for changes.
-      return Future.wait(getPublicDirectories(package.name).map((name) {
-        var subdirectory = p.join(package.dir, name);
-        if (!dirExists(subdirectory)) return new Future.value();
-
-        // TODO(nweiz): close these watchers when [barback] is closed.
-        var watcher = _watcherType.create(subdirectory);
-        watcher.events.listen((event) {
-          // Don't watch files symlinked into these directories.
-          // TODO(rnystrom): If pub gets rid of symlinks, remove this.
-          var parts = p.split(event.path);
-          if (parts.contains("packages") || parts.contains("assets")) return;
-
-          // Skip files that were (most likely) compiled from nearby ".dart"
-          // files. These are created by the Editor's "Run as JavaScript"
-          // command and are written directly into the package's directory.
-          // When pub's dart2js transformer then tries to create the same file
-          // name, we get a build error. To avoid that, just don't consider
-          // that file to be a source.
-          // TODO(rnystrom): Remove these when the Editor no longer generates
-          // .js files and users have had enough time that they no longer have
-          // these files laying around. See #15859.
-          if (event.path.endsWith(".dart.js")) return;
-          if (event.path.endsWith(".dart.js.map")) return;
-          if (event.path.endsWith(".dart.precompiled.js")) return;
-
-          var id = new AssetId(package.name,
-              p.relative(event.path, from: package.dir));
-          if (event.type == ChangeType.REMOVE) {
-            barback.removeSources([id]);
-          } else {
-            barback.updateSources([id]);
-          }
-        });
-        return watcher.ready;
-      })).then((_) => _updateSources(package));
+      // Just include the "shared" directories in each package. We'll add the
+      // other build directories in the root package by calling
+      // [serveDirectory].
+      return Future.wait([
+        _provideDirectorySources(package, "asset"),
+        _provideDirectorySources(package, "lib")
+      ]);
     }));
   }
 
-  /// Lists all of the visible files in [package] and updates them in barback.
+  /// Provides all of the source assets within [dir] in [package] to barback.
   ///
-  /// This is the recursive contents of the "asset" and "lib" directories (if
-  /// present). If [package] is the entrypoint package, it also includes the
-  /// build directories.
+  /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
+  /// Returns the subscription to the watcher, or `null` if none was created.
+  Future<StreamSubscription<WatchEvent>> _provideDirectorySources(
+      Package package, String dir) {
+    log.fine("Providing sources for ${package.name}|$dir.");
+    // TODO(rnystrom): Handle overlapping directories. If two served
+    // directories overlap like so:
+    //
+    // $ pub serve example example/subdir
+    //
+    // Then the sources of the subdirectory will be updated and watched twice.
+    // See: #17454
+    if (_watcherType == WatcherType.NONE) {
+      return _updateDirectorySources(package, dir);
+    }
+
+    // Watch the directory before listing is so we don't miss files that
+    // are added between the initial list and registering the watcher.
+    return _watchDirectorySources(package, dir).then((_) {
+      return _updateDirectorySources(package, dir);
+    });
+  }
+
+  /// Updates barback with all of the files in [dir] inside [package].
+  Future _updateDirectorySources(Package package, String dir) {
+    return _listDirectorySources(package, dir).then((ids) {
+      if (_modifiedSources == null) {
+        barback.updateSources(ids);
+      } else {
+        _modifiedSources.addAll(ids);
+      }
+    });
+  }
+
+  /// Removes all of the files in [dir] in the root package from barback unless
+  /// some other build directory still contains them.
+  Future _removeDirectorySources(String dir) {
+    return _listDirectorySources(rootPackage, dir, where: (relative) {
+      // TODO(rnystrom): This is O(n*m) where n is the number of files and
+      // m is the number of served directories. Consider something more
+      // optimal if this becomes a bottleneck.
+      // Don't remove a source if some other directory still includes it.
+      return !_directories.keys.any((dir) => path.isWithin(dir, relative));
+    }).then((ids) {
+      if (_modifiedSources == null) {
+        barback.removeSources(ids);
+      } else {
+        _modifiedSources.removeAll(ids);
+      }
+    });
+  }
+
+  /// Lists all of the source assets in [dir] inside [package].
   ///
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  Future _updateSources(Package package) {
-    return Future.wait(getPublicDirectories(package.name).map((dirPath) {
-      var dir = p.join(package.dir, dirPath);
-      if (!dirExists(dir)) return new Future.value();
+  ///
+  /// If [where] is given, then it is used to filter the resulting list of
+  /// packages. Only assets whose relative path within [package] matches that
+  /// will be included in the results.
+  Future<List<AssetId>> _listDirectorySources(Package package, String dir,
+      {bool where(String relativePath)}) {
+    var subdirectory = path.join(package.dir, dir);
+    if (!dirExists(subdirectory)) return new Future.value([]);
 
-      return new Directory(dir).list(recursive: true, followLinks: true)
-          .expand((entry) {
-        // Skip directories and (broken) symlinks.
-        if (entry is Directory) return [];
-        if (entry is Link) return [];
+    return new Directory(subdirectory).list(recursive: true, followLinks: true)
+        .expand((entry) {
+      // Skip directories and (broken) symlinks.
+      if (entry is Directory) return [];
+      if (entry is Link) return [];
 
-        var relative = p.normalize(
-            p.relative(entry.path, from: package.dir));
+      var relative = path.normalize(
+          path.relative(entry.path, from: package.dir));
 
-        // Ignore hidden files or files in "packages" and hidden directories.
-        if (p.split(relative).any((part) =>
-            part.startsWith(".") || part == "packages")) {
-          return [];
+      // Ignore hidden files or files in "packages" and hidden directories.
+      if (path.split(relative).any((part) =>
+          part.startsWith(".") || part == "packages")) {
+        return [];
+      }
+
+      // Skip files that were (most likely) compiled from nearby ".dart"
+      // files. These are created by the Editor's "Run as JavaScript"
+      // command and are written directly into the package's directory.
+      // When pub's dart2js transformer then tries to create the same file
+      // name, we get a build error. To avoid that, just don't consider
+      // that file to be a source.
+      // TODO(rnystrom): Remove these when the Editor no longer generates
+      // .js files and users have had enough time that they no longer have
+      // these files laying around. See #15859.
+      if (relative.endsWith(".dart.js")) return [];
+      if (relative.endsWith(".dart.js.map")) return [];
+      if (relative.endsWith(".dart.precompiled.js")) return [];
+
+      if (where != null && !where(relative)) return [];
+
+      return [new AssetId(package.name, relative)];
+    }).toList();
+  }
+
+  /// Adds a file watcher for [dir] within [package], if the directory exists
+  /// and the package needs watching.
+  Future<StreamSubscription<WatchEvent>> _watchDirectorySources(
+      Package package, String dir) {
+    // If this package comes from a cached source, its contents won't change so
+    // we don't need to monitor it. `packageId` will be null for the
+    // application package, since that's not locked.
+    var packageId = graph.lockFile.packages[package.name];
+    if (packageId != null &&
+        graph.entrypoint.cache.sources[packageId.source].shouldCache) {
+      return new Future.value();
+    }
+
+    var subdirectory = path.join(package.dir, dir);
+    if (!dirExists(subdirectory)) return new Future.value();
+
+    // TODO(nweiz): close this watcher when [barback] is closed.
+    var watcher = _watcherType.create(subdirectory);
+    var subscription = watcher.events.listen((event) {
+      // Don't watch files symlinked into these directories.
+      // TODO(rnystrom): If pub gets rid of symlinks, remove this.
+      var parts = path.split(event.path);
+      if (parts.contains("packages") || parts.contains("assets")) return;
+
+      // Skip files that were (most likely) compiled from nearby ".dart"
+      // files. These are created by the Editor's "Run as JavaScript"
+      // command and are written directly into the package's directory.
+      // When pub's dart2js transformer then tries to create the same file
+      // name, we get a build error. To avoid that, just don't consider
+      // that file to be a source.
+      // TODO(rnystrom): Remove these when the Editor no longer generates
+      // .js files and users have had enough time that they no longer have
+      // these files laying around. See #15859.
+      if (event.path.endsWith(".dart.js")) return;
+      if (event.path.endsWith(".dart.js.map")) return;
+      if (event.path.endsWith(".dart.precompiled.js")) return;
+
+      var id = new AssetId(package.name,
+          path.relative(event.path, from: package.dir));
+      if (event.type == ChangeType.REMOVE) {
+        if (_modifiedSources != null) {
+          _modifiedSources.remove(id);
+        } else {
+          barback.removeSources([id]);
         }
+      } else if (_modifiedSources != null) {
+        _modifiedSources.add(id);
+      } else {
+        barback.updateSources([id]);
+      }
+    });
 
-        // Skip files that were (most likely) compiled from nearby ".dart"
-        // files. These are created by the Editor's "Run as JavaScript"
-        // command and are written directly into the package's directory.
-        // When pub's dart2js transformer then tries to create the same file
-        // name, we get a build error. To avoid that, just don't consider
-        // that file to be a source.
-        // TODO(rnystrom): Remove these when the Editor no longer generates
-        // .js files and users have had enough time that they no longer have
-        // these files laying around. See #15859.
-        if (relative.endsWith(".dart.js")) return [];
-        if (relative.endsWith(".dart.js.map")) return [];
-        if (relative.endsWith(".dart.precompiled.js")) return [];
-
-        return [new AssetId(package.name, relative)];
-      }).toList().then(barback.updateSources);
-    }));
+    return watcher.ready.then((_) => subscription);
   }
 }
 
@@ -362,7 +564,7 @@
 
   messageMentionsAsset(id) =>
       messageMentions(id.toString()) ||
-      messageMentions(p.joinAll(p.url.split(entry.assetId.path)));
+      messageMentions(path.fromUri(entry.assetId.path));
 
   var prefixParts = [];
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 44225d6..de74c74 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -19,7 +19,6 @@
 import '../../../../compiler/implementation/source_file.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
-import '../io.dart';
 import '../pool.dart';
 import '../utils.dart';
 import 'build_environment.dart';
@@ -352,8 +351,7 @@
     // other files in the root package are not visible to transformers, so
     // should be loaded directly from disk.
     var sourcePath = path.fromUri(url);
-    if (_environment.getPublicDirectories(_environment.rootPackage.name)
-        .any((dir) => path.isWithin(dir, sourcePath))) {
+    if (_environment.containsPath(sourcePath)) {
       var relative = path.relative(sourcePath,
           from: _environment.rootPackage.dir);
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 5376635..fcfb3d0 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -8,14 +8,16 @@
 
 import 'package:barback/barback.dart';
 
+import '../barback.dart';
+import '../log.dart' as log;
+import '../package_graph.dart';
+import '../utils.dart';
 import 'build_environment.dart';
 import 'dart2js_transformer.dart';
 import 'excluding_transformer.dart';
 import 'load_transformers.dart';
 import 'rewrite_import_transformer.dart';
-import '../barback.dart';
-import '../package_graph.dart';
-import '../utils.dart';
+import 'server.dart';
 
 /// Loads all transformers depended on by packages in [environment].
 ///
@@ -25,7 +27,8 @@
 ///
 /// Any built-in transformers that are provided by the environment will
 /// automatically be added to the end of the root package's cascade.
-Future loadAllTransformers(BuildEnvironment environment) {
+Future loadAllTransformers(BuildEnvironment environment,
+    BarbackServer transformerServer) {
   // In order to determine in what order we should load transformers, we need to
   // know which transformers depend on which others. This is different than
   // normal package dependencies. Let's begin with some terminology:
@@ -60,11 +63,12 @@
   for (var package in environment.graph.packages.values) {
     environment.barback.updateTransformers(package.name, [[rewrite]]);
   }
+  environment.barback.updateTransformers(r'$pub', [[rewrite]]);
 
   var orderingDeps = _computeOrderingDeps(environment.graph);
   var packageTransformers = _computePackageTransformers(environment.graph);
 
-  var loader = new _TransformerLoader(environment);
+  var loader = new _TransformerLoader(environment, transformerServer);
 
   // The packages on which no packages have ordering dependencies -- that is,
   // the packages that don't need to be loaded before any other packages. These
@@ -216,6 +220,8 @@
 class _TransformerLoader {
   final BuildEnvironment _environment;
 
+  final BarbackServer _transformerServer;
+
   /// The loaded transformers defined in the library identified by each
   /// transformer id.
   final _transformers = new Map<TransformerId, Set<Transformer>>();
@@ -225,7 +231,7 @@
   /// Used for error reporting.
   final _transformerUsers = new Map<Pair<String, String>, Set<String>>();
 
-  _TransformerLoader(this._environment) {
+  _TransformerLoader(this._environment, this._transformerServer) {
     for (var package in _environment.graph.packages.values) {
       for (var id in unionAll(package.pubspec.transformers)) {
         _transformerUsers.putIfAbsent(
@@ -245,7 +251,9 @@
 
     // TODO(nweiz): load multiple instances of the same transformer from the
     // same isolate rather than spinning up a separate isolate for each one.
-    return loadTransformers(_environment, id).then((transformers) {
+    return log.progress("Loading $id transformers",
+        () => loadTransformers(_environment, _transformerServer, id))
+        .then((transformers) {
       if (!transformers.isEmpty) {
         _transformers[id] = transformers;
         return;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
index 12e5c49..6726288 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -11,378 +11,43 @@
 import 'package:barback/barback.dart';
 // TODO(nweiz): don't import from "src" once issue 14966 is fixed.
 import 'package:barback/src/internal_asset.dart';
-import 'package:source_maps/source_maps.dart';
-import 'package:stack_trace/stack_trace.dart';
 
+import '../../../asset/dart/serialize.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
 import '../log.dart' as log;
 import '../utils.dart';
 import 'build_environment.dart';
 import 'excluding_transformer.dart';
-
-/// A Dart script to run in an isolate.
-///
-/// This script serializes one or more transformers defined in a Dart library
-/// and marshals calls to and from them with the host isolate.
-const _TRANSFORMER_ISOLATE = """
-import 'dart:async';
-import 'dart:isolate';
-import 'dart:convert';
-import 'dart:mirrors';
-
-import '<<URL_BASE>>/packages/source_maps/span.dart';
-import '<<URL_BASE>>/packages/stack_trace/stack_trace.dart';
-import '<<URL_BASE>>/packages/barback/barback.dart';
-// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
-import '<<URL_BASE>>/packages/barback/src/internal_asset.dart';
-
-/// Sets up the initial communication with the host isolate.
-void main(_, SendPort replyTo) {
-  var port = new ReceivePort();
-  replyTo.send(port.sendPort);
-  port.first.then((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      var library = Uri.parse(message['library']);
-      var configuration = JSON.decode(message['configuration']);
-      var mode = new BarbackMode(message['mode']);
-      return initialize(library, configuration, mode).
-          map(_serializeTransformerOrGroup).toList();
-    });
-  });
-}
-
-/// Loads all the transformers and groups defined in [uri].
-///
-/// Loads the library, finds any Transformer or TransformerGroup subclasses in
-/// it, instantiates them with [configuration] and [mode], and returns them.
-Iterable initialize(Uri uri, Map configuration, BarbackMode mode) {
-  var mirrors = currentMirrorSystem();
-  var transformerClass = reflectClass(Transformer);
-  var groupClass = reflectClass(TransformerGroup);
-
-  // TODO(nweiz): if no valid transformers are found, throw an error message
-  // describing candidates and why they were rejected.
-  return mirrors.libraries[uri].declarations.values.map((declaration) {
-    if (declaration is! ClassMirror) return null;
-    var classMirror = declaration;
-    if (classMirror.isPrivate) return null;
-    if (classMirror.isAbstract) return null;
-    if (!classIsA(classMirror, transformerClass) &&
-        !classIsA(classMirror, groupClass)) {
-      return null;
-    }
-
-    var constructor = getConstructor(classMirror, 'asPlugin');
-    if (constructor == null) return null;
-    if (constructor.parameters.isEmpty) {
-      if (configuration.isNotEmpty) return null;
-      return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
-    }
-    if (constructor.parameters.length != 1) return null;
-
-    return classMirror.newInstance(const Symbol('asPlugin'),
-        [new BarbackSettings(configuration, mode)]).reflectee;
-  }).where((classMirror) => classMirror != null);
-}
-
-/// A wrapper for a [Transform] that's in the host isolate.
-///
-/// This retrieves inputs from and sends outputs and logs to the host isolate.
-class ForeignTransform implements Transform {
-  /// The port with which we communicate with the host isolate.
-  ///
-  /// This port and all messages sent across it are specific to this transform.
-  final SendPort _port;
-
-  final Asset primaryInput;
-
-  TransformLogger get logger => _logger;
-  TransformLogger _logger;
-
-  /// Creates a transform from a serializable map sent from the host isolate.
-  ForeignTransform(Map transform)
-      : _port = transform['port'],
-        primaryInput = deserializeAsset(transform['primaryInput']) {
-    _logger = new TransformLogger((assetId, level, message, span) {
-      _call(_port, {
-        'type': 'log',
-        'level': level.name,
-        'message': message,
-        'assetId': assetId == null ? null : _serializeId(assetId),
-        'span': span == null ? null : _serializeSpan(span)
-      });
-    });
-  }
-
-  Future<Asset> getInput(AssetId id) {
-    return _call(_port, {
-      'type': 'getInput',
-      'id': _serializeId(id)
-    }).then(deserializeAsset);
-  }
-
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
-
-  Stream<List<int>> readInput(AssetId id) =>
-      _futureStream(getInput(id).then((input) => input.read()));
-
-  void addOutput(Asset output) {
-    _call(_port, {
-      'type': 'addOutput',
-      'output': serializeAsset(output)
-    });
-  }
-}
-
-/// Returns the mirror for the root Object type.
-ClassMirror get objectMirror => reflectClass(Object);
-
-// TODO(nweiz): clean this up when issue 13248 is fixed.
-MethodMirror getConstructor(ClassMirror classMirror, String constructor) {
-  var name = new Symbol("\${MirrorSystem.getName(classMirror.simpleName)}"
-      ".\$constructor");
-  var candidate = classMirror.declarations[name];
-  if (candidate is MethodMirror && candidate.isConstructor) return candidate;
-  return null;
-}
-
-// TODO(nweiz): get rid of this when issue 12439 is fixed.
-/// Returns whether or not [mirror] is a subtype of [superclass].
-///
-/// This includes [superclass] being mixed in to or implemented by [mirror].
-bool classIsA(ClassMirror mirror, ClassMirror superclass) {
-  if (mirror == superclass) return true;
-  if (mirror == objectMirror) return false;
-  return classIsA(mirror.superclass, superclass) ||
-      mirror.superinterfaces.any((int) => classIsA(int, superclass));
-}
-
-/// Converts [transformerOrGroup] into a serializable map.
-Map _serializeTransformerOrGroup(transformerOrGroup) {
-  if (transformerOrGroup is Transformer) {
-    return _serializeTransformer(transformerOrGroup);
-  } else {
-    assert(transformerOrGroup is TransformerGroup);
-    return _serializeTransformerGroup(transformerOrGroup);
-  }
-}
-
-/// Converts [transformer] into a serializable map.
-Map _serializeTransformer(Transformer transformer) {
-  var port = new ReceivePort();
-  port.listen((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      if (message['type'] == 'isPrimary') {
-        return transformer.isPrimary(deserializeAsset(message['asset']));
-      } else {
-        assert(message['type'] == 'apply');
-
-        // Make sure we return null so that if the transformer's [apply] returns
-        // a non-serializable value it doesn't cause problems.
-        return transformer.apply(
-            new ForeignTransform(message['transform'])).then((_) => null);
-      }
-    });
-  });
-
-  return {
-    'type': 'Transformer',
-    'toString': transformer.toString(),
-    'port': port.sendPort
-  };
-}
-
-// Converts [group] into a serializable map.
-Map _serializeTransformerGroup(TransformerGroup group) {
-  return {
-    'type': 'TransformerGroup',
-    'toString': group.toString(),
-    'phases': group.phases.map((phase) {
-      return phase.map(_serializeTransformerOrGroup).toList();
-    }).toList()
-  };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Converts [span] into a serializable map.
-Map _serializeSpan(Span span) {
-  // TODO(nweiz): convert FileSpans to FileSpans.
-  return {
-    'type': 'fixed',
-    'sourceUrl': span.sourceUrl,
-    'start': _serializeLocation(span.start),
-    'text': span.text,
-    'isIdentifier': span.isIdentifier
-  };
-}
-
-/// Converts [location] into a serializable map.
-Map _serializeLocation(Location location) {
-  // TODO(nweiz): convert FileLocations to FileLocations.
-  return {
-    'type': 'fixed',
-    'sourceUrl': location.sourceUrl,
-    'offset': location.offset,
-    'line': location.line,
-    'column': location.column
-  };
-}
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
-  var replyTo = wrappedMessage['replyTo'];
-  new Future.sync(() => callback(wrappedMessage['message']))
-      .then((result) => replyTo.send({'type': 'success', 'value': result}))
-      .catchError((error, stackTrace) {
-    // TODO(nweiz): at least MissingInputException should be preserved here.
-    replyTo.send({
-      'type': 'error',
-      'error': CrossIsolateException.serialize(error, stackTrace)
-    });
-  });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
-  var receivePort = new ReceivePort();
-  port.send({
-    'message': message,
-    'replyTo': receivePort.sendPort
-  });
-
-  return receivePort.first.then((response) {
-    if (response['type'] == 'success') return response['value'];
-    assert(response['type'] == 'error');
-    return new Future.error(
-        new CrossIsolateException.deserialize(response['error']));
-  });
-}
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
-  /// The name of the type of exception thrown.
-  ///
-  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
-  /// that objects in different libraries may have the same type name.
-  final String type;
-
-  /// The exception's message, or its [toString] if it didn't expose a `message`
-  /// property.
-  final String message;
-
-  /// The exception's stack chain, or `null` if no stack chain was available.
-  final Chain stackTrace;
-
-  /// Loads a [CrossIsolateException] from a serialized representation.
-  ///
-  /// [error] should be the result of [CrossIsolateException.serialize].
-  CrossIsolateException.deserialize(Map error)
-      : type = error['type'],
-        message = error['message'],
-        stackTrace = error['stack'] == null ? null :
-            new Chain.parse(error['stack']);
-
-  /// Serializes [error] to an object that can safely be passed across isolate
-  /// boundaries.
-  static Map serialize(error, [StackTrace stack]) {
-    if (stack == null && error is Error) stack = error.stackTrace;
-    return {
-      'type': error.runtimeType.toString(),
-      'message': getErrorMessage(error),
-      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
-    };
-  }
-
-  String toString() => "\$message\\n\$stackTrace";
-}
-
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
-  error.toString().replaceFirst(_exceptionPrefix, '');
-
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes. If [future] completes to an
-/// error, the return value will emit that error and then close.
-Stream _futureStream(Future<Stream> future) {
-  var controller = new StreamController(sync: true);
-  future.then((stream) {
-    stream.listen(
-        controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  }).catchError((e, stackTrace) {
-    controller.addError(e, stackTrace);
-    controller.close();
-  });
-  return controller.stream;
-}
-
-Stream callbackStream(Stream callback()) {
-  var subscription;
-  var controller;
-  controller = new StreamController(onListen: () {
-    subscription = callback().listen(controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  },
-      onCancel: () => subscription.cancel(),
-      onPause: () => subscription.pause(),
-      onResume: () => subscription.resume(),
-      sync: true);
-  return controller.stream;
-}
-""";
+import 'server.dart';
 
 /// Load and return all transformers and groups from the library identified by
 /// [id].
-Future<Set> loadTransformers(BuildEnvironment environment, TransformerId id) {
+Future<Set> loadTransformers(BuildEnvironment environment,
+    BarbackServer transformerServer, TransformerId id) {
   return id.getAssetId(environment.barback).then((assetId) {
     var path = assetId.path.replaceFirst('lib/', '');
     // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
 
-    // We could load the transformers from any server, since they all serve the
-    // packages' library files. We choose the first one arbitrarily.
-    var baseUrl = baseUrlForAddress(environment.servers.first.address,
-                                    environment.servers.first.port);
-    var uri = '$baseUrl/packages/${id.package}/$path';
-    var code = 'import "$uri";\n' +
-        _TRANSFORMER_ISOLATE.replaceAll('<<URL_BASE>>', baseUrl);
+    var baseUrl = transformerServer.url;
+    var uri = baseUrl.resolve('packages/${id.package}/$path');
+    var code = """
+        import 'dart:isolate';
+
+        import '$uri';
+
+        import r'$baseUrl/packages/\$pub/transformer_isolate.dart';
+
+        void main(_, SendPort replyTo) => loadTransformers(replyTo);
+        """;
     log.fine("Loading transformers from $assetId");
 
     var port = new ReceivePort();
     return dart.runInIsolate(code, port.sendPort)
         .then((_) => port.first)
         .then((sendPort) {
-      return _call(sendPort, {
-        'library': uri,
+      return call(sendPort, {
+        'library': uri.toString(),
         'mode': environment.mode.name,
         // TODO(nweiz): support non-JSON-encodable configuration maps.
         'configuration': JSON.encode(id.configuration)
@@ -394,11 +59,11 @@
         return transformers;
       });
     }).catchError((error, stackTrace) {
-      if (error is! dart.CrossIsolateException) throw error;
+      if (error is! CrossIsolateException) throw error;
       if (error.type != 'IsolateSpawnException') throw error;
       // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
       // are fixed.
-      if (!error.message.split('\n')[1].startsWith('import "$uri";')) {
+      if (!error.message.split('\n')[1].endsWith("import '$uri';")) {
         throw error;
       }
 
@@ -427,16 +92,16 @@
         _toString = map['toString'];
 
   Future<bool> isPrimary(Asset asset) {
-    return _call(_port, {
+    return call(_port, {
       'type': 'isPrimary',
       'asset': serializeAsset(asset)
     });
   }
 
   Future apply(Transform transform) {
-    return _call(_port, {
+    return call(_port, {
       'type': 'apply',
-      'transform': _serializeTransform(transform)
+      'transform': serializeTransform(transform)
     });
   }
 
@@ -470,106 +135,3 @@
   assert(map['type'] == 'TransformerGroup');
   return new _ForeignGroup(id, map);
 }
-
-/// Converts [transform] into a serializable map.
-Map _serializeTransform(Transform transform) {
-  var receivePort = new ReceivePort();
-  receivePort.listen((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      if (message['type'] == 'getInput') {
-        return transform.getInput(_deserializeId(message['id']))
-            .then((asset) => serializeAsset(asset));
-      }
-
-      if (message['type'] == 'addOutput') {
-        transform.addOutput(deserializeAsset(message['output']));
-        return null;
-      }
-
-      assert(message['type'] == 'log');
-      var method;
-      if (message['level'] == 'Info') {
-        method = transform.logger.info;
-      } else if (message['level'] == 'Fine') {
-        method = transform.logger.fine;
-      } else if (message['level'] == 'Warning') {
-        method = transform.logger.warning;
-      } else {
-        assert(message['level'] == 'Error');
-        method = transform.logger.error;
-      }
-
-      var assetId = message['assetId'] == null ? null :
-        _deserializeId(message['assetId']);
-      var span = message['span'] == null ? null :
-        _deserializeSpan(message['span']);
-      method(message['message'], asset: assetId, span: span);
-    });
-  });
-
-  return {
-    'port': receivePort.sendPort,
-    'primaryInput': serializeAsset(transform.primaryInput)
-  };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts a serializable map into a [Span].
-Span _deserializeSpan(Map span) {
-  assert(span['type'] == 'fixed');
-  var location = _deserializeLocation(span['start']);
-  return new FixedSpan(span['sourceUrl'], location.offset, location.line,
-      location.column, text: span['text'], isIdentifier: span['isIdentifier']);
-}
-
-/// Converts a serializable map into a [Location].
-Location _deserializeLocation(Map location) {
-  assert(location['type'] == 'fixed');
-  return new FixedLocation(location['offset'], location['sourceUrl'],
-      location['line'], location['column']);
-}
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
-  var replyTo = wrappedMessage['replyTo'];
-  syncFuture(() => callback(wrappedMessage['message']))
-      .then((result) => replyTo.send({'type': 'success', 'value': result}))
-      .catchError((error, stackTrace) {
-    // TODO(nweiz): at least MissingInputException should be preserved here.
-    replyTo.send({
-      'type': 'error',
-      'error': dart.CrossIsolateException.serialize(error, stackTrace)
-    });
-  });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
-  var receivePort = new ReceivePort();
-  port.send({
-    'message': message,
-    'replyTo': receivePort.sendPort
-  });
-
-  return Chain.track(receivePort.first).then((response) {
-    if (response['type'] == 'success') return response['value'];
-    assert(response['type'] == 'error');
-    return new Future.error(
-        new dart.CrossIsolateException.deserialize(response['error']),
-        new Chain.current());
-  });
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 9e1d7b4..dd90b9f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -10,18 +10,32 @@
 import 'package:path/path.dart' as path;
 
 import '../package_graph.dart';
+import '../io.dart';
 
 /// An implementation of barback's [PackageProvider] interface so that barback
 /// can find assets within pub packages.
 class PubPackageProvider implements PackageProvider {
   final PackageGraph _graph;
+  final List<String> packages;
 
-  PubPackageProvider(this._graph);
-
-  Iterable<String> get packages => _graph.packages.keys;
+  PubPackageProvider(PackageGraph graph)
+      : _graph = graph,
+        packages = new List.from(graph.packages.keys)..add(r"$pub");
 
   Future<Asset> getAsset(AssetId id) {
-    var file = path.join(_graph.packages[id.package].dir, id.path);
+    if (id.package != r'$pub') {
+      var nativePath = path.fromUri(id.path);
+      var file = path.join(_graph.packages[id.package].dir, nativePath);
+      return new Future.value(new Asset.fromPath(id, file));
+    }
+
+    // "$pub" is a psuedo-package that allows pub's transformer-loading
+    // infrastructure to share code with pub proper.
+    var components = path.url.split(id.path);
+    assert(components.isNotEmpty);
+    assert(components.first == 'lib');
+    components[0] = 'dart';
+    var file = assetPath(path.joinAll(components));
     return new Future.value(new Asset.fromPath(id, file));
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/server.dart b/sdk/lib/_internal/pub/lib/src/barback/server.dart
index 983e0c9..fabaddc 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/server.dart
@@ -34,17 +34,21 @@
 
   /// The directory in the root which will serve as the root of this server as
   /// a native platform path.
+  ///
+  /// This may be `null` in which case no files in the root package can be
+  /// served and only assets in public directories ("packages" and "assets")
+  /// are available.
   final String rootDirectory;
 
-  /// The root directory as an asset-style ("/") path.
-  String get rootAssetPath => path.url.joinAll(path.split(rootDirectory));
-
   /// The server's port.
   final int port;
 
   /// The server's address.
   final InternetAddress address;
 
+  /// The server's base URL.
+  Uri get url => baseUrlForAddress(address, port);
+
   /// Optional callback to determine if an asset should be served.
   ///
   /// This can be set to allow outside code to filter out assets. Pub serve
@@ -70,6 +74,7 @@
   static Future<BarbackServer> bind(BuildEnvironment environment,
       String host, int port, String rootDirectory) {
     return Chain.track(HttpServer.bind(host, port)).then((server) {
+      log.fine('Bound "$rootDirectory" to $host:$port.');
       return new BarbackServer._(environment, server, rootDirectory);
     });
   }
@@ -87,7 +92,7 @@
   /// Closes this server.
   Future close() {
     var futures = [_server.close(), _resultsController.close()];
-    futures.addAll(_webSockets);
+    futures.addAll(_webSockets.map((socket) => socket.close()));
     return Future.wait(futures);
   }
 
@@ -98,6 +103,11 @@
     var id = specialUrlToId(url);
     if (id != null) return id;
 
+    if (rootDirectory == null) {
+      throw new FormatException(
+          "This server cannot serve out of the root directory. Got $url.");
+    }
+
     // Otherwise, it's a path in current package's [rootDirectory].
     var parts = path.url.split(url.path);
 
@@ -137,9 +147,10 @@
     }
 
     _logRequest(request, "Loading $id");
-    _environment.barback.getAssetById(id)
-        .then((asset) => _serveAsset(request, asset))
-        .catchError((error, trace) {
+    _environment.barback.getAssetById(id).then((result) {
+      _logRequest(request, "getAssetById($id) returned");
+      return result;
+    }).then((asset) => _serveAsset(request, asset)).catchError((error, trace) {
       if (error is! AssetNotFoundException) throw error;
       return _environment.barback.getAssetById(id.addExtension("/index.html"))
           .then((asset) {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
index 47ab14f..eeb804f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
@@ -8,11 +8,16 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 
+import '../log.dart' as log;
+import '../utils.dart';
 import 'build_environment.dart';
 
+import '../log.dart' as log;
+
 /// Implements the [WebSocket] API for communicating with a running pub serve
 /// process, mainly for use by the Editor.
 ///
@@ -57,7 +62,9 @@
   WebSocketApi(this._socket, this._environment) {
     _commands = {
       "urlToAssetId": _urlToAssetId,
-      "assetIdToUrls": _assetIdToUrls
+      "pathToUrls": _pathToUrls,
+      "serveDirectory": _serveDirectory,
+      "unserveDirectory": _unserveDirectory
     };
   }
 
@@ -68,8 +75,10 @@
   /// complete to `null`.
   Future listen() {
     return _socket.listen((data) {
-      try {
-        var command;
+      log.io("Web Socket command: $data");
+
+      var command;
+      return syncFuture(() {
         try {
           command = JSON.decode(data);
         } on FormatException catch (ex) {
@@ -93,24 +102,37 @@
               'Unknown command "${command["command"]}".');
         }
 
-        var response = handler(command);
-
+        return handler(command);
+      }).then((response) {
         // If the command has an ID, include it in the response.
         if (command.containsKey("id")) {
           response["id"] = command["id"];
         }
 
         _socket.add(JSON.encode(response));
-      } on _WebSocketException catch(ex) {
-        _socket.add(JSON.encode({"code": ex.code, "error": ex.message}));
-      } catch (ex, stack) {
-        // Catch any other errors and pipe them through the web socket.
-        _socket.add(JSON.encode({
-          "code": _ErrorCode.UNEXPECTED_ERROR,
-          "error": ex.toString(),
-          "stackTrace": new Chain.forTrace(stack).toString()
-        }));
-      }
+      }).catchError((error, [stackTrace]) {
+        var response;
+        if (error is _WebSocketException) {
+          response = {
+            "code": error.code,
+            "error": error.message
+          };
+        } else {
+          // Catch any other errors and pipe them through the web socket.
+          response = {
+            "code": _ErrorCode.UNEXPECTED_ERROR,
+            "error": error.toString(),
+            "stackTrace": new Chain.forTrace(stackTrace).toString()
+          };
+        }
+
+        // If the command has an ID, include it in the response.
+        if (command is Map && command.containsKey("id")) {
+          response["id"] = command["id"];
+        }
+
+        _socket.add(JSON.encode(response));
+      });
     }, cancelOnError: true).asFuture();
   }
 
@@ -133,6 +155,10 @@
   ///       "path": "web/index.html"
   ///     }
   ///
+  /// The "path" key in the result is a URL path that's relative to the root
+  /// directory of the package identified by "package". The location of this
+  /// package may vary depending on which source it was installed from.
+  ///
   /// An optional "line" key may be provided whose value must be an integer. If
   /// given, the result will also include a "line" key that maps the line in
   /// the served final file back to the corresponding source line in the asset
@@ -169,13 +195,11 @@
     // If a line number was given, map it to the output line.
     var line = _validateOptionalInt(command, "line");
 
-    // Find the server.
-    var server = _environment.servers.firstWhere(
-        (server) => server.address.host == url.host && server.port == url.port,
-        orElse: () => throw new _WebSocketException(_ErrorCode.NOT_SERVED,
-            '"${url.host}:${url.port}" is not being served by pub.'));
-
-    var id = server.urlToId(url);
+    var id = _environment.getAssetIdForUrl(url);
+    if (id == null) {
+      throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+          '"${url.host}:${url.port}" is not being served by pub.');
+    }
 
     // TODO(rnystrom): When this is hooked up to actually talk to barback to
     // see if assets exist, consider supporting implicit index.html at that
@@ -185,21 +209,22 @@
 
     // Map the line.
     // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using this
-    // API before we've fully implemented it. See #12339 and #16061.
+    // passes through the original line. This lets the editor start using
+    // this API before we've fully implemented it. See #12339 and #16061.
     if (line != null) result["line"] = line;
 
     return result;
   }
 
-  /// Given an asset ID in the root package, returns the URLs served by pub
-  /// that can be used to access that asset.
+  /// Given a path on the filesystem, returns the URLs served by pub that can be
+  /// used to access asset found at that path.
   ///
-  /// The command name is "assetIdToUrl" and it takes a "path" key for the
-  /// asset path being mapped:
+  /// The command name is "pathToUrls" and it takes a "path" key (a native OS
+  /// path which may be absolute or relative to the root directory of the
+  /// entrypoint package) for the path being mapped:
   ///
   ///     {
-  ///       "command": "assetIdToUrl",
+  ///       "command": "pathToUrls",
   ///       "path": "web/index.html"
   ///     }
   ///
@@ -210,6 +235,26 @@
   ///       "urls": ["http://localhost:8080/index.html"]
   ///     }
   ///
+  /// The "path" key may refer to a path in another package, either by referring
+  /// to its location within the top-level "packages" directory or by referring
+  /// to its location on disk. Only the "lib" and "asset" directories are
+  /// visible in other packages:
+  ///
+  ///     {
+  ///       "command": "assetIdToUrl",
+  ///       "path": "packages/http/http.dart"
+  ///     }
+  ///
+  /// Assets in the "lib" and "asset" directories will usually have one URL for
+  /// each server:
+  ///
+  ///     {
+  ///       "urls": [
+  ///         "http://localhost:8080/packages/http/http.dart",
+  ///         "http://localhost:8081/packages/http/http.dart"
+  ///       ]
+  ///     }
+  ///
   /// An optional "line" key may be provided whose value must be an integer. If
   /// given, the result will also include a "line" key that maps the line in
   /// the source file to the corresponding output line in the resulting asset
@@ -224,71 +269,130 @@
   /// If the asset is not in a directory being served by pub, returns an error:
   ///
   ///     example/index.html  -> NOT_SERVED error
-  ///
-  /// This cannot currently be used to access assets in other packages aside
-  /// from the root. Nor can it be used to access assets in the root package's
-  /// "lib" or "asset" directories.
-  ///
-  ///     lib/myapp.dart  -> BAD_ARGUMENT error
-  Map _assetIdToUrls(Map command) {
-    // TODO(rnystrom): Support assets in other packages. See #17146.
+  Map _pathToUrls(Map command) {
     var assetPath = _validateString(command, "path");
-
-    if (!path.url.isRelative(assetPath)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"path" must be a relative path. Got "$assetPath".');
-    }
-
-    if (!path.url.isWithin(".", assetPath)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"path" cannot reach out of its containing directory. '
-          'Got "$assetPath".');
-    }
-
     var line = _validateOptionalInt(command, "line");
 
-    // Find all of the servers whose root directories contain the asset and
-    // generate appropriate URLs for each.
-    var urls = _environment.servers
-        .where((server) => path.url.isWithin(server.rootAssetPath, assetPath))
-        .map((server) =>
-            "http://${server.address.host}:${server.port}/" +
-            path.url.relative(assetPath, from: server.rootAssetPath))
-        .toList();
-
+    var urls = _environment.getUrlsForAssetPath(assetPath);
     if (urls.isEmpty) {
       throw new _WebSocketException(_ErrorCode.NOT_SERVED,
           'Asset path "$assetPath" is not currently being served.');
     }
 
-    var result = {"urls": urls};
+    var result = {"urls": urls.map((url) => url.toString()).toList()};
 
     // Map the line.
     // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using this
-    // API before we've fully implemented it. See #12339 and #16061.
+    // passes through the original line. This lets the editor start using
+    // this API before we've fully implemented it. See #12339 and #16061.
     if (line != null) result["line"] = line;
 
     return result;
   }
 
+  /// Given a relative directory path within the entrypoint package, binds a
+  /// new port to serve from that path and returns its URL.
+  ///
+  /// The command name is "serveDirectory" and it takes a "path" key (a native
+  /// OS path relative to the root of the entrypoint package) for the directory
+  /// being served:
+  ///
+  ///     {
+  ///       "command": "serveDirectory",
+  ///       "path": "example/awesome"
+  ///     }
+  ///
+  /// If successful, it returns a map containing the URL that can be used to
+  /// access the directory.
+  ///
+  ///     {
+  ///       "url": "http://localhost:8083"
+  ///     }
+  ///
+  /// If the directory is already being served, returns the previous URL.
+  Future<Map> _serveDirectory(Map command) {
+    var rootDirectory = _validateRelativePath(command, "path");
+    return _environment.serveDirectory(rootDirectory).then((server) {
+      return {
+        "url": server.url.toString()
+      };
+    });
+  }
+
+  /// Given a relative directory path within the entrypoint package, unbinds
+  /// the server previously bound to that directory and returns its (now
+  /// unreachable) URL.
+  ///
+  /// The command name is "unserveDirectory" and it takes a "path" key (a
+  /// native OS path relative to the root of the entrypoint package) for the
+  /// directory being unserved:
+  ///
+  ///     {
+  ///       "command": "unserveDirectory",
+  ///       "path": "example/awesome"
+  ///     }
+  ///
+  /// If successful, it returns a map containing the URL that used to be used
+  /// to access the directory.
+  ///
+  ///     {
+  ///       "url": "http://localhost:8083"
+  ///     }
+  ///
+  /// If no server is bound to that directory, it returns a `NOT_SERVED` error.
+  Future<Map> _unserveDirectory(Map command) {
+    var rootDirectory = _validateRelativePath(command, "path");
+    return _environment.unserveDirectory(rootDirectory).then((url) {
+      if (url == null) {
+        throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+            'Directory "$rootDirectory" is not bound to a server.');
+      }
+
+      return {"url": url.toString()};
+    });
+  }
+
   /// Validates that [command] has a field named [key] whose value is a string.
   ///
   /// Returns the string if found, or throws a [_WebSocketException] if
   /// validation failed.
-  String _validateString(Map command, String key) {
-    if (!command.containsKey(key)) {
+  String _validateString(Map command, String key, {bool optional: false}) {
+    if (!optional && !command.containsKey(key)) {
       throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
           'Missing "$key" argument.');
     }
 
     var field = command[key];
     if (field is String) return field;
+    if (field == null && optional) return null;
 
     throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
         '"$key" must be a string. Got ${JSON.encode(field)}.');
   }
 
+  /// Validates that [command] has a field named [key] whose value is a string
+  /// containing a relative path that doesn't reach out of the entrypoint
+  /// package's root directory.
+  ///
+  /// Returns the path if found, or throws a [_WebSocketException] if
+  /// validation failed.
+  String _validateRelativePath(Map command, String key) {
+    var pathString = _validateString(command, key);
+
+    if (!path.isRelative(pathString)) {
+      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+          '"$key" must be a relative path. Got "$pathString".');
+    }
+
+    if (!path.isWithin(".", pathString)) {
+      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+          '"$key" cannot reach out of its containing directory. '
+          'Got "$pathString".');
+    }
+
+    return pathString;
+  }
+
   /// Validates that if [command] has a field named [key], then its value is a
   /// number.
   ///
@@ -306,7 +410,9 @@
 }
 
 /// Function for processing a single web socket command.
-typedef Map _CommandHandler(Map command);
+///
+/// It can return a [Map] or a [Future] that completes to one.
+typedef _CommandHandler(Map command);
 
 /// Web socket API error codenames.
 class _ErrorCode {
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index d57be72..d7a6e8e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -27,7 +27,7 @@
 /// Handles the `build` pub command.
 class BuildCommand extends PubCommand {
   String get description => "Apply transformers to build a package.";
-  String get usage => "pub build [options]";
+  String get usage => "pub build [options] [directories...]";
   List<String> get aliases => const ["deploy", "settle-up"];
   bool get takesArguments => true;
 
@@ -62,6 +62,7 @@
     _parseBuildDirectories();
     cleanDir(target);
 
+    var environment;
     var errorsJson = [];
     var logJson = [];
 
@@ -69,9 +70,17 @@
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
     return BuildEnvironment.create(entrypoint, "127.0.0.1", 0, mode,
-        WatcherType.NONE, buildDirectories, useDart2JS: true)
-          .then((environment) {
+        WatcherType.NONE, useDart2JS: true)
+          .then((env) {
+      environment = env;
 
+      // Register all of the build directories.
+      // TODO(rnystrom): We don't actually need to bind servers for these, we
+      // just need to add them to barback's sources. Add support to
+      // BuildEnvironment for going the latter without the former.
+      return Future.wait(buildDirectories.map(
+          (dir) => environment.serveDirectory(dir)));
+    }).then((_) {
       // Show in-progress errors, but not results. Those get handled implicitly
       // by getAllAssets().
       environment.barback.errors.listen((error) {
@@ -285,7 +294,7 @@
     var entrypointDirs = entrypoints
         // Convert the asset path to a native-separated one and get the
         // directory containing the entrypoint.
-        .map((id) => path.dirname(path.joinAll(path.url.split(id.path))))
+        .map((id) => path.dirname(path.fromUri(id.path)))
         // Don't copy files to the top levels of the build directories since
         // the normal lib asset copying will take care of that.
         .where((dir) => dir.contains(path.separator))
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 9bf6876..f43cc3a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -39,6 +39,10 @@
   /// The build mode.
   BarbackMode get mode => new BarbackMode(commandOptions['mode']);
 
+  /// This completer is used to keep pub running (by not completing) and to
+  /// pipe fatal errors to pub's top-level error-handling machinery.
+  final _completer = new Completer();
+
   ServeCommand() {
     commandParser.addOption('port', defaultsTo: '8080',
         help: 'The base port to listen on.');
@@ -68,82 +72,98 @@
       return flushThenExit(exit_codes.USAGE);
     }
 
+    var directories = _parseDirectoriesToServe();
+
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
     return BuildEnvironment.create(entrypoint, hostname, port, mode,
-        watcherType, _directoriesToServe,
-        useDart2JS: useDart2JS).then((environment) {
+        watcherType, useDart2JS: useDart2JS).then((environment) {
 
-      // In release mode, strip out .dart files since all relevant ones have
-      // been compiled to JavaScript already.
-      if (mode == BarbackMode.RELEASE) {
-        for (var server in environment.servers) {
-          server.allowAsset = (url) => !url.path.endsWith(".dart");
-        }
-      }
-
-      /// This completer is used to keep pub running (by not completing) and
-      /// to pipe fatal errors to pub's top-level error-handling machinery.
-      var completer = new Completer();
-
-      environment.barback.errors.listen((error) {
-        log.error(log.red("Build error:\n$error"));
-      });
-
-      environment.barback.results.listen((result) {
-        if (result.succeeded) {
-          // TODO(rnystrom): Report using growl/inotify-send where available.
-          log.message("Build completed ${log.green('successfully')}");
-        } else {
-          log.message("Build completed with "
-              "${log.red(result.errors.length)} errors.");
-        }
-      }, onError: (error, [stackTrace]) {
-        if (!completer.isCompleted) completer.completeError(error, stackTrace);
-      });
-
-      var directoryLength = environment.servers
-          .map((server) => server.rootDirectory.length)
+      var directoryLength = directories.map((dir) => dir.length)
           .reduce(math.max);
-      for (var server in environment.servers) {
-        // Add two characters to account for "[" and "]".
-        var directoryPrefix = log.gray(
-            padRight("[${server.rootDirectory}]", directoryLength + 2));
-        server.results.listen((result) {
-          if (result.isSuccess) {
-            log.message("$directoryPrefix ${log.green('GET')} "
-                "${result.url.path} $_arrow ${result.id}");
-            return;
-          }
 
-          var msg = "$directoryPrefix ${log.red('GET')} ${result.url.path} "
-              "$_arrow";
-          var error = result.error.toString();
-          if (error.contains("\n")) {
-            log.message("$msg\n${prefixLines(error)}");
-          } else {
-            log.message("$msg $error");
-          }
-        }, onError: (error, [stackTrace]) {
-          if (completer.isCompleted) return;
-          completer.completeError(error, stackTrace);
+      // Start up the servers. We pause updates while this is happening so that
+      // we don't log spurious build results in the middle of listing out the
+      // bound servers.
+      environment.pauseUpdates();
+      return Future.forEach(directories, (directory) {
+        return _startServer(environment, directory, directoryLength);
+      }).then((_) {
+        // Now that the servers are up and logged, send them to barback.
+        environment.barback.errors.listen((error) {
+          log.error(log.red("Build error:\n$error"));
         });
 
-        log.message("Serving ${entrypoint.root.name} "
-            "${padRight(server.rootDirectory, directoryLength)} "
-            "on ${log.bold('http://$hostname:${server.port}')}");
-      }
+        environment.barback.results.listen((result) {
+          if (result.succeeded) {
+            // TODO(rnystrom): Report using growl/inotify-send where available.
+            log.message("Build completed ${log.green('successfully')}");
+          } else {
+            log.message("Build completed with "
+                "${log.red(result.errors.length)} errors.");
+          }
+        }, onError: (error, [stackTrace]) {
+          if (!_completer.isCompleted) {
+            _completer.completeError(error, stackTrace);
+          }
+        });
 
-      return completer.future;
+        environment.resumeUpdates();
+        return _completer.future;
+      });
     });
   }
 
-  /// Returns the set of directories that will be served from servers exposed to
-  /// the user.
+  Future _startServer(BuildEnvironment environment, String rootDirectory,
+      int directoryLength) {
+    return environment.serveDirectory(rootDirectory).then((server) {
+      // In release mode, strip out .dart files since all relevant ones have
+      // been compiled to JavaScript already.
+      if (mode == BarbackMode.RELEASE) {
+        server.allowAsset = (url) => !url.path.endsWith(".dart");
+      }
+
+      // Add two characters to account for "[" and "]".
+      var prefix = log.gray(
+          padRight("[${server.rootDirectory}]", directoryLength + 2));
+
+      server.results.listen((result) {
+        var buffer = new StringBuffer();
+        buffer.write("$prefix ");
+
+        if (result.isSuccess) {
+          buffer.write(
+              "${log.green('GET')} ${result.url.path} $_arrow ${result.id}");
+        } else {
+          buffer.write("${log.red('GET')} ${result.url.path} $_arrow");
+
+          var error = result.error.toString();
+          if (error.contains("\n")) {
+            buffer.write("\n${prefixLines(error)}");
+          } else {
+            buffer.write(" $error");
+          }
+        }
+
+        log.message(buffer);
+
+      }, onError: (error, [stackTrace]) {
+        if (_completer.isCompleted) return;
+        _completer.completeError(error, stackTrace);
+      });
+
+      log.message("Serving ${entrypoint.root.name} "
+          "${padRight(server.rootDirectory, directoryLength)} "
+          "on ${log.bold('http://$hostname:${server.port}')}");
+    });
+  }
+
+  /// Returns the set of directories that will be served from servers exposed
+  /// to the user.
   ///
   /// Throws a [UsageException] if the command-line arguments are invalid.
-  List<String> get _directoriesToServe {
+  List<String> _parseDirectoriesToServe() {
     if (commandOptions.rest.isEmpty) {
       var directories = ['web', 'test'].where(dirExists).toList();
       if (directories.isNotEmpty) return directories;
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 530c798..9e84360 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -16,6 +16,7 @@
 import '../../../compiler/implementation/filenames.dart'
     show appendSlash;
 
+import '../../asset/dart/serialize.dart';
 import 'io.dart';
 import 'sdk.dart' as sdk;
 import 'utils.dart';
@@ -170,44 +171,3 @@
     });
   });
 }
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
-  /// The name of the type of exception thrown.
-  ///
-  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
-  /// that objects in different libraries may have the same type name.
-  final String type;
-
-  /// The exception's message, or its [toString] if it didn't expose a `message`
-  /// property.
-  final String message;
-
-  /// The exception's stack chain, or `null` if no stack chain was available.
-  final Chain stackTrace;
-
-  /// Loads a [CrossIsolateException] from a serialized representation.
-  ///
-  /// [error] should be the result of [CrossIsolateException.serialize].
-  CrossIsolateException.deserialize(Map error)
-      : type = error['type'],
-        message = error['message'],
-        stackTrace = error['stack'] == null ? null :
-            new Chain.parse(error['stack']);
-
-  /// Serializes [error] to an object that can safely be passed across isolate
-  /// boundaries.
-  static Map serialize(error, [StackTrace stack]) {
-    if (stack == null && error is Error) stack = error.stackTrace;
-    return {
-      'type': error.runtimeType.toString(),
-      'message': getErrorMessage(error),
-      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
-    };
-  }
-
-  String toString() => "$message\n$stackTrace";
-}
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index e05713d..fd5af92 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -398,13 +398,13 @@
 bool get runningFromSdk => Platform.script.path.endsWith('.snapshot');
 
 /// Resolves [target] relative to the path to pub's `resource` directory.
-String resourcePath(String target) {
+String assetPath(String target) {
   if (runningFromSdk) {
     return path.join(
-        sdk.rootDirectory, 'lib', '_internal', 'pub', 'resource', target);
+        sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target);
   } else {
     return path.join(
-        path.dirname(libraryPath('pub.io')), '..', '..', 'resource', target);
+        path.dirname(libraryPath('pub.io')), '..', '..', 'asset', target);
   }
 }
 
@@ -722,7 +722,7 @@
 }
 
 String get pathTo7zip {
-  if (runningFromSdk) return resourcePath(path.join('7zip', '7za.exe'));
+  if (runningFromSdk) return assetPath(path.join('7zip', '7za.exe'));
   return path.join(repoRoot, 'third_party', '7zip', '7za.exe');
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 07a1195..0b93b3f 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -13,6 +13,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import 'io.dart';
+import 'progress.dart';
 import 'transcript.dart';
 import 'utils.dart';
 
@@ -36,12 +37,8 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// The timer used to write "..." during a progress log.
-Timer _progressTimer;
-
-/// The progress message as it's being incrementally appended. When the
-/// progress is done, a single entry will be added to the log for it.
-String _progressMessage;
+/// The currently-running progress indicator or `null` if there is none.
+Progress _progress;
 
 final _cyan = getSpecial('\u001b[36m');
 final _green = getSpecial('\u001b[32m');
@@ -224,23 +221,30 @@
   stderr.writeln('---- End log transcript ----');
 }
 
-/// Prints [message] then slowly prints additional "..." after it until the
-/// future returned by [callback] completes. If anything else is logged during
-/// this, it cancels the progress.
+/// Prints [message] then displays an updated elapsed time until the future
+/// returned by [callback] completes. If anything else is logged during this
+/// (include another call to [progress]) that cancels the progress.
 Future progress(String message, Future callback()) {
-  if (json.enabled) return callback();
+  _stopProgress();
+  _progress = new Progress(message);
+  return callback().whenComplete(() {
+    var message = _stopProgress();
 
-  if (_progressTimer != null) throw new StateError("Already in progress.");
-
-  _progressMessage = '$message...';
-  stdout.write(_progressMessage);
-
-  _progressTimer = new Timer.periodic(new Duration(milliseconds: 500), (_) {
-    stdout.write('.');
-    _progressMessage += '.';
+    // Add the progress message to the transcript.
+    if (_transcript != null && message != null) {
+      _transcript.add(new Entry(Level.MESSAGE, [message]));
+    }
   });
+}
 
-  return callback().whenComplete(_stopProgress);
+/// Stops the running progress indicator, if currently running.
+///
+/// Returns the final progress message, if any, otherwise `null`.
+String _stopProgress() {
+  if (_progress == null) return null;
+  var message = _progress.stop();
+  _progress = null;
+  return message;
 }
 
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
@@ -287,23 +291,6 @@
 /// do not prevent the user's goal from being reached.
 String yellow(text) => "$_yellow$text$_none";
 
-/// Stops the running progress indicator, if currently running.
-_stopProgress() {
-  if (_progressTimer == null) return;
-
-  // Stop the timer.
-  _progressTimer.cancel();
-  _progressTimer = null;
-  stdout.writeln();
-
-  // Add the progress message to the transcript.
-  if (_transcript != null) {
-    _transcript.add(new Entry(Level.MESSAGE, [_progressMessage]));
-  }
-
-  _progressMessage = null;
-}
-
 /// Sets the verbosity to "normal", which shows errors, warnings, and messages.
 void showNormal() {
   _loggers[Level.ERROR]   = _logToStderr;
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
new file mode 100644
index 0000000..059d480
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -0,0 +1,86 @@
+// 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.progress;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'log.dart' as log;
+
+/// A live-updating progress indicator for long-running log entries.
+class Progress {
+  /// The timer used to write "..." during a progress log.
+  Timer _timer;
+
+  /// The [Stopwatch] used to track how long a progress log has been running.
+  final _stopwatch = new Stopwatch();
+
+  /// The progress message as it's being incrementally appended. When the
+  /// progress is done, a single entry will be added to the log for it.
+  final String _message;
+
+  Progress(this._message) {
+    _stopwatch.start();
+
+    if (log.json.enabled) return;
+
+    // Only animate if we're writing to a TTY in human format.
+    if (stdioType(stdout) == StdioType.TERMINAL) {
+      _update();
+      _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
+        _update();
+      });
+    } else {
+      stdout.write("$_message... ");
+    }
+  }
+
+  /// Stops the progress indicator.
+  ///
+  /// Returns the complete final progress message.
+  String stop() {
+    _stopwatch.stop();
+
+    // If we aren't animating, just log the final time.
+    if (log.json.enabled) {
+      // Do nothing.
+    } else if (_timer == null) {
+      stdout.writeln(_time);
+    } else {
+      _timer.cancel();
+
+      // Show one final update.
+      _update();
+      stdout.writeln();
+    }
+
+    return "$_message... ${_time}";
+  }
+
+  /// Gets the current progress time as a parenthesized, formatted string.
+  String get _time {
+    var elapsed = _stopwatch.elapsed;
+    var time = "(";
+
+    // TODO(rnystrom): Move this somewhere reusable.
+    if (elapsed.inMinutes > 0) {
+      time += "${elapsed.inMinutes}:";
+    }
+
+    var s = elapsed.inSeconds % 59;
+    var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
+    return time + "$s.${ms}s)";
+  }
+
+  /// Refreshes the progress line.
+  void _update() {
+    stdout.write("\r$_message... ");
+
+    // Show the time only once it gets noticeably long.
+    if (_stopwatch.elapsed.inSeconds > 0) {
+      stdout.write(log.gray(_time));
+    }
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 2584bc4..afdf94f 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -18,7 +18,9 @@
 import 'package:path/path.dart' as path;
 import "package:stack_trace/stack_trace.dart";
 
-import 'dart.dart';
+import '../../asset/dart/serialize.dart';
+
+export '../../asset/dart/utils.dart';
 
 /// A pair of values.
 class Pair<E, F> {
@@ -78,53 +80,6 @@
   Future<List> get future => _completer.future;
 }
 
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes.
-///
-/// If [future] completes to an error, the return value will emit that error and
-/// then close.
-///
-/// If [broadcast] is true, a broadcast stream is returned. This assumes that
-/// the stream returned by [future] will be a broadcast stream as well.
-/// [broadcast] defaults to false.
-Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
-  var subscription;
-  var controller;
-
-  future = future.catchError((e, stackTrace) {
-    // Since [controller] is synchronous, it's likely that emitting an error
-    // will cause it to be cancelled before we call close.
-    if (controller != null) controller.addError(e, stackTrace);
-    if (controller != null) controller.close();
-    controller = null;
-  });
-
-  onListen() {
-    future.then((stream) {
-      if (controller == null) return;
-      subscription = stream.listen(
-          controller.add,
-          onError: controller.addError,
-          onDone: controller.close);
-    });
-  }
-
-  onCancel() {
-    if (subscription != null) subscription.cancel();
-    subscription = null;
-    controller = null;
-  }
-
-  if (broadcast) {
-    controller = new StreamController.broadcast(
-        sync: true, onListen: onListen, onCancel: onCancel);
-  } else {
-    controller = new StreamController(
-        sync: true, onListen: onListen, onCancel: onCancel);
-  }
-  return controller.stream;
-}
-
 /// Like [new Future], but avoids around issue 11911 by using [new Future.value]
 /// under the covers.
 Future newFuture(callback()) => new Future.value().then((_) => callback());
@@ -233,14 +188,14 @@
 /// Creates a URL string for [address]:[port].
 ///
 /// Handles properly formatting IPv6 addresses.
-String baseUrlForAddress(InternetAddress address, int port) {
+Uri baseUrlForAddress(InternetAddress address, int port) {
   // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
   // URL ambiguity with the ":" in the address.
   if (address.type == InternetAddressType.IP_V6) {
-    return "http://[${address.address}]:$port";
+    return new Uri(scheme: "http", host: "[${address.address}]", port: port);
   }
 
-  return "http://${address.address}:$port";
+  return new Uri(scheme: "http", host: address.address, port: port);
 }
 
 /// Flattens nested lists inside an iterable into a single list containing only
@@ -523,25 +478,6 @@
   return controller.stream;
 }
 
-/// Returns a [Stream] that will emit the same values as the stream returned by
-/// [callback].
-///
-/// [callback] will only be called when the returned [Stream] gets a subscriber.
-Stream callbackStream(Stream callback()) {
-  var subscription;
-  var controller;
-  controller = new StreamController(onListen: () {
-    subscription = callback().listen(controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  },
-      onCancel: () => subscription.cancel(),
-      onPause: () => subscription.pause(),
-      onResume: () => subscription.resume(),
-      sync: true);
-  return controller.stream;
-}
-
 /// A regular expression matching a trailing CR character.
 final _trailingCR = new RegExp(r"\r$");
 
@@ -828,17 +764,6 @@
   return buffer.toString();
 }
 
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
-  error.toString().replaceFirst(_exceptionPrefix, '');
-
 /// An exception class for exceptions that are intended to be seen by the user.
 /// These exceptions won't have any debugging information printed when they're
 /// thrown.
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 35bb8c3..084cf7e 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -4,8 +4,13 @@
 
 test/hosted/version_negotiation_test: Pass, Timeout # Issue 14346
 
+
+[ $runtime == vm && $system == macos ]
+test/serve/web_socket/path_to_urls_test: Skip # Issue 17601
+
 [ $runtime == vm && $system == windows ]
 test/serve/warns_on_assets_paths_test: Pass, Fail # Issue 15741
+test/transformer/can_log_messages_test: Pass, Fail # Issue 17603 
 
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
diff --git a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
index 3f3868c..37413b5 100644
--- a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
+++ b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
@@ -18,7 +18,7 @@
         error: '''
             Build directory names are not allowed if "--all" is passed.
 
-            Usage: pub build [options]
+            Usage: pub build [options] [directories...]
             -h, --help      Print usage information for this command.
                 --format    How output should be displayed.
                             [text (default), json]
diff --git a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
index bd0db68..e899b41 100644
--- a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
@@ -30,6 +30,7 @@
     ]).create();
 
     var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Loading source assets..."));
     pub.stdout.expect(startsWith("Building myapp..."));
 
     var consumeFile = consumeThrough(inOrder([
diff --git a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
index 73b2b65..8ecc742 100644
--- a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
@@ -17,7 +17,7 @@
             Unsupported build directories "bar" and "foo".
             The allowed directories are "benchmark", "bin", "example", "test" and "web".
 
-            Usage: pub build [options]
+            Usage: pub build [options] [directories...]
             -h, --help      Print usage information for this command.
                 --format    How output should be displayed.
                             [text (default), json]
diff --git a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
index e549750..76d00e9 100644
--- a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
@@ -32,7 +32,7 @@
       request.response.close();
     });
 
-    pub.stdout.expect(matches(r'Uploading\.\.\.+'));
+    pub.stdout.expect(startsWith('Uploading...'));
     pub.stdout.expect('Package test_pkg 1.0.0 uploaded!');
     pub.shouldExit(exit_codes.SUCCESS);
   });
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index a96f273..e127999 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -5,6 +5,7 @@
 import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -32,7 +33,7 @@
     });
 
     pub.stderr.expect('OAuth2 authorization failed (your token sucks).');
-    pub.stdout.expect('Uploading...');
+    pub.stdout.expect(startsWith('Uploading...'));
     pub.kill();
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 9de35b3..a830da4 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -150,6 +150,9 @@
     _pubServer.stdout.expect(consumeThrough("Got dependencies!"));
   }
 
+  _pubServer.stdout.expect(startsWith("Loading source assets..."));
+  _pubServer.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+
   // The server should emit one or more ports.
   _pubServer.stdout.expect(
       consumeWhile(predicate(_parsePort, 'emits server url')));
@@ -236,6 +239,17 @@
   }, "request $urlPath");
 }
 
+/// Schedules an HTTP request to the (theoretically) running pub server with
+/// [urlPath] and verifies that it cannot be connected to.
+///
+/// [root] indicates which server should be accessed, and defaults to "web".
+void requestShouldNotConnect(String urlPath, {String root}) {
+  schedule(() {
+    return expect(http.get(_getServerUrlSync(root, urlPath)),
+        throwsA(new isInstanceOf<SocketException>()));
+  }, "request $urlPath");
+}
+
 /// Reads lines from pub serve's stdout until it prints the build success
 /// message.
 ///
@@ -270,19 +284,21 @@
 ///
 /// Only one of [replyEquals] or [replyMatches] may be provided.
 ///
-/// [request] and [replyMatches] may contain futures, in which case this will
-/// wait until they've completed before matching.
+/// [request], [replyEquals], and [replyMatches] may contain futures, in which
+/// case this will wait until they've completed before matching.
 ///
 /// If [encodeRequest] is `false`, then [request] will be sent as-is over the
 /// socket. It omitted, request is JSON encoded to a string first.
-void expectWebSocketCall(request, {Map replyEquals, replyMatches,
+///
+/// Returns a [Future] that completes to the call's response.
+Future<Map> expectWebSocketCall(request, {Map replyEquals, replyMatches,
     bool encodeRequest: true}) {
   assert((replyEquals == null) != (replyMatches == null));
 
-  schedule(() => _ensureWebSocket().then((_) {
+  return schedule(() => _ensureWebSocket().then((_) {
     var matcherFuture;
     if (replyMatches != null) {
-      matcherFuture = new Future.value(replyMatches);
+      matcherFuture = awaitObject(replyMatches);
     } else {
       matcherFuture = awaitObject(replyEquals).then((reply) => equals(reply));
     }
@@ -293,7 +309,9 @@
         _webSocket.add(completeRequest);
 
         return _webSocketBroadcastStream.first.then((value) {
-          expect(JSON.decode(value), matcher);
+          value = JSON.decode(value);
+          expect(value, matcher);
+          return value;
         });
       });
     });
@@ -309,6 +327,14 @@
 Future<String> getServerUrl([String root, String path]) =>
     _portsCompleter.future.then((_) => _getServerUrlSync(root, path));
 
+/// Records that [root] has been bound to [port].
+///
+/// Used for testing the Web Socket API for binding new root directories to
+/// ports after pub serve has been started.
+registerServerPort(String root, int port) {
+  _ports[root] = port;
+}
+
 /// Returns a URL string for the server serving [path] from [root].
 ///
 /// If [root] is omitted, defaults to "web". If [path] is omitted, no path is
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
deleted file mode 100644
index f438c78..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2014, 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 file.
-
-library pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("assetIdToUrls errors on bad inputs", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.file("top-level.txt", "top-level"),
-      d.dir("asset", [
-        d.file("foo.txt", "foo"),
-      ]),
-      d.dir("bin", [
-        d.file("foo.txt", "foo"),
-      ]),
-      d.dir("lib", [
-        d.file("myapp.dart", "myapp"),
-      ])
-    ]).create();
-
-    pubServe();
-
-    // Bad arguments.
-    expectWebSocketCall({
-      "command": "assetIdToUrls"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": 'Missing "path" argument.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": 123
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"path" must be a string. Got 123.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "/absolute.txt"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"path" must be a relative path. Got "/absolute.txt".'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "a/../../bad.txt"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error":
-          '"path" cannot reach out of its containing directory. '
-          'Got "a/../../bad.txt".'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "main.dart",
-      "line": 12.34
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"line" must be an integer. Got 12.34.'
-    });
-
-    // Unserved directories.
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "bin/foo.txt"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "bin/foo.txt" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "lib/myapp.dart"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "lib/myapp.dart" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "asset/myapp.dart"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "asset/myapp.dart" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "nope/foo.txt"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "nope/foo.txt" is not currently being served.'
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
deleted file mode 100644
index 6b02fb0..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2014, 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 file.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("assetIdToUrls converts asset ids to matching URL paths", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("test", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("randomdir", [
-        d.file("index.html", "<body>")
-      ])
-    ]).create();
-
-    pubServe(args: ["test", "web", "randomdir"]);
-
-    schedule(() {
-      // Paths in web/.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/index.html"
-      }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
-
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/sub/bar.html"
-      }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
-
-      // Paths in test/.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "test/index.html"
-      }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
-
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "test/sub/bar.html"
-      }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
-
-      // A non-default directory.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "randomdir/index.html"
-      }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
index 12bc06f..4adbd23 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
@@ -11,26 +11,20 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("an error includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "bad command",
+      "id": "some id"
+    }, replyMatches: containsPair("id", "some id"));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
new file mode 100644
index 0000000..ac77a1c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  // TODO(rnystrom): Split into independent tests.
+  initConfig();
+  integration("pathToUrls errors on bad inputs", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+      d.file("top-level.txt", "top-level"),
+      d.dir("asset", [
+        d.file("foo.txt", "foo"),
+      ]),
+      d.dir("bin", [
+        d.file("foo.txt", "foo"),
+      ]),
+      d.dir("lib", [
+        d.file("myapp.dart", "myapp"),
+      ])
+    ]).create();
+
+    pubServe(shouldGetFirst: true);
+
+    // Bad arguments.
+    expectWebSocketCall({
+      "command": "pathToUrls"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": "main.dart",
+      "line": 12.34
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"line" must be an integer. Got 12.34.'
+    });
+
+    // Unserved directories.
+    expectNotServed(p.join('bin', 'foo.txt'));
+    expectNotServed(p.join('nope', 'foo.txt'));
+    expectNotServed(p.join("..", "bar", "lib", "bar.txt"));
+    expectNotServed(p.join("..", "foo", "web", "foo.txt"));
+
+    endPubServe();
+  });
+}
+
+void expectNotServed(String path) {
+  expectWebSocketCall({
+    "command": "pathToUrls",
+    "path": path
+  }, replyEquals: {
+    "code": "NOT_SERVED",
+    "error": 'Asset path "$path" is not currently being served.'
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
index c5e35df..d31bf9d 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
@@ -14,7 +14,7 @@
 main() {
   // TODO(rnystrom): Split into independent tests.
   initConfig();
-  integration("assetIdToUrls returns multiple urls if servers overlap", () {
+  integration("pathToUrls returns multiple urls if servers overlap", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("test", [
@@ -32,8 +32,8 @@
 
     schedule(() {
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/index.html"
+        "command": "pathToUrls",
+        "path": path.join("web", "index.html")
       }, replyEquals: {
         "urls": [
           getServerUrl("web", "index.html")
@@ -41,8 +41,8 @@
       });
 
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/sub/bar.html"
+        "command": "pathToUrls",
+        "path": path.join("web", "sub", "bar.html")
       }, replyEquals: {
         "urls": [
           getServerUrl("web", "sub/bar.html"),
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
index 12bc06f..f7db59e 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
@@ -4,33 +4,30 @@
 
 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';
 import '../utils.dart';
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("pathToUrls includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "id": "some id",
+      "path": p.join("web", "index.html")
+    }, replyMatches: containsPair("id", "some id"));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
new file mode 100644
index 0000000..ce6b620
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, 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 file.
+
+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';
+import '../utils.dart';
+
+main() {
+  // TODO(rnystrom): Split into independent tests.
+  initConfig();
+  integration("pathToUrls converts asset ids to matching URL paths", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [
+        d.file("foo.dart", "foo() => null;")
+      ]),
+      d.dir("asset", [
+        d.file("foo.txt", "foo")
+      ]),
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+      d.dir("test", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ]),
+      d.dir("lib", [
+        d.file("app.dart", "app() => null;")
+      ]),
+      d.dir("asset", [
+        d.file("app.txt", "app")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ]),
+      d.dir("randomdir", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["test", "web", "randomdir"], shouldGetFirst: true);
+
+    // Paths in web/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("web", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("web", "sub", "bar.html")
+    }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
+
+    // Paths in test/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("test", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("test", "sub", "bar.html")
+    }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
+
+    // A non-default directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("randomdir", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
+
+    // A path in lib/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("lib", "app.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/myapp/app.dart"),
+      getServerUrl("web", "packages/myapp/app.dart"),
+      getServerUrl("randomdir", "packages/myapp/app.dart")
+    ]});
+
+    // A path in asset/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("asset", "app.txt")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/myapp/app.txt"),
+      getServerUrl("web", "assets/myapp/app.txt"),
+      getServerUrl("randomdir", "assets/myapp/app.txt")
+    ]});
+
+    // A path to this package in packages/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("packages", "myapp", "app.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/myapp/app.dart"),
+      getServerUrl("web", "packages/myapp/app.dart"),
+      getServerUrl("randomdir", "packages/myapp/app.dart")
+    ]});
+
+    // A path to another package in packages/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("packages", "foo", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // A relative path to another package's lib/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("..", "foo", "lib", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // An absolute path to another package's lib/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join(sandboxDir, "foo", "lib", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // A relative path to another package's asset/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("..", "foo", "asset", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/foo/foo.dart"),
+      getServerUrl("web", "assets/foo/foo.dart"),
+      getServerUrl("randomdir", "assets/foo/foo.dart")
+    ]});
+
+    // An absolute path to another package's asset/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join(sandboxDir, "foo", "asset", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/foo/foo.dart"),
+      getServerUrl("web", "assets/foo/foo.dart"),
+      getServerUrl("randomdir", "assets/foo/foo.dart")
+    ]});
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
similarity index 80%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
index 12bc06f..4bc8307 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
@@ -4,14 +4,16 @@
 
 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';
 import '../utils.dart';
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("pathToUrls provides output line if given source", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
@@ -23,8 +25,8 @@
 
     schedule(() {
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
+        "command": "pathToUrls",
+        "path": p.join("web", "main.dart"),
         "line": 12345
       }, replyEquals: {
         "urls": [getServerUrl("web", "main.dart")],
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
deleted file mode 100644
index 2061748..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2014, 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 file.
-
-library pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("includes id in response if given with command", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("test", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("randomdir", [
-        d.file("index.html", "<body>")
-      ])
-    ]).create();
-
-    pubServe(args: ["test", "web", "randomdir"]);
-
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "id": "some id",
-        "path": "web/index.html"
-      }, replyMatches: containsPair("id", "some id"));
-
-      expectWebSocketCall({
-        "command": "urlToAssetId",
-        "id": 12345,
-        "url": getServerUrl("web", "index.html")
-      }, replyMatches: containsPair("id", 12345));
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
new file mode 100644
index 0000000..a3c8f0c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("returns the old URL if the directory is already served", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "web"
+    }, replyMatches: {
+      "url": getServerUrl("web")
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..d0ffd78
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+  });
+
+  integration("responds with an error if 'path' is missing", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is not a string", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is absolute", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "/absolute.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a relative path. Got "/absolute.txt".'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' reaches out", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "a/../../bad.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error":
+          '"path" cannot reach out of its containing directory. '
+          'Got "a/../../bad.txt".'
+    });
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
index 12bc06f..e812e19 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
@@ -11,26 +11,24 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("serveDirectory includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
+      d.dir("example", [
+        d.file("index.html", "<body>")
+      ]),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "id": 12345,
+      "path": "example"
+    }, replyMatches: containsPair("id", 12345));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
new file mode 100644
index 0000000..876142f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("binds a directory to a new port", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["web"]);
+
+    // Bind the new directory.
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "test"
+    }, replyMatches: {"url": matches(r"http://127\.0\.0\.1:\d+")})
+        .then((response) {
+      var url = Uri.parse(response["url"]);
+      registerServerPort("test", url.port);
+    });
+
+    // It should be served now.
+    requestShouldSucceed("index.html", "<test body>", root: "test");
+
+    // And watched.
+    d.dir(appPath, [
+      d.dir("test", [
+        d.file("index.html", "after")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "after", root: "test");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..aaa3d9c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+  });
+
+  integration("responds with an error if 'path' is missing", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is not a string", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is absolute", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "/absolute.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a relative path. Got "/absolute.txt".'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' reaches out", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "a/../../bad.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error":
+          '"path" cannot reach out of its containing directory. '
+          'Got "a/../../bad.txt".'
+    });
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
new file mode 100644
index 0000000..7d80601
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("errors if the directory is not served", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    // Unbind the directory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "test"
+    }, replyEquals: {
+      "code": "NOT_SERVED",
+      "error": 'Directory "test" is not bound to a server.'
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
new file mode 100644
index 0000000..20a4d2a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("unserveDirectory includes id in response if given", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.file("index.html", "<body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    // TODO(rnystrom): "example" is in here so that that's the port the web
+    // socket is bound to. That way, when we unserve "web", we don't close the
+    // web socket connection itself.
+    // Remove this when #16957 is fixed.
+    pubServe(args: ["example", "web"]);
+
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "id": 12345,
+      "path": "web"
+    }, replyMatches: containsPair("id", 12345));
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
new file mode 100644
index 0000000..c08ff4b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("when a subdirectory is unbound it is still watched because the "
+      "superdirectory is watching it", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "before")
+        ])
+      ])
+    ]).create();
+
+    var exampleOne = p.join("example", "one");
+    pubServe(args: ["example", exampleOne]);
+
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // Unbind the subdirectory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": exampleOne
+    }, replyEquals: {
+      "url": getServerUrl(exampleOne)
+    });
+
+    // "example/one" should not be served now.
+    requestShouldNotConnect("foo.txt", root: exampleOne);
+
+    // "example" is still fine.
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+
+    // And still being watched.
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "after")
+        ])
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("one/foo.txt", "after", root: "example");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
new file mode 100644
index 0000000..2cb5d2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("when a superdirectory is unbound it is still watched because "
+      "the subdirectory is watching it", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "before")
+        ])
+      ])
+    ]).create();
+
+    var exampleOne = p.join("example", "one");
+    pubServe(args: [exampleOne, "example"]);
+
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // Unbind the subdirectory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "example"
+    }, replyEquals: {
+      "url": getServerUrl("example")
+    });
+
+    // "example" should not be served now.
+    requestShouldNotConnect("one/foo.txt", root: "example");
+
+    // "example/one" is still fine.
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // And still being watched.
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "after")
+        ])
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("foo.txt", "after", root: exampleOne);
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
new file mode 100644
index 0000000..361bb3f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("unbinds a directory from a port", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    requestShouldSucceed("index.html", "<body>");
+    requestShouldSucceed("index.html", "<test body>", root: "test");
+
+    // Unbind the directory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "test"
+    }, replyEquals: {
+      "url": getServerUrl("test")
+    });
+
+    // "test" should not be served now.
+    requestShouldNotConnect("index.html", root: "test");
+
+    // "web" is still fine.
+    requestShouldSucceed("index.html", "<body>");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
index 12bc06f..ce65421 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
@@ -11,26 +11,21 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("urlToAssetId includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "urlToAssetId",
+      "id": 12345,
+      "url": getServerUrl("web", "index.html")
+    }, replyMatches: containsPair("id", 12345));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
new file mode 100644
index 0000000..1d8954c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import 'dart:convert';
+
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+final transformer = """
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+
+class GetInputTransformer extends Transformer {
+  GetInputTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return transform.readInputAsString(new AssetId('myapp', 'nonexistent'))
+        .catchError((error) {
+      if (error is! AssetNotFoundException) throw error;
+      transform.addOutput(new Asset.fromString(transform.primaryInput.id,
+          JSON.encode({
+        'package': error.id.package,
+        'path': error.id.path
+      })));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("AssetNotFoundExceptions are detectable", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", transformer)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    var server = pubServe();
+    requestShouldSucceed("foo.txt", JSON.encode({
+      "package": "myapp",
+      "path": "nonexistent"
+    }));
+    endPubServe();
+
+    // Since the AssetNotFoundException was caught and handled, the server
+    // shouldn't print any error information for it.
+    server.stderr.expect(isDone);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
index c818a73..d80994b 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
@@ -4,6 +4,10 @@
 
 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;
 import '../test_pub.dart';
 
@@ -52,19 +56,22 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    schedulePub(args: ["build"],
-        output: """
-Building myapp...
+    var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Loading source assets..."));
+    pub.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+    pub.stdout.expect(startsWith("Building myapp..."));
+
+    pub.stdout.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt]:
-info!
-""",
-        error: """
+info!"""));
+
+    pub.stderr.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt with input myapp|web/foo.foo]:
 Warning!
 [Rewrite on myapp|web/foo.txt]:
 http://fake.com/not_real.dart:2:1: ERROR!
-Build failed.
-""",
-        exitCode: 65);
+Build failed."""));
+
+    pub.shouldExit(exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
new file mode 100644
index 0000000..9b41b2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    transform.consumePrimary();
+    return transform.primaryInput.readAsString().then((contents) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      var asset = new Asset.fromString(id, "\$contents.out");
+      transform.addOutput(asset);
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("a transform can use consumePrimary", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe();
+    requestShouldSucceed("foo.out", "foo.out");
+    requestShould404("foo.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
new file mode 100644
index 0000000..543bf01
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2014, 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 file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return Future.wait([
+      transform.hasInput(transform.primaryInput.id),
+      transform.hasInput(new AssetId('hooble', 'whatsit'))
+    ]).then((results) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      var asset = new Asset.fromString(id,
+          "primary: \${results[0]}, secondary: \${results[1]}");
+      transform.addOutput(asset);
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("a transform can use hasInput", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe();
+    requestShouldSucceed("foo.out", "primary: true, secondary: false");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
index 9bb02a5..cc84127 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
@@ -52,7 +52,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 . description_changed 1\.0\.0 from path \.\.[/\\]description_changed_2 \(was 1\.0\.0 from path \.\.[/\\]description_changed_1\)
 . source_changed 2\.0\.0 from path \.\.[/\\]source_changed \(was 1\.0\.0\)
 . unchanged 1\.0\.0
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index b442686..7925992 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -36,7 +36,7 @@
 
     // Only upgrade "upgraded".
     pubUpgrade(args: ["upgraded"], output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
   not_upgraded 1\.0\.0
 . upgraded 2\.0\.0 \(was 1\.0\.0\) \(1 newer unstable version available\)
 """, multiLine: true));
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
index 6bbccc5..b91cd08 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
@@ -25,7 +25,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 ! overridden 1\.0\.0 \(overridden\)
 """, multiLine: true));
   });
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
index 815f640..3d94d7a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
@@ -77,7 +77,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 \+ added .*
 \* description_changed .*
 < downgraded .*
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
index c887135..2de3d9a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -40,7 +40,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 . multiple_newer 1\.0\.0 \(1 newer version available\)
 . multiple_newer_stable 1\.0\.0 \(2 newer versions available\)
 . multiple_newer_unstable 1\.0\.0 \(2 newer unstable versions available\)
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index 7de40e6..adf54f1 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -43,8 +43,10 @@
  * ## Stream
  *
  * A Stream provides an asynchronous sequence of data.
- * Examples of data sequences include user-generated events,
- * such as mouse clicks, and a stream of bytes read from a file.
+ * Examples of data sequences include individual events, like mouse clicks,
+ * or sequential chunks of larger data, like multiple byte lists with the
+ * contents of a file
+ * such as mouse clicks, and a stream of byte lists read from a file.
  * The following example opens a file for reading.
  * [Stream.listen] registers a callback function that runs
  * each time more data is available.
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index fb5ac89..5bff429 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -6,10 +6,27 @@
 
 
 /**
- * A linked list implementation, providing O(1) removal(unlink) of elements and
- * manual traversal through [next] and [previous].
+ * A specialized double-linked list of elements that extends [LinkedListEntry].
  *
- * The list elements must extend [LinkedListEntry].
+ * This is not a generic data structure. It only accepts elements that extend
+ * the [LinkedListEntry] class. See the [Queue] implementations for
+ * generic collections that allow constant time adding and removing at the ends.
+ *
+ * This is not a [List] implementation. Despite its name, this class does not
+ * implement the [List] interface. It does not allow constant time lookup by
+ * index.
+ *
+ * Because the elements themselves contain the links of this linked list,
+ * each element can be in only one list at a time. To add an element to another
+ * list, it must first be removed from its current list (if any).
+ *
+ * In return, each element knows its own place in the linked list, as well as
+ * which list it is in. This allows constant time [LinkedListEntry.addAfter],
+ * [LinkedListEntry.addBefore] and [LinkedListEntry.unlink] operations
+ * when all you have is the element.
+ *
+ * A `LinkedList` also allows constant time adding and removing at either end,
+ * and a constant time length getter.
  */
 class LinkedList<E extends LinkedListEntry<E>>
     extends IterableBase<E>
@@ -28,30 +45,33 @@
   }
 
   /**
-   * Add [entry] to the beginning of the list.
+   * Add [entry] to the beginning of the linked list.
    */
   void addFirst(E entry) {
     _insertAfter(this, entry);
   }
 
   /**
-   * Add [entry] to the end of the list.
+   * Add [entry] to the end of the linked list.
    */
   void add(E entry) {
     _insertAfter(_previous, entry);
   }
 
   /**
-   * Add [entries] to the end of the list.
+   * Add [entries] to the end of the linked list.
    */
   void addAll(Iterable<E> entries) {
     entries.forEach((entry) => _insertAfter(_previous, entry));
   }
 
   /**
-   * Remove [entry] from the list. This is the same as calling `entry.unlink()`.
+   * Remove [entry] from the linked list.
    *
-   * If [entry] is not in the list, `false` is returned.
+   * Returns false and does nothing if [entry] is not in this linked list.
+   *
+   * This is equivalent to calling `entry.unlink()` if the entry is in this
+   * list.
    */
   bool remove(E entry) {
     if (entry._list != this) return false;
@@ -61,11 +81,11 @@
 
   Iterator<E> get iterator => new _LinkedListIterator<E>(this);
 
-  // TODO(zarah) Remove this, and let it be inherited by IterableMixin
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
-
   int get length => _length;
 
+  /**
+   * Remove all elements from this linked list.
+   */
   void clear() {
     _modificationCount++;
     _LinkedListLink next = _next;
@@ -103,9 +123,9 @@
   }
 
   /**
-   * Call [action] with each entry in the list.
+   * Call [action] with each entry in this linked list.
    *
-   * It's an error if [action] modify the list.
+   * It's an error if [action] modify the linked list.
    */
   void forEach(void action(E entry)) {
     int modificationCount = _modificationCount;
@@ -183,7 +203,18 @@
 
 
 /**
- * Entry element for a [LinkedList]. Any entry must extend this class.
+ * An object that can be an element in a [LinkedList].
+ *
+ * All elements of a `LinkedList` must extend this class.
+ * The class provides the internal links that link elements together
+ * in the `LinkedList`, and a reference to the linked list itself
+ * that an element is currently part of.
+ *
+ * An entry can be in at most one linked list at a time.
+ * While an entry is in a linked list, the [list] property points to that
+ * linked list, and otherwise the `list` property is `null`.
+ *
+ * When created, an entry is not in any linked list.
  */
 abstract class LinkedListEntry<E extends LinkedListEntry<E>>
     implements _LinkedListLink {
@@ -192,27 +223,38 @@
   _LinkedListLink _previous;
 
   /**
-   * Get the list containing this element.
+   * Get the linked list containing this element.
+   *
+   * Returns `null` if this entry is not currently in any list.
    */
   LinkedList<E> get list => _list;
 
   /**
-   * Unlink the element from the list.
+   * Unlink the element from its linked list.
+   *
+   * The entry must currently be in a linked list when this method is called.
    */
   void unlink() {
     _list._unlink(this);
   }
 
   /**
-   * Return the succeeding element in the list.
+   * Return the succeessor of this element in its linked list.
+   *
+   * Returns `null` if there is no successor in the linked list, or if this
+   * entry is not currently in any list.
    */
   E get next {
     if (identical(_next, _list)) return null;
-    return _next as E;
+    E result = _next;
+    return result;
   }
 
   /**
-   * Return the preceeding element in the list.
+   * Return the predecessor of this element in its linked list.
+   *
+   * Returns `null` if there is no predecessor in the linked list, or if this
+   * entry is not currently in any list.
    */
   E get previous {
     if (identical(_previous, _list)) return null;
@@ -220,14 +262,20 @@
   }
 
   /**
-   * insert an element after this.
+   * Insert an element after this element in this element's linked list.
+   *
+   * This entry must be in a linked list when this method is called.
+   * The [entry] must not be in a linked list.
    */
   void insertAfter(E entry) {
     _list._insertAfter(this, entry);
   }
 
   /**
-   * Insert an element before this.
+   * Insert an element before this element in this element's linked list.
+   *
+   * This entry must be in a linked list when this method is called.
+   * The [entry] must not be in a linked list.
    */
   void insertBefore(E entry) {
     _list._insertAfter(_previous, entry);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 82454e3..78f2638 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2261,9 +2261,9 @@
 @DomName('Console')
 class Console {
 
-  Console._safe() {}
+  const Console._safe();
 
-  static Console _safeConsole = new Console._safe();
+  static const Console _safeConsole = const Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
@@ -2289,7 +2289,7 @@
 
   @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.debug(#)', arg) : null;
+      JS('void', 'console.dir(#)', arg) : null;
 
   @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index acc5db1..366fd8d 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -590,6 +590,34 @@
  */
 abstract class ContentType implements HeaderValue {
   /**
+   * Content type for plain text using UTF-8 encoding.
+   *
+   *     text/plain; charset=utf-8
+   */
+  static final TEXT = new ContentType("text", "plain", charset: "utf-8");
+
+  /**
+   *  Content type for HTML using UTF-8 encoding.
+   *
+   *     text/html; charset=utf-8
+   */
+  static final HTML = new ContentType("text", "html", charset: "utf-8");
+
+  /**
+   *  Content type for JSON using UTF-8 encoding.
+   *
+   *     application/json; charset=utf-8
+   */
+  static final JSON = new ContentType("application", "json", charset: "utf-8");
+
+  /**
+   *  Content type for binary data.
+   *
+   *     application/octet-stream
+   */
+  static final BINARY = new ContentType("application", "octet-stream");
+
+  /**
    * Creates a new content type object setting the primary type and
    * sub type. The charset and additional parameters can also be set
    * using [charset] and [parameters]. If charset is passed and
@@ -720,19 +748,19 @@
  * package, which makes working with the low-level
  * dart:io HTTP server subsystem easier.
  *
- * HttpRequest objects are generated by an [HttpServer],
+ * `HttpRequest` objects are generated by an [HttpServer],
  * which listens for HTTP requests on a specific host and port.
  * For each request received, the HttpServer, which is a [Stream],
- * generates an HttpRequest object and adds it to the stream.
+ * generates an `HttpRequest` object and adds it to the stream.
  *
- * An HttpRequest object delivers the body content of the request
- * as a stream of bytes.
+ * An `HttpRequest` object delivers the body content of the request
+ * as a stream of byte lists.
  * The object also contains information about the request,
  * such as the method, URI, and headers.
  *
  * In the following code, an HttpServer listens
  * for HTTP requests and, within the callback function,
- * uses the HttpRequest object's `method` property to dispatch requests.
+ * uses the `HttpRequest` object's `method` property to dispatch requests.
  *
  *     final HOST = InternetAddress.LOOPBACK_IP_V4;
  *     final PORT = 4040;
@@ -750,9 +778,9 @@
  *       onError: handleError);    // listen() failed.
  *     }).catchError(handleError);
  *
- * Listen to the HttpRequest stream to handle the
+ * Listen to the `HttpRequest` stream to handle the
  * data and be notified once the entire body is received.
- * An HttpRequest object contains an [HttpResponse] object,
+ * An `HttpRequest` object contains an [HttpResponse] object,
  * to which the server can write its response.
  * For example, here's a skeletal callback function
  * that responds to a request:
@@ -1347,6 +1375,7 @@
 abstract class HttpClientRequest implements IOSink {
   /**
    * Gets and sets the requested persistent connection state.
+   *
    * The default value is [:true:].
    */
   bool persistentConnection;
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 85706d1..bd56939 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -495,7 +495,11 @@
         }
         skipWS();
         String value = parseValue();
-        cookies.add(new _Cookie(name, value));
+        try {
+          cookies.add(new _Cookie(name, value));
+        } catch (_) {
+          // Skip it, invalid cookie data.
+        }
         skipWS();
         if (done()) return;
         if (!expect(";")) {
@@ -718,7 +722,9 @@
   bool httpOnly = false;
   bool secure = false;
 
-  _Cookie([this.name, this.value]);
+  _Cookie([this.name, this.value]) {
+    _validate();
+  }
 
   _Cookie.fromSetCookieValue(String value) {
     // Parse the 'set-cookie' header value.
@@ -806,6 +812,7 @@
     }
     index++;  // Skip the = character.
     value = parseValue();
+    _validate();
     if (done()) return;
     index++;  // Skip the ; character.
     parseAttributes();
@@ -830,6 +837,32 @@
     if (httpOnly) sb.write("; HttpOnly");
     return sb.toString();
   }
+
+  void _validate() {
+    const SEPERATORS = const [
+        "(", ")", "<", ">", "@", ",", ";", ":", "\\",
+        '"', "/", "[", "]", "?", "=", "{", "}"];
+    for (int i = 0; i < name.length; i++) {
+      int codeUnit = name.codeUnits[i];
+      if (codeUnit <= 32 ||
+          codeUnit >= 127 ||
+          SEPERATORS.indexOf(name[i]) >= 0) {
+        throw new FormatException(
+            "Invalid character in cookie name, code unit: '$codeUnit'");
+      }
+    }
+    for (int i = 0; i < value.length; i++) {
+      int codeUnit = value.codeUnits[i];
+      if (!(codeUnit == 0x21 ||
+            (codeUnit >= 0x23 && codeUnit <= 0x2B) ||
+            (codeUnit >= 0x2D && codeUnit <= 0x3A) ||
+            (codeUnit >= 0x3C && codeUnit <= 0x5B) ||
+            (codeUnit >= 0x5D && codeUnit <= 0x7E))) {
+        throw new FormatException(
+            "Invalid character in cookie value, code unit: '$codeUnit'");
+      }
+    }
+  }
 }
 
 
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index a6d9f53..0c27522 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -8,7 +8,7 @@
  * Helper class to wrap a [StreamConsumer<List<int>>] and provide
  * utility functions for writing to the StreamConsumer directly. The
  * [IOSink] buffers the input given by all [StringSink] methods and will delay
- * a [addStream] until the buffer is flushed.
+ * an [addStream] until the buffer is flushed.
  *
  * When the [IOSink] is bound to a stream (through [addStream]) any call
  * to the [IOSink] will throw a [StateError]. When the [addStream] completes,
@@ -18,6 +18,7 @@
  * ignored. Use the [done] future to be notified when the [IOSink] is closed.
  */
 abstract class IOSink implements StreamSink<List<int>>, StringSink {
+  // TODO(ajohnsen): Make _encodingMutable an argument.
   factory IOSink(StreamConsumer<List<int>> target,
                  {Encoding encoding: UTF8})
       => new _IOSinkImpl(target, encoding);
@@ -29,14 +30,68 @@
   Encoding encoding;
 
   /**
-   * Writes the bytes uninterpreted to the consumer. While the call is
-   * synchronous, the data may be buffered until the underlying resource is
-   * ready. The data should not be modified after a call to [add].
+   * Adds [data] to the target consumer, ignoring [encoding].
+   *
+   * The [encoding] does not apply to this method, and the `data` list is passed
+   * directly to the target consumer as a stream event.
+   *
+   * This function must not be called when a stream is currently being added
+   * using [addStream].
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
+   *
+   * The data list should not be modified after it has been passed to `add`.
    */
   void add(List<int> data);
 
   /**
-   * Writes an error to the consumer.
+   * Converts [obj] to a String by invoking [Object.toString] and
+   * [add]s the encoding of the result to the target consumer.
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
+   */
+  void write(Object obj);
+
+  /**
+   * Iterates over the given [objects] and [write]s them in sequence.
+   *
+   * If [separator] is provided, a `write` with the `separator` is performed
+   * between any two elements of `objects`.
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
+   */
+  void writeAll(Iterable objects, [String separator = ""]);
+
+  /**
+   * Converts [obj] to a String by invoking [Object.toString] and
+   * writes the result to `this`, followed by a newline.
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
+   */
+  void writeln([Object obj = ""]);
+
+  /**
+   * Writes the [charCode] to `this`.
+   *
+   * This method is equivalent to `write(new String.fromCharCode(charCode))`.
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
+   */
+  void writeCharCode(int charCode);
+
+  /**
+   * Passes the error to the target consumer as an error event.
+   *
+   * This function must not be called when a stream is currently being added
+   * using [addStream].
+   *
+   * This operation is non-blocking. See [flush] or [done] for how to get any
+   * errors generated by this call.
    */
   void addError(error, [StackTrace stackTrace]);
 
@@ -57,13 +112,14 @@
   Future flush();
 
   /**
-   * Close the target.
+   * Close the target consumer.
    */
   Future close();
 
   /**
-   * Get a future that will complete when all synchronous have completed, or an
-   * error happened. This future is identical to the future returned from close.
+   * Get a future that will complete when the consumer closes, or when an
+   * error occurs. This future is identical to the future returned by
+   * [close].
    */
   Future get done;
 }
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 828145e..db68773 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -9,6 +9,7 @@
 class _ProcessUtils {
   external static void _exit(int status);
   external static void _setExitCode(int status);
+  external static int _getExitCode();
   external static void _sleep(int millis);
   external static int _pid(Process process);
   external static Stream<ProcessSignal> _watchSignal(ProcessSignal signal);
@@ -49,7 +50,26 @@
 }
 
 /**
- * Global exit code for the Dart VM.
+ * Set the global exit code for the Dart VM.
+ *
+ * The exit code is global for the Dart VM and the last assignment to
+ * exitCode from any isolate determines the exit code of the Dart VM
+ * on normal termination.
+ *
+ * Default value is `0`.
+ *
+ * See [exit] for more information on how to chose a value for the
+ * exit code.
+ */
+void set exitCode(int code) {
+  if (code is !int) {
+    throw new ArgumentError("Integer value for exit code expected");
+  }
+  _ProcessUtils._setExitCode(code);
+}
+
+/*
+ * Get the global exit code for the Dart VM.
  *
  * The exit code is global for the Dart VM and the last assignment to
  * exitCode from any isolate determines the exit code of the Dart VM
@@ -58,12 +78,7 @@
  * See [exit] for more information on how to chose a value for the
  * exit code.
  */
-set exitCode(int code) {
-  if (code is !int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
-  _ProcessUtils._setExitCode(code);
-}
+int get exitCode => _ProcessUtils._getExitCode();
 
 /**
  * Sleep for the duration specified in [duration].
@@ -86,7 +101,7 @@
 
 /**
  * The means to execute a program.
- * 
+ *
  * Use the static [start] and [run] methods to start a new process.
  * The run method executes the process non-interactively to completion.
  * In contrast, the start method allows your code to interact with the
@@ -138,10 +153,10 @@
  *     }
  *
  * ## Standard I/O streams
- * 
+ *
  * As seen in the previous code sample, you can interact with the Process's
  * standard output stream through the getter [stdout],
- * and you can interact with the Process's standard input stream through 
+ * and you can interact with the Process's standard input stream through
  * the getter [stdin].
  * In addition, Process provides a getter [stderr] for using the Process's
  * standard error stream.
@@ -174,7 +189,7 @@
  * ## Other resources
  *
  * [Dart by Example](https://www.dartlang.org/dart-by-example/#dart-io-and-command-line-apps)
- * provides additional task-oriented code samples that show how to use 
+ * provides additional task-oriented code samples that show how to use
  * various API from the [dart:io] library.
  */
 abstract class Process {
@@ -396,6 +411,10 @@
 /**
  * On Posix systems, [ProcessSignal] is used to send a specific signal
  * to a child process, see [:Process.kill:].
+ *
+ * Some [ProcessSignal]s can also be watched, as a way to intercept the default
+ * signal handler and implement another. See [ProcessSignal.watch] for more
+ * information.
  */
 class ProcessSignal {
   static const ProcessSignal SIGHUP = const ProcessSignal._(1, "SIGHUP");
@@ -441,13 +460,16 @@
    * The following [ProcessSignal]s can be listened to:
    *
    *   * [ProcessSignal.SIGHUP].
-   *   * [ProcessSignal.SIGINT].
+   *   * [ProcessSignal.SIGINT]. Signal sent by e.g. CTRL-C.
    *   * [ProcessSignal.SIGTERM]. Not available on Windows.
    *   * [ProcessSignal.SIGUSR1]. Not available on Windows.
    *   * [ProcessSignal.SIGUSR2]. Not available on Windows.
    *   * [ProcessSignal.SIGWINCH]. Not available on Windows.
    *
    * Other signals are disallowed, as they may be used by the VM.
+   *
+   * A signal can be watched multiple times, from multiple isolates, where all
+   * callbacks are invoked when signaled, in no specific order.
    */
   Stream<ProcessSignal> watch() => _ProcessUtils._watchSignal(this);
 }
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 7f928b1..4b64fe3 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -179,7 +179,7 @@
    * was received, the result will be null.
    */
   static Future<RawSecureServerSocket> bind(
-      String address,
+      address,
       int port,
       String certificateName,
       {int backlog: 0,
diff --git a/sdk/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
index 495c70e..51f0901 100644
--- a/sdk/lib/io/timer_impl.dart
+++ b/sdk/lib/io/timer_impl.dart
@@ -190,7 +190,7 @@
     _clear();
     if (!_isInHeap) return;
     assert(_wakeupTime != 0);
-    bool update = _firstZeroTimer == null && _heap.isFirst(this);
+    bool update = (_firstZeroTimer == null) && _heap.isFirst(this);
     _heap.remove(this);
     if (update) {
       _notifyEventHandler();
@@ -207,10 +207,12 @@
   bool _addTimerToHeap() {
     if (_wakeupTime == 0) {
       if (_firstZeroTimer == null) {
-        _lastZeroTimer = _firstZeroTimer = this;
+        _lastZeroTimer = this;
+        _firstZeroTimer = this;
         return true;
       } else {
-        _lastZeroTimer = _lastZeroTimer._indexOrNext = this;
+        _lastZeroTimer._indexOrNext = this;
+        _lastZeroTimer = this;
         return false;
       }
     } else {
@@ -257,13 +259,16 @@
     // Collect all pending timers.
     var timer = _firstZeroTimer;
     var nextTimer = _lastZeroTimer;
-    _firstZeroTimer = _lastZeroTimer = null;
+    _firstZeroTimer = null;
+    _lastZeroTimer = null;
     while (_heap.isNotEmpty && _heap.first._wakeupTime <= currentTime) {
       var next = _heap.removeFirst();
       if (timer == null) {
-        nextTimer = timer = next;
+        nextTimer = next;
+        timer = next;
       } else {
-        nextTimer = nextTimer._indexOrNext = next;
+        nextTimer._indexOrNext = next;
+        nextTimer = next;
       }
     }
 
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index ee5f5bb..630eeac 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -13,7 +13,7 @@
 
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
 
-[ $runtime == vm || $runtime == dartium || $compiler == dart2dart || $compiler == dart2js ]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # co19-roll r587: Please triage this failure
 
@@ -31,7 +31,6 @@
 LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError, OK # co19 issue 663
 LibTest/core/Set/IterableBase_A01_t01: RuntimeError, OK # co19 issue 663
 
-[ $runtime == vm || $runtime == dartium || $compiler == dart2js ]
 LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -49,11 +48,6 @@
 LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493 (not fixed in r672)
 LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495 (not fixed in r672)
 
-
-[ $runtime == dartium || $compiler == dart2js ]
-LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
-
-[ $runtime == vm || $compiler == none || $compiler == dart2js ]
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # Co19 issue 639 (Fixed in r674)
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # Co19 issue 639
@@ -86,9 +80,11 @@
 
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
 
+[ $runtime == dartium || $compiler == dart2js ]
+LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
 
 ### CHECKED MODE FAILURES ###
 
-[ ($runtime == vm || $runtime == dartium || $compiler == dart2js) && $checked]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index df91bfe..294a984 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -667,3 +667,6 @@
 LibTest/async/Stream/listen_A05_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+LibTest/async/DeferredLibrary/*: Skip # Issue 17458
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index b52328c..eefab31 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -5,7 +5,7 @@
 [ $compiler == none && $runtime == drt ]
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
@@ -37,5 +37,5 @@
 
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
 
-[ $compiler == none && $runtime == dartium && $checked ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index e98b79b..bb3ef50 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 
-[ $compiler == none && ($runtime == vm || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
@@ -69,8 +69,8 @@
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
 
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
-LibTest/isolate/Isolate/spawnUri_A01_t04: Crash # dartbug.com/17440
-LibTest/isolate/Isolate/spawn_A01_t04: Crash # dartbug.com/17440
+LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
+LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # dartbug.com/17440
 
 [ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips) ]
 LibTest/core/Uri/Uri_A06_t03: Skip # Timeouts, co19-roll r576: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 3c842af..75b884d 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -11,7 +11,10 @@
 import 'analyze_helper.dart';
 
 const Map<String, List<String>> WHITE_LIST = const {
-  "ir_builder.dart": const ["The method 'getIr' is never called."],
+  "ir_builder.dart":
+      const ["The method 'getIr' is never called.",
+             "The method 'hasIr' is never called.",
+            ],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index ac12f23..770e62f 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -22,6 +22,9 @@
 mirrors/library_imports_prefixed_show_hide_test: Fail
 mirrors/library_imports_shown_test: Fail
 
+[ $unchecked ]
+exit_code_test: Skip # This tests requires checked mode.
+
 [ $mode == debug ]
 mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
 
@@ -31,6 +34,8 @@
 exit_code_test: Pass, Slow
 deferred_load_graph_segmentation_test: Pass, Slow
 check_members_test: Pass, Slow
+duplicate_library_test: Pass, Slow
+show_package_warnings_test: Pass, Slow
 
 # Don't mark these tests as failing. Instead, fix the errors/warnings that they
 # report or update the whitelist in the test-files to temporarily allow
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index fd5c38f..4db2ecd 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -218,6 +218,7 @@
 }

 

 void main() {

+  // TODO(johnniwinther): implement this test for unchecked mode.

   bool isCheckedMode = false;

   assert(isCheckedMode = true);

   Expect.isTrue(isCheckedMode, 'This test must be run in checked mode.');

diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index f31fe96..8d2763d 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -18,11 +18,8 @@
 variable_type_test/03: Fail, OK
 variable_type_test/01: Fail, OK
 
-[ $compiler == dart2js && $host_checked && $checked == false ]
-# Test that @IrRepresentation yields compile-time errors in host-checked mode.
-# The condition "$checked == false" is to be removed once we build IR in
-# target-checked mode.
-ir_representation_test: CompileTimeError, OK
+[ $compiler == dart2js && ($runtime == d8 || $runtime == chrome || $runtime == drt) ]
+bound_closure_interceptor_type_test: Fail, Pass # v8 issue 3084. https://code.google.com/p/v8/issues/detail?id=3084
 
 [ $compiler == dart2js && $mode == debug ]
 operator_test: Skip
@@ -59,3 +56,6 @@
 deferred/deferred_constant3_test: Fail # http://dartbug.com/16898
 deferred/deferred_constant4_test: Fail # http://dartbug.com/16898
 deferred/deferred_constant5_test: Fail # http://dartbug.com/16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+deferred/*: Skip # Issue 17458
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
deleted file mode 100644
index e0d241c..0000000
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
+++ /dev/null
@@ -1,26 +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 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'dart:async';
-
-@lazy import 'deferred_class_library2.dart' as lib;
-
-const lazy = const DeferredLibrary('deferred_class_library2');
-
-main() {
-  asyncStart();
-  lazy.load().then((bool didLoad) {
-    Expect.isTrue(didLoad);
-    Expect.equals(321, const lib.Gee.n321().value);
-    Expect.equals(246, const lib.Gee.n246().value);
-    Expect.equals(888, const lib.Gee.n888().value);
-    Expect.equals(321, const lib.Gee2.n321().value);
-    Expect.equals(151, const lib.Gee2.n151().value);
-    Expect.equals(888, const lib.Gee2.n888().value);
-    asyncEnd();
-  });
-}
diff --git a/tests/compiler/dart2js_extra/ir_representation_test.dart b/tests/compiler/dart2js_extra/ir_representation_test.dart
deleted file mode 100644
index 4b037c4..0000000
--- a/tests/compiler/dart2js_extra/ir_representation_test.dart
+++ /dev/null
@@ -1,62 +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.
-
-// The multitest framework does not support import paths that contain '..',
-// therefore it's not used in this file.
-import '../dart2js_native/compiler_test_internals.dart';
-
-/**
- * This test verifies that the @IrRepresentation annotation works as expected.
- * It might fail when extending the IR to express more of Dart.
- */
-
-// closure
-@IrRepresentation(true)
-test1() {
-  var f = () => 42;
-  return 1;
-}
-
-// parameter
-@IrRepresentation(true)
-test2(x) {
-  return x;
-}
-
-// dynamic invocation, construction
-@IrRepresentation(true)
-test3() {
-  new Object().hashCode;
-}
-
-// exceptions
-@IrRepresentation(true)
-test4() {
-  try {
-    throw "possum";
-  } catch (e) {
-    return e;
-  }
-}
-
-// control flow, loops
-@IrRepresentation(true)
-test5(x) {
-  while (x < 100) {
-    x += x;
-  }
-  if (x % 2 == 0) {
-    return 1;
-  } else {
-    return 2;
-  }
-}
-
-main() {
-  print(test1());
-  print(test2(1));
-  print(test3());
-  print(test4());
-  print(test5(2));
-}
diff --git a/tests/compiler/dart2js_extra/ssa_inlining_test.dart b/tests/compiler/dart2js_extra/ssa_inlining_test.dart
deleted file mode 100644
index b043c77..0000000
--- a/tests/compiler/dart2js_extra/ssa_inlining_test.dart
+++ /dev/null
@@ -1,118 +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.
-
-import '../dart2js_native/compiler_test_internals.dart';
-import 'package:expect/expect.dart';
-
-// The function ast01 is built by an SsaFromAstBuilder.
-// Ir functions are inlined by an SsaFromIrInliner.
-
-@NoInline()
-@IrRepresentation(false)
-ast01() {
-  checkAst01(JS('', 'arguments.callee'));
-  print(ir01());
-  print(ir02());
-  return ast02(11);
-}
-
-@IrRepresentation(true)
-ir01() => ir04();
-
-@IrRepresentation(true)
-ir02() => ast06(10, 20);
-
-@IrRepresentation(false)
-ast06(a,b) {
-  JS('', 'String("in ast06")');
-  return 3*a + b;
-}
-
-@IrRepresentation(true)
-ir04() => ir05();
-
-@IrRepresentation(true)
-ir05() => ast07(1, 22);
-
-@IrRepresentation(false)
-ast07(i, j) {
-  var x = 0;
-  return ast08(i,j) ? i : j;
-}
-
-@IrRepresentation(false)
-ast08(x,y) {
-  JS('', 'String("in ast08")');
-  return x - y < 0;
-}
-
-@IrRepresentation(false)
-ast02(x) {
-  print(x);
-  ir06();
-  print(ir07());
-}
-
-@IrRepresentation(true)
-ir06() => ast04(1,2,3);
-
-@IrRepresentation(false)
-ast04(a, b, c) {
-  print(a + b - c);
-  JS('', 'String("in ast04")');
-}
-
-@IrRepresentation(true)
-ir07() => ir03();
-
-@IrRepresentation(true)
-ir03() => ast05(1,3);
-
-@IrRepresentation(false)
-ast05(a, b) {
-  JS('', 'String("in ast05")');
-  return (a+b)/2;
-}
-
-// The function ir08 is built by an SsaFromIrBuilder.
-// Ast functions are inlined by an SsaFromAstInliner.
-
-@NoInline()
-@IrRepresentation(true)
-ir08() => ir09();
-
-ir09() => ast09();
-
-ast09() {
-  checkIr08(JS('', 'arguments.callee'));
-  JS('', 'String("in ast09")');
-  print(ir01());
-  print(ir02());
-  print(ast02(11));
-}
-
-main() {
-  ast01();
-  ir08();
-}
-
-@NoInline()
-check(func, names) {
-  var source = JS('String', 'String(#)', func);
-  print(source);
-  for (var f in names) {
-    Expect.isTrue(source.contains('"in $f"'), "should inline '$f'");
-  }
-}
-
-@NoInline
-checkAst01(func) {
-  var names = ["ast04", "ast05", "ast06", "ast08"];
-  check(func, names);
-}
-
-checkIr08(func) {
-  var names = ["ast09", "ast04", "ast05", "ast06", "ast08"];
-  check(func, names);
-}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 022e0b2..a741052 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -22,3 +22,7 @@
 
 [ $browser || $runtime == d8 ]
 only_pass_on_jsshell_test: Fail, OK # This test should only pass on jsshell.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+only_pass_on_d8_test: Skip # Issue 17458
+compute_this_script_test: Skip # Issue 17458
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 3c56c5c..c2b831e 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -15,7 +15,7 @@
 string_from_environment_default_value: Skip
 string_from_environment_test: Skip
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 bool_from_environment2_test: Skip
 bool_from_environment_default_value_test: Skip
 bool_from_environment_test: Skip
@@ -52,7 +52,7 @@
 
 symbol_test/01: Fail, Pass # bug 11669
 
-[ $compiler == none && $runtime != dartium && $runtime != drt ]
+[ $compiler == none && $runtime != dartium && $runtime != drt && $runtime != ContentShellOnAndroid ]
 symbol_test/02: MissingCompileTimeError # bug 11669
 symbol_test/03: MissingCompileTimeError # bug 11669
 
@@ -60,10 +60,7 @@
 symbol_test/none: Fail # bug 11669
 symbol_operator_test/03: Fail # bug 11669
 
-[ $compiler == none && $runtime == drt ]
-main_test: Fail  # Dartium needs to check for both main() and main(args).
-
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 main_test: Fail  # Dartium needs to check for both main() and main(args).
 
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
diff --git a/tests/html/html.status b/tests/html/html.status
index f9ce16e..36780af 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -25,7 +25,7 @@
 [ $compiler == none && $runtime == dartium && $system == macos]
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellInAndroid) ]
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
 xhr_test: Pass, Fail # Issue 12648
@@ -34,6 +34,9 @@
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
 
+[ $compiler == none && $runtime == ContentShellInAndroid ]
+element_offset_test/offset: Pass, Fail # Issue 13296
+
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
 touchevent_test/supported: Pass, Fail # Issue 17061
@@ -74,11 +77,10 @@
 xhr_cross_origin_test: Pass, Fail # Issue 11884
 xhr_test: Pass, Fail # Issue 11884
 
-[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid]
+[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == ContentShellOnAndroid ]
 webgl_1_test: Pass, Fail # Issue 8219
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
-request_animation_frame_test: Skip   # drt hangs; requestAnimationFrame not implemented
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 worker_api_test: Fail # http://dartbug.com/10223
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $system == windows]
@@ -380,6 +382,10 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime ==chrome) ]
 wheelevent_test: Fail # http://dartbug.com/12958
 
+[ $runtime == dartium && ($system == macos || $system == windows || $system == linux)]
+# Desktop operation systems do not support touch events on chrome 34 dartium.
+touchevent_test/supported: Fail
+
 [ $compiler == none && $runtime == dartium ]
 async_test: Timeout # Issue 13719: Please triage this failure.
 element_offset_test/offset: Pass, Fail # Issue 13719, 13296
diff --git a/tests/language/deferred_constraints_constants_lib.dart b/tests/language/deferred_constraints_constants_lib.dart
new file mode 100644
index 0000000..50b6ed5
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_lib.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.
+
+class C {
+  static int staticMethod() => 42;
+}
+
+class G<T> {}
+
+class Const {
+  const Const();
+  const Const.namedConstructor();
+  static const instance = const Const();
+}
+
+const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_constants_test.dart b/tests/language/deferred_constraints_constants_test.dart
new file mode 100644
index 0000000..be44642
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_test.dart
@@ -0,0 +1,63 @@
+// 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';
+
+@lazy import "deferred_constraints_constants_lib.dart" as lib;
+
+const lazy = const DeferredLibrary('lib');
+
+const myConst1 =
+  lib.constantInstance; /// reference1: compile-time error
+  /*                    /// reference1: continued
+  499;
+  */                    /// reference1: continued
+const myConst2 =
+  lib.Const.instance; /// reference2: compile-time error
+  /*                  /// reference2: continued
+  499;
+  */                  /// reference2: continued
+
+void f1({a:
+  const lib.Const() /// default_argument1: compile-time error
+  /*                   /// default_argument1: continued
+  499
+  */                   /// default_argument1: continued
+}) {}
+
+void f2({a:
+  lib.constantInstance /// default_argument2: compile-time error
+  /*                         /// default_argument2: continued
+  499
+  */                         /// default_argument2: continued
+}) {}
+
+@lib.Const() /// metadata1: compile-time error
+class H1 {}
+@lib.Const.instance /// metadata2: compile-time error
+class H2 {}
+@lib.Const.namedConstructor() /// metadata3: compile-time error
+class H3 {}
+
+void main() {
+  var a1 = myConst1;
+  var a2 = myConst2;
+
+  asyncStart();
+  lazy.load().then((_) {
+    var instance = lib.constantInstance;
+    var c1 = const lib.Const(); /// constructor1: compile-time error
+    var c2 = const lib.Const.namedConstructor(); /// constructor2: compile-time error
+    f1();
+    f2();
+    var constInstance = lib.constantInstance; /// reference_after_load: ok
+    var h1 = new H1();
+    var h2 = new H2();
+    var h3 = new H3();
+    asyncEnd();
+  });
+}
+
diff --git a/tests/language/deferred_constraints_lib.dart b/tests/language/deferred_constraints_lib.dart
index 9f4d207..1aac90a 100644
--- a/tests/language/deferred_constraints_lib.dart
+++ b/tests/language/deferred_constraints_lib.dart
@@ -10,6 +10,8 @@
 
 class Const {
   const Const();
+  const Const.otherConstructor();
+  static const instance = const Const();
 }
 
 const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_test.dart b/tests/language/deferred_constraints_type_annotation_test.dart
similarity index 77%
rename from tests/language/deferred_constraints_test.dart
rename to tests/language/deferred_constraints_type_annotation_test.dart
index 6992b78..cd4cdf5 100644
--- a/tests/language/deferred_constraints_test.dart
+++ b/tests/language/deferred_constraints_type_annotation_test.dart
@@ -14,21 +14,17 @@
 class F {}
 class G2<T> {}
 
-void f({a: const lib.Const()}) {} /// const_default_argument: compile-time error
-
-@lib.Const() class H {} /// const_annotation: compile-time error
-
-void main() {
-  Expect.throws(() { /// type_annotation1: static type warning
-    lib.C a = new lib.C(); /// type_annotation1: continued
-  }, (e) => e is NoSuchMethodError); /// type_annotation1: continued
+main() {
   lib.C a = null; /// type_annotation_null: static type warning
+  Expect.throws(() { /// new_before_load: static type warning
+    lib.C a = new lib.C(); /// new_before_load: continued
+  }, (e) => e is NoSuchMethodError); /// new_before_load: continued
 
   // In this case we do not defer C.
   lib2.C a1 = new lib2.C(); /// type_annotation_non_deferred: continued
   asyncStart();
   lazy.load().then((_) {
-    lib.C a2 = new lib.C(); /// type_annotation2: dynamic type error, static type warning
+    lib.C a2 = new lib.C(); /// type_annotation1: dynamic type error, static type warning
     lib.G<F> a3 = new lib.G<F>(); /// type_annotation_generic1: dynamic type error, static type warning
     G2<lib.C> a4 = new G2(); /// type_annotation_generic2: static type warning
     G2<lib.C> a5 = new G2<lib.C>(); /// type_annotation_generic3: static type warning
@@ -50,10 +46,6 @@
       try { throw instance; } on lib.Const {} /// catch_check: continued
     }, (e) => e is TypeError); /// catch_check: continued
     int i = lib.C.staticMethod(); /// static_method: ok
-    var c1 = const lib.Const(); /// const: compile-time error
-    f();  /// const_default_argument: continued
-    var constInstance = lib.constantInstance; /// const_instance: ok
-    var h = new H(); /// const_annotation: continued
     asyncEnd();
   });
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index 7dc0382..1e36a24 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -20,28 +20,28 @@
 duplicate_export_negative_test: Fail # Issue 6134
 mixin_forwarding_constructor2_test: Fail # Issue 13641
 
+deferred_constraints_constants_test/reference1: Fail
+deferred_constraints_constants_test/reference2: Fail
+deferred_constraints_constants_test/metadata1: Fail
+deferred_constraints_constants_test/metadata2: Fail
+deferred_constraints_constants_test/metadata3: Fail
+deferred_constraints_constants_test/default_argument1: Fail
+deferred_constraints_constants_test/default_argument2: Fail
+deferred_constraints_constants_test/constructor1: Fail
+deferred_constraints_constants_test/constructor2: Fail
+
+[ ($compiler == none || $compiler == dart2dart)]
 # The vm does not support deferred loading.
-deferred_constraints_test/const: Fail
-deferred_constraints_test/const_annotation: Fail
-deferred_constraints_test/const_default_argument: Fail
+deferred_constraints_type_annotation_test/as_operation: Fail
+deferred_constraints_type_annotation_test/is_check: Fail
+deferred_constraints_type_annotation_test/catch_check: Fail
+deferred_constraints_type_annotation_test/new_before_load: Fail
 
-[ ($compiler == none || $compiler == dart2dart) && $unchecked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-
-[ ($compiler == none || $compiler == dart2dart)  && $checked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-deferred_constraints_test/type_annotation2: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/type_annotation_generic1: Fail
-deferred_constraints_test/type_annotation_generic4: Fail
+[ ($compiler == none || $compiler == dart2dart) && $checked ]
+# The vm and dart2dart do not support deferred loading.
+deferred_constraints_type_annotation_test/type_annotation1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic4: Fail
 
 [ $compiler == none || $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # The vm and analyzer do not support deferred loading.
@@ -79,29 +79,24 @@
 type_check_const_function_typedef2_test/00: Fail, OK
 malformed2_test/01: Fail, OK
 
-[ $runtime == vm || (($runtime == drt || $runtime == dartium) && $compiler == none) ]
+[ ($compiler == none || $compiler == dart2dart) && $runtime != none ]
 dynamic_prefix_core_test/01: Fail # Issue 12478
-call_closurization_test: Fail # Issue 17473
 
-[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium|| $runtime == ContentShellOnAndroid) ]
 dynamic_prefix_core_test/none: Fail # Issue 12478
 export_ambiguous_main_negative_test: Fail # Issue 14763
 
-[ $compiler == none && $runtime == drt ]
-mixin_illegal_object_test/01: pass # Issue 10952.
-mixin_illegal_object_test/02: pass # Issue 10952.
-
 [ $compiler == dart2js && $runtime == ie9 ]
 lazy_static3_test: Fail # Issue 13469
 
 [ $compiler == none && $runtime == dartium && $unchecked ]
-named_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/03: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-assertion_test: Fail # Issue 13719: Please triage this failure.
-generic_test: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/01: Fail # Issue 17561.
+named_parameters_type_test/02: Fail # Issue 17561.
+named_parameters_type_test/03: Fail # Issue 17561.
+positional_parameters_type_test/01: Fail # Issue 17561.
+positional_parameters_type_test/02: Fail # Issue 17561.
+assertion_test: Fail # Issue 17561.
+generic_test: Fail # Issue 17561.
 list_literal1_test/01: Fail # Issue 13719: Please triage this failure.
 list_literal4_test: Fail # Issue 13719: Please triage this failure.
 map_literal1_test/01: Fail # Issue 13719: Please triage this failure.
@@ -120,4 +115,8 @@
 override_inheritance_mixed_test/09: Fail # Issue 16137
 
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
-generic_instanceof3_test: Pass, Crash # dartbug.com/17440
+generic_instanceof3_test: Pass, Crash # Issue 17440.
+
+[ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
+stack_overflow_test: Skip # Crashes. Issue 17440.
+stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index f4c89cf..720486c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -475,19 +475,25 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 86e489a..6c689a1 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -475,19 +475,25 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 3f55762..a014535 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -52,7 +52,6 @@
 default_factory2_test/01: Fail # Issue 14121
 typevariable_substitution2_test/01: CompileTimeError # Issue 15875
 typevariable_substitution2_test/02: CompileTimeError # Issue 15875
-mixin_bound_test: CompileTimeError # Issue 15875
 
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
@@ -148,9 +147,6 @@
 bit_operations_test: RuntimeError, OK # Issue 1533
 expect_test: RuntimeError, OK # Issue 13080
 
-[ ($compiler == dart2js || $compiler == dart2dart) && $checked ]
-cyclic_typedef_test/07: Crash # Issue 15237
-
 [ ($compiler == dart2js || $compiler == dart2dart) && $unchecked ]
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, OK
 
@@ -293,10 +289,12 @@
 
 [ $runtime == ie9 ]
 stack_trace_test: Fail, OK # Stack traces not available in IE9.
-deferred_constraints_test/*: Fail, Pass # http://dartbug.com/12635
-
-[ $compiler == dart2js && $host_checked ]
-const_factory_with_body_test/01: Crash
+deferred_constraints_type_annotation_test/*: Fail, Pass # http://dartbug.com/12635
+deferred_constraints_constants_test/*: Fail, Pass # http://dartbug.com/12635
 
 [ ($compiler == dart2js && $csp)]
-deferred_constraints_test/*: Skip # Issue 16898
+deferred_constraints_type_annotation_test/*: Skip # Issue 16898
+deferred_constraints_constants_test/*: Skip # Issue 16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+*deferred*: Skip # Issue 17458
diff --git a/tests/language/mixin_type_variable_test.dart b/tests/language/mixin_type_variable_test.dart
new file mode 100644
index 0000000..4d5c6c4
--- /dev/null
+++ b/tests/language/mixin_type_variable_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// Regression test for generic mixin fields in checked mode.
+
+class A<T> {
+  T field;
+}
+
+class B<T> = Object with A<T>;
+
+class C<T> extends B<T> {} /// 03: ok
+class D extends B<int> {} /// 04: ok
+
+class E = Object with A<int>;
+
+class F extends E {} /// 06: ok
+
+class G<T> extends Object with A<T> {} /// 07: ok
+class H extends Object with A<int> {} /// 08: ok
+
+void main() {
+  new A<num>(); /// 01: ok
+  new B<num>(); /// 02: ok
+  new C<num>(); /// 03: continued
+  new D(); /// 04: continued
+  new E(); /// 05: ok
+  new F(); /// 06: continued
+  new G<num>(); /// 07: continued
+  new H(); /// 08: continued
+}
\ No newline at end of file
diff --git a/tests/language/pure_function2_test.dart b/tests/language/pure_function2_test.dart
new file mode 100644
index 0000000..1fdf5f0
--- /dev/null
+++ b/tests/language/pure_function2_test.dart
@@ -0,0 +1,36 @@
+// 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";
+
+// Regression test for issue 17483.
+
+confuse(x) {
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return confuse(x);
+  return x;
+}
+
+foo(trace) {
+  trace.add("foo");
+  return "foo";
+}
+bar(trace) {
+  trace.add("bar");
+  return "bar";
+}
+
+main() {
+  var f = confuse(foo);
+  var b = confuse(bar);
+
+  var trace = [];
+  // Dart2js must keep the order of t1 and t2.
+  var t1 = f(trace);
+  var t2 = b(trace);
+  var t3 = identical(t2, "foo");
+  var t4 = trace.add(t1);
+  trace.add(t3);
+  trace.add(t3);
+  Expect.listEquals(["foo", "bar", "foo", false, false], trace);
+}
diff --git a/tests/language/pure_function_test.dart b/tests/language/pure_function_test.dart
new file mode 100644
index 0000000..4bd36be
--- /dev/null
+++ b/tests/language/pure_function_test.dart
@@ -0,0 +1,36 @@
+// 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";
+
+// Regression test for issue 17483.
+
+class A {
+  var x, y;
+  A(x, this.y) {
+    this.x = x;
+  }
+  toString() => "a";
+}
+
+foo(trace) => trace.add("foo");
+bar(trace) => trace.add("bar");
+
+main() {
+  var trace = [];
+  // Dart2js must keep the order of t1 and t2.
+  var t1 = foo(trace);
+  var t2 = bar(trace);
+  // Dart2js inlines the constructor, yielding something like:
+  //   t3 = jsNew A(null, t2);  // Note that jsNew is pure.
+  //   t3.x = t1;
+  // t3 is used twice and cannot be generated at use site.
+  // Dart2js must not allow t1 to cross the t3-line.
+  var a = new A(t1, t2);
+  // Use a. It is already implicitly used by the this.x = x line in its
+  // constructor. With the following use we use it twice and make sure that
+  // the allocation can not be generated at use-site.
+  trace.add(a.toString());
+  Expect.listEquals(["foo", "bar", "a"], trace);
+}
diff --git a/tests/language/super_bound_closure_test.dart b/tests/language/super_bound_closure_test.dart
index a85f30f..eb91f5f 100644
--- a/tests/language/super_bound_closure_test.dart
+++ b/tests/language/super_bound_closure_test.dart
@@ -6,7 +6,29 @@
 
 class A {
   bar([var optional = 1]) => 498 + optional;
-  bar2(x, { namedOptional: 2 }) => 40 + x + namedOptional;
+  bar2({ namedOptional: 2 }) => 40 + namedOptional;
+  bar3(x, [var optional = 3]) => x + 498 + optional;
+  bar4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+  // Gee is the same as bar, but we make sure that gee is used. Potentially
+  // this yields different code if the redirecting stub exists.
+  gee([var optional = 1]) => 498 + optional;
+  gee2({ namedOptional: 2 }) => 40 + namedOptional;
+  gee3(x, [var optional = 3]) => x + 498 + optional;
+  gee4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+  // Use identifiers that could be intercepted.
+  add([var optional = 33]) => 1234 + optional;
+  trim({ namedOptional: 22 }) => 1313 + namedOptional;
+  sublist(x, [optional = 44]) => 4321 + optional + x;
+  splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) =>
+      111 + x + onMatch + onNonMatch;
+
+  // Other interceptable identifiers, but all of them are used.
+  shuffle([var optional = 121]) => 12342 + optional;
+  toList({ growable: 2233 }) => 13131 + growable;
+  lastIndexOf(x, [optional = 424]) => 14321 + optional + x;
+  lastWhere(x, { orElse: 555 }) => x + 1213 + 555;
 }
 
 class B extends A {
@@ -16,11 +38,59 @@
   // `A` redirects to A's bar$1.
   foo() => confuse(super.bar)();
   foo2() => confuse(super.bar)(2);
-  foo3() => confuse(super.bar2)(0);
-  foo4() => confuse(super.bar2)(3, namedOptional: 77);
+  foo3() => confuse(super.bar2)();
+  foo4() => confuse(super.bar2)(namedOptional: 77);
+  foo5() => confuse(super.bar3)(-3);
+  foo6() => confuse(super.bar3)(-11, -19);
+  foo7() => confuse(super.bar4)(0);
+  foo8() => confuse(super.bar4)(3, namedOptional: 77);
+
+  fooGee() => confuse(super.gee)();
+  fooGee2() => confuse(super.gee)(2);
+  fooGee3() => confuse(super.gee2)();
+  fooGee4() => confuse(super.gee2)(namedOptional: 77);
+  fooGee5() => confuse(super.gee3)(-3);
+  fooGee6() => confuse(super.gee3)(-11, -19);
+  fooGee7() => confuse(super.gee4)(0);
+  fooGee8() => confuse(super.gee4)(3, namedOptional: 77);
+
+  fooIntercept() => confuse(super.add)();
+  fooIntercept2() => confuse(super.add)(2);
+  fooIntercept3() => confuse(super.trim)();
+  fooIntercept4() => confuse(super.trim)(namedOptional: 77);
+  fooIntercept5() => confuse(super.sublist)(-3);
+  fooIntercept6() => confuse(super.sublist)(-11, -19);
+  fooIntercept7() => confuse(super.splitMapJoin)(0);
+  fooIntercept8() => confuse(super.splitMapJoin)(3, onMatch: 77, onNonMatch: 8);
+
+  fooIntercept21() => confuse(super.shuffle)();
+  fooIntercept22() => confuse(super.shuffle)(2);
+  fooIntercept23() => confuse(super.toList)();
+  fooIntercept24() => confuse(super.toList)(growable: 77);
+  fooIntercept25() => confuse(super.lastIndexOf)(-3);
+  fooIntercept26() => confuse(super.lastIndexOf)(-11, -19);
+  fooIntercept27() => confuse(super.lastWhere)(0);
+  fooIntercept28() => confuse(super.lastWhere)(3, orElse: 77);
 
   bar([var optional]) => -1;
-  bar2(x, { namedOptional }) => -1;
+  bar2({ namedOptional }) => -1;
+  bar3(x, [var optional]) => -1;
+  bar4(x, { namedOptional }) => -1;
+
+  gee([var optional]) => -1;
+  gee2({ namedOptional }) => -1;
+  gee3(x, [var optional]) => -1;
+  gee4(x, { namedOptional }) => -1;
+
+  add([var optional = 33]) => -1;
+  trim({ namedOptional: 22 }) => -1;
+  sublist(x, [optional = 44]) => -1;
+  splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) => -1;
+
+  shuffle([var optional = 121]) => -1;
+  toList({ growable: 2233 }) => -1;
+  lastIndexOf(x, [optional = 424]) => -1;
+  lastWhere(x, { orElse: 555 }) => -1;
 }
 
 confuse(x) {
@@ -29,11 +99,50 @@
 }
 
 main() {
-  var list = [new A(), new B() ];
+  var list = [new A(), new B(), [], "foo" ];
   var a = list[confuse(0)];
   var b = list[confuse(1)];
+  var ignored = list[confuse(2)];
+  var ignored2 = list[confuse(3)];
+
+  var t = b.gee() + b.gee2() + b.gee3(9) + b.gee4(19);
+  Expect.equals(-4, t);
+  t = b.shuffle() + b.toList() + b.lastIndexOf(1) + b.lastWhere(2);
+  Expect.equals(-4, t);
+
   Expect.equals(499, b.foo());
   Expect.equals(500, b.foo2());
   Expect.equals(42, b.foo3());
-  Expect.equals(120, b.foo4());
+  Expect.equals(117, b.foo4());
+  Expect.equals(498, b.foo5());
+  Expect.equals(468, b.foo6());
+  Expect.equals(426, b.foo7());
+  Expect.equals(502, b.foo8());
+
+  Expect.equals(499, b.fooGee());
+  Expect.equals(500, b.fooGee2());
+  Expect.equals(42, b.fooGee3());
+  Expect.equals(117, b.fooGee4());
+  Expect.equals(498, b.fooGee5());
+  Expect.equals(468, b.fooGee6());
+  Expect.equals(426, b.fooGee7());
+  Expect.equals(502, b.fooGee8());
+
+  Expect.equals(1267, b.fooIntercept());
+  Expect.equals(1236, b.fooIntercept2());
+  Expect.equals(1335, b.fooIntercept3());
+  Expect.equals(1390, b.fooIntercept4());
+  Expect.equals(4362, b.fooIntercept5());
+  Expect.equals(4291, b.fooIntercept6());
+  Expect.equals(232, b.fooIntercept7());
+  Expect.equals(199, b.fooIntercept8());
+
+  Expect.equals(12463, b.fooIntercept21());
+  Expect.equals(12344, b.fooIntercept22());
+  Expect.equals(15364, b.fooIntercept23());
+  Expect.equals(13208, b.fooIntercept24());
+  Expect.equals(14742, b.fooIntercept25());
+  Expect.equals(14291, b.fooIntercept26());
+  Expect.equals(1768, b.fooIntercept27());
+  Expect.equals(1771, b.fooIntercept28());
 }
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 19f070b..5e5d7de 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -27,6 +27,3 @@
 lib/web_gl/dartium/web_gl_dartium: CompileTimeError # Issue 16524
 lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16524
 lib/web_sql/dartium/web_sql_dartium: CompileTimeError # Issue 16524
-lib/_internal/compiler/samples/jsonify/jsonify: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/dart2js_mirrors: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/analyze: CompileTimeError # Issue 17264
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index e8fd11f..0fe2a10 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -59,6 +59,7 @@
 mirrors/instance_members_test: RuntimeError # Issue 14633
 mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
 mirrors/invoke_test: RuntimeError # Issue 11954
+mirrors/invoke_call_on_closure_test: RuntimeError # 6490
 mirrors/invoke_call_through_getter_previously_accessed_test: RuntimeError # Issue 15138
 mirrors/invoke_call_through_getter_test: RuntimeError # Issue 15138
 mirrors/invoke_call_through_implicit_getter_previously_accessed_test: RuntimeError # Issue 15138
@@ -254,14 +255,14 @@
 
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/schedule_microtask6_test: Fail # Issue 10910
 mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
 mirrors/mirrors_reader_test: Pass, Slow # Dartium debug uses -O0
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
 mirrors/local_isolate_test: Skip # http://dartbug.com/12188
 
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/timer_test: Fail, Pass # Issue 15487
 async/multiple_timer_test: Fail, Pass # Issue 15487
 async/stream_periodic3_test: Fail, Pass # Issue 15487
@@ -282,6 +283,8 @@
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 mirrors/find_in_context_test: Fail # Issue 13719: Needs VM flag
 mirrors/find_in_context_private_test: Fail # Issue 13719: Needs VM flag
 mirrors/find_in_context_fake_function_test: Fail # Issue 13719: Needs VM flag
@@ -290,7 +293,7 @@
 # Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 async/timer_isolate_test: Fail
 
-[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm)) ]
+[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm || $runtime == ContentShellOnAndroid)) ]
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
 async/deferred/deferred_fail_to_load_test: Fail
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
@@ -312,3 +315,9 @@
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+mirrors/*deferred*: Skip # Issue 17458
+
+[ $compiler == dart2js && $mode == debug ]
+mirrors/native_class_test: Pass, Slow
diff --git a/tests/lib/mirrors/invoke_call_on_closure_test.dart b/tests/lib/mirrors/invoke_call_on_closure_test.dart
new file mode 100644
index 0000000..e023ff0
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_on_closure_test.dart
@@ -0,0 +1,68 @@
+// 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.invoke_call_on_closure;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+  call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+  noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+  get fakeFunctionCall => new FakeFunctionCall();
+  get fakeFunctionNSM => new FakeFunctionNSM();
+  get closure => (x, y) => '2 $this $x $y';
+  get closureOpt => (x, y, [z, w]) => '3 $this $x $y $z $w';
+  get closureNamed => (x, y, {z, w}) => '4 $this $x $y $z $w';
+  tearOff(x, y) => '22 $this $x $y';
+  tearOffOpt(x, y, [z, w]) => '33 $this $x $y $z $w';
+  tearOffNamed(x, y, {z, w}) => '44 $this $x $y $z $w';
+
+  noSuchMethod(msg) => 'DNU';
+
+  toString() => 'C';
+}
+
+main() {
+  var c = new C();
+  InstanceMirror im;
+
+  im = reflect(c.fakeFunctionCall);
+  Expect.equals('1 5 6',
+                im.invoke(#call, [5, 6]).reflectee);
+
+  im = reflect(c.fakeFunctionNSM);
+  Expect.equals('7, 8',
+                im.invoke(#call, [7, 8]).reflectee);
+
+  im = reflect(c.closure);
+  Expect.equals('2 C 9 10',
+                im.invoke(#call, [9, 10]).reflectee);
+
+  im = reflect(c.closureOpt);
+  Expect.equals('3 C 11 12 13 null',
+                im.invoke(#call, [11, 12, 13]).reflectee);
+
+  im = reflect(c.closureNamed);
+  Expect.equals('4 C 14 15 null 16',
+                im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+
+  im = reflect(c.tearOff);
+  Expect.equals('22 C 9 10',
+                im.invoke(#call, [9, 10]).reflectee);
+
+  im = reflect(c.tearOffOpt);
+  Expect.equals('33 C 11 12 13 null',
+                im.invoke(#call, [11, 12, 13]).reflectee);
+
+  im = reflect(c.tearOffNamed);
+  Expect.equals('44 C 14 15 null 16',
+                im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+}
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 7417d56..edaa64a 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -325,6 +325,12 @@
   contentType = ContentType.parse(
       "  text/html  ;  charset  =  utf-8  ;  xxx=yyy  ");
   check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
+
+  // Test builtin content types.
+  check(ContentType.TEXT, "text", "plain", {"charset": "utf-8"});
+  check(ContentType.HTML, "text", "html", {"charset": "utf-8"});
+  check(ContentType.JSON, "application", "json", {"charset": "utf-8"});
+  check(ContentType.BINARY, "application", "octet-stream");
 }
 
 void testContentTypeCache() {
@@ -436,6 +442,9 @@
   Expect.throws(() => new _Cookie.fromSetCookieValue("xxx"));
   Expect.throws(() => new _Cookie.fromSetCookieValue(
       "xxx=yyy; expires=12 jan 2013"));
+  Expect.throws(() => new _Cookie.fromSetCookieValue("x x = y y"));
+  Expect.throws(() => new _Cookie("[4", "y"));
+  Expect.throws(() => new _Cookie("4", "y\""));
 
   _HttpHeaders headers = new _HttpHeaders("1.1");
   headers.set('Cookie',
diff --git a/tests/standalone/io/https_server_test.dart b/tests/standalone/io/https_server_test.dart
index 559a4d1..cdba064 100644
--- a/tests/standalone/io/https_server_test.dart
+++ b/tests/standalone/io/https_server_test.dart
@@ -2,20 +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.
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+const CERTIFICATE = "localhost_cert";
 
 void testListenOn() {
   void test(void onDone()) {
-    HttpServer.bindSecure(HOST_NAME,
+    HttpServer.bindSecure(HOST,
                           0,
                           backlog: 5,
-                          certificateName: 'localhost_cert').then((server) {
+                          certificateName: CERTIFICATE).then((server) {
       ReceivePort serverPort = new ReceivePort();
       server.listen((HttpRequest request) {
         request.listen(
@@ -28,7 +29,7 @@
 
       HttpClient client = new HttpClient();
       ReceivePort clientPort = new ReceivePort();
-      client.getUrl(Uri.parse("https://$HOST_NAME:${server.port}/"))
+      client.getUrl(Uri.parse("https://${HOST.host}:${server.port}/"))
         .then((HttpClientRequest request) {
           return request.close();
         })
@@ -64,7 +65,7 @@
 }
 
 void testEarlyClientClose() {
-  HttpServer.bindSecure(HOST_NAME,
+  HttpServer.bindSecure(HOST,
                         0,
                         certificateName: 'localhost_cert').then((server) {
     server.listen(
@@ -76,7 +77,7 @@
 
     var count = 0;
     makeRequest() {
-      Socket.connect(HOST_NAME, server.port).then((socket) {
+      Socket.connect(HOST, server.port).then((socket) {
         var data = "Invalid TLS handshake";
         socket.write(data);
         socket.close();
@@ -96,6 +97,9 @@
 
 void main() {
   InitializeSSL();
-  testListenOn();
-  testEarlyClientClose();
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    testListenOn();
+    testEarlyClientClose();
+  });
 }
diff --git a/tests/standalone/io/process_set_exit_code_script.dart b/tests/standalone/io/process_set_exit_code_script.dart
index 9a34f05..38a8075 100644
--- a/tests/standalone/io/process_set_exit_code_script.dart
+++ b/tests/standalone/io/process_set_exit_code_script.dart
@@ -5,7 +5,13 @@
 import "dart:io";
 
 main() {
+  if (exitCode != 0) {
+    throw "Bad initial exit-code";
+  }
   stdout.write("standard out");
   stderr.write("standard error");
   exitCode = 25;
+  if (exitCode != 25) {
+    throw "Exit-code not set correctly";
+  }
 }
diff --git a/tests/standalone/io/raw_secure_server_closing_test.dart b/tests/standalone/io/raw_secure_server_closing_test.dart
index c38ab58..16fffe3 100644
--- a/tests/standalone/io/raw_secure_server_closing_test.dart
+++ b/tests/standalone/io/raw_secure_server_closing_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
       .then((_) {
         asyncEnd();
       });
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen((event) {
         if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
@@ -40,7 +39,7 @@
     onDone: () {
       serverDone.complete(null);
     });
-    RawSecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+    RawSecureSocket.connect(HOST, server.port).then((clientConnection) {
       clientConnection.listen((event){
         if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
           clientConnection.shutdown(SocketDirection.SEND);
@@ -56,8 +55,8 @@
 
 void testCloseBothEnds() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.close();
@@ -76,7 +75,7 @@
 
   asyncStart();
 
-  RawSecureServerSocket.bind(HOST_NAME,
+  RawSecureServerSocket.bind(HOST,
                              0,
                              CERTIFICATE,
                              backlog: 2 * socketCount).then((server) {
@@ -97,7 +96,7 @@
     subscription.pause();
     var connectCount = 0;
     for (int i = 0; i < socketCount; i++) {
-      RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      RawSecureSocket.connect(HOST, server.port).then((connection) {
         connection.shutdown(SocketDirection.SEND);
       });
     }
@@ -105,7 +104,7 @@
       subscription.resume();
       resumed = true;
       for (int i = 0; i < socketCount; i++) {
-        RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+        RawSecureSocket.connect(HOST, server.port).then((connection) {
           connection.shutdown(SocketDirection.SEND);
         });
       }
@@ -118,7 +117,7 @@
   asyncStart();
   List ends = [];
 
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
     void checkDone() {
       if (ends.length < 2 * socketCount) return;
@@ -135,7 +134,7 @@
     });
 
     for (int i = 0; i < socketCount; i++) {
-      RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      RawSecureSocket.connect(HOST, server.port).then((connection) {
         ends.add(connection);
         checkDone();
       });
@@ -145,11 +144,19 @@
 
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
 
+runTests() {
   testCloseOneEnd("client");
   testCloseOneEnd("server");
   testCloseBothEnds();
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index 49c04fb..6c90ed9 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -12,14 +12,13 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testSimpleBind() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
@@ -49,8 +48,8 @@
 
   // Bind to a port already in use.
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
-    RawSecureServerSocket.bind(HOST_NAME,
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+    RawSecureServerSocket.bind(HOST,
                                s.port,
                                CERTIFICATE).then((t) {
       s.close();
@@ -67,8 +66,8 @@
 
 void testSimpleConnect(String certificate) {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+  RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.shutdown(SocketDirection.SEND);
@@ -82,8 +81,8 @@
 
 void testSimpleConnectFail(String certificate, bool cancelOnError) {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port)
+  RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port)
       .then((clientEnd) {
         Expect.fail("No client connection expected.");
       })
@@ -107,9 +106,9 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     new Timer(const Duration(milliseconds: 500), () {
       server.listen((serverEnd) {
         clientEndFuture.then((clientEnd) {
@@ -423,13 +422,13 @@
 
   Future<RawSecureSocket> connectClient(int port) {
     if (connectSecure) {
-      return RawSecureSocket.connect(HOST_NAME, port);
+      return RawSecureSocket.connect(HOST, port);
     } else if (!handshakeBeforeSecure) {
-      return RawSocket.connect(HOST_NAME, port).then((socket) {
+      return RawSocket.connect(HOST, port).then((socket) {
         return RawSecureSocket.secure(socket);
       });
     } else {
-      return RawSocket.connect(HOST_NAME, port).then((socket) {
+      return RawSocket.connect(HOST, port).then((socket) {
         return runClientHandshake(socket).then((subscription) {
             return RawSecureSocket.secure(socket, subscription: subscription);
         });
@@ -466,9 +465,9 @@
 
   if (listenSecure) {
     RawSecureServerSocket.bind(
-        HOST_NAME, 0, CERTIFICATE).then(serverReady);
+        HOST, 0, CERTIFICATE).then(serverReady);
   } else {
-    RawServerSocket.bind(HOST_NAME, 0).then(serverReady);
+    RawServerSocket.bind(HOST, 0).then(serverReady);
   }
 }
 
@@ -477,7 +476,7 @@
 
   asyncStart();
   var clientComplete = new Completer();
-  RawServerSocket.bind(HOST_NAME, 0).then((server) {
+  RawServerSocket.bind(HOST, 0).then((server) {
     server.listen((client) {
       var subscription;
       subscription = client.listen((_) {
@@ -506,7 +505,7 @@
       });
     });
 
-    RawSocket.connect(HOST_NAME, server.port).then((socket) {
+    RawSocket.connect(HOST, server.port).then((socket) {
       var subscription;
       subscription = socket.listen((_) {
         if (pausedClient) {
@@ -534,10 +533,19 @@
 }
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
+
+runTests() {
   testSimpleBind();
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
diff --git a/tests/standalone/io/secure_client_raw_server_test.dart b/tests/standalone/io/secure_client_raw_server_test.dart
index 9d40baf..e380f75 100644
--- a/tests/standalone/io/secure_client_raw_server_test.dart
+++ b/tests/standalone/io/secure_client_raw_server_test.dart
@@ -7,16 +7,16 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<RawSecureServerSocket> startEchoServer() {
-  return RawSecureServerSocket.bind(HOST_NAME,
+  return RawSecureServerSocket.bind(HOST,
                                     0,
                                     CERTIFICATE).then((server) {
     server.listen((RawSecureSocket client) {
@@ -60,7 +60,7 @@
 Future testClient(server) {
   Completer success = new Completer();
   List<String> chunks = <String>[];
-  SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello server.");
     socket.close();
     socket.listen(
@@ -78,13 +78,13 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startEchoServer()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+      .then((_) => startEchoServer())
       .then(testClient)
-      .then((server) {
-        server.close();
-      });
+      .then((server) => server.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_client_server_test.dart b/tests/standalone/io/secure_client_server_test.dart
index cc41db9..3c41266 100644
--- a/tests/standalone/io/secure_client_server_test.dart
+++ b/tests/standalone/io/secure_client_server_test.dart
@@ -7,16 +7,16 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<SecureServerSocket> startEchoServer() {
-  return SecureServerSocket.bind(HOST_NAME,
+  return SecureServerSocket.bind(HOST,
                                  0,
                                  CERTIFICATE).then((server) {
     server.listen((SecureSocket client) {
@@ -31,7 +31,7 @@
 }
 
 Future testClient(server) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  return SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello server.");
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -43,13 +43,13 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startEchoServer()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first )
+      .then((_) => startEchoServer())
       .then(testClient)
-      .then((server) {
-        server.close();
-      });
+      .then((server) => server.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_multiple_client_server_test.dart b/tests/standalone/io/secure_multiple_client_server_test.dart
index c6cfcf3..2eeeed2 100644
--- a/tests/standalone/io/secure_multiple_client_server_test.dart
+++ b/tests/standalone/io/secure_multiple_client_server_test.dart
@@ -7,19 +7,20 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+SecureServerSocket SERVER;
 const CERTIFICATE = "localhost_cert";
-Future<SecureServerSocket> startServer() {
-  return SecureServerSocket.bind(HOST_NAME,
-                                 0,
-                                 CERTIFICATE).then((server) {
-    server.listen((SecureSocket client) {
+
+Future startServer() {
+  return SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    SERVER = server;
+    SERVER.listen((SecureSocket client) {
       client.fold(<int>[], (message, data) => message..addAll(data))
           .then((message) {
             String received = new String.fromCharCodes(message);
@@ -29,30 +30,29 @@
             client.close();
           });
     });
-    return server;
   });
 }
 
-Future testClient(server, name) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+Future testClient(name) {
+  return SecureSocket.connect(HOST, SERVER.port).then((socket) {
     socket.add("Hello from client $name".codeUnits);
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
         .then((message) {
           Expect.listEquals("Welcome, client $name".codeUnits, message);
-          return server;
         });
   });
 }
 
 void main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startServer()
-      .then((server) => Future.wait(
-          ['able', 'baker', 'charlie', 'dozen', 'elapse']
-          .map((name) => testClient(server, name))))
-      .then((servers) => servers.first.close());
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+      .then((_) => startServer())
+      .then((_) => ['ale', 'bar', 'che', 'den', 'els'].map(testClient))
+      .then((futures) => Future.wait(futures))
+      .then((_) => SERVER.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index a0bcb41..34de17d 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_test.dart
@@ -7,18 +7,17 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 Future testClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requestClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port,
                                                sendClientCertificate: true);
     server.listen((serverEnd) {
@@ -43,11 +42,11 @@
 
 Future testRequiredClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requireClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port,
                                                sendClientCertificate: true);
     server.listen((serverEnd) {
@@ -77,7 +76,8 @@
                           useBuiltinRoots: false);
 
   asyncStart();
-  testClientCertificate()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+    .then((_) => testClientCertificate())
     .then((_) => testRequiredClientCertificate())
     .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_client_no_certificate_test.dart b/tests/standalone/io/secure_server_client_no_certificate_test.dart
index 3ffeb22..888f988 100644
--- a/tests/standalone/io/secure_server_client_no_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_no_certificate_test.dart
@@ -7,18 +7,17 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 Future testNoClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requestClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port);
     server.listen((serverEnd) {
       X509Certificate certificate = serverEnd.peerCertificate;
@@ -37,11 +36,11 @@
 Future testNoRequiredClientCertificate() {
   var completer = new Completer();
   bool clientError = false;
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requireClientCertificate: true).then((server) {
-    Future clientDone = SecureSocket.connect(HOST_NAME, server.port)
+    Future clientDone = SecureSocket.connect(HOST, server.port)
       .catchError((e) { clientError = true; });
     server.listen((serverEnd) {
       Expect.fail("Got a unverifiable connection");
@@ -64,7 +63,8 @@
                           useBuiltinRoots: false);
 
   asyncStart();
-  testNoRequiredClientCertificate()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+    .then((_) => testNoRequiredClientCertificate())
     .then((_) => testNoClientCertificate())
     .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_closing_test.dart b/tests/standalone/io/secure_server_closing_test.dart
index ffe2ea7..a45877b 100644
--- a/tests/standalone/io/secure_server_closing_test.dart
+++ b/tests/standalone/io/secure_server_closing_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
       .then((_) {
         asyncEnd();
       });
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen(
         (data) {
@@ -44,7 +43,7 @@
     onDone: () {
       serverDone.complete(null);
     });
-    SecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+    SecureSocket.connect(HOST, server.port).then((clientConnection) {
       clientConnection.listen(
         (data) {
           Expect.fail("No data should be received by client");
@@ -62,8 +61,8 @@
 
 void testCloseBothEnds() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.destroy();
@@ -82,7 +81,7 @@
 
   asyncStart();
 
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           backlog: 2 * socketCount).then((server) {
@@ -103,7 +102,7 @@
     subscription.pause();
     var connectCount = 0;
     for (int i = 0; i < socketCount; i++) {
-      SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      SecureSocket.connect(HOST, server.port).then((connection) {
         connection.close();
       });
     }
@@ -111,7 +110,7 @@
       subscription.resume();
       resumed = true;
       for (int i = 0; i < socketCount; i++) {
-        SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+        SecureSocket.connect(HOST, server.port).then((connection) {
           connection.close();
         });
       }
@@ -126,7 +125,7 @@
   asyncStart();
   List ends = [];
 
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
     void checkDone() {
       if (ends.length < 2 * socketCount) return;
@@ -143,7 +142,7 @@
     });
 
     for (int i = 0; i < socketCount; i++) {
-      SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      SecureSocket.connect(HOST, server.port).then((connection) {
         ends.add(connection);
         checkDone();
       });
@@ -153,11 +152,19 @@
 
 
 main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
 
+runTests() {
   testCloseOneEnd("client");
   testCloseOneEnd("server");
   testCloseBothEnds();
diff --git a/tests/standalone/io/secure_server_socket_test.dart b/tests/standalone/io/secure_server_socket_test.dart
index f8a4559..a6a1087 100644
--- a/tests/standalone/io/secure_server_socket_test.dart
+++ b/tests/standalone/io/secure_server_socket_test.dart
@@ -12,14 +12,13 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testSimpleBind() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
@@ -49,8 +48,8 @@
 
   // Bind to a port already in use.
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
-    SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+    SecureServerSocket.bind(HOST,
                             s.port,
                             CERTIFICATE).then((t) {
       Expect.fail("Multiple listens on same port");
@@ -64,8 +63,8 @@
 
 void testSimpleConnect(String certificate) {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+  SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.close();
@@ -79,8 +78,8 @@
 
 void testSimpleConnectFail(String certificate, bool cancelOnError) {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port)
+  SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port)
       .then((clientEnd) {
         Expect.fail("No client connection expected.");
       })
@@ -104,9 +103,9 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     new Timer(const Duration(milliseconds: 500), () {
       server.listen((serverEnd) {
         clientEndFuture.then((clientEnd) {
@@ -145,7 +144,7 @@
     }
   }
 
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((client) {
       int bytesRead = 0;
       int bytesWritten = 0;
@@ -167,7 +166,7 @@
         });
     });
 
-    SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+    SecureSocket.connect(HOST, server.port).then((socket) {
       int bytesRead = 0;
       int bytesWritten = 0;
       List<int> dataSent = createTestData();
@@ -194,6 +193,14 @@
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
+
+runTests() {
   testSimpleBind();
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
@@ -204,5 +211,4 @@
   testSimpleConnectFail("CN=notARealDistinguishedName", true);
   testServerListenAfterConnect();
   testSimpleReadWrite();
-  asyncEnd();
 }
diff --git a/tests/standalone/io/secure_session_resume_test.dart b/tests/standalone/io/secure_session_resume_test.dart
index 83acd3e..5b8a3a3 100644
--- a/tests/standalone/io/secure_session_resume_test.dart
+++ b/tests/standalone/io/secure_session_resume_test.dart
@@ -16,16 +16,17 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<SecureServerSocket> startServer() {
-  return SecureServerSocket.bind(HOST_NAME,
+  return SecureServerSocket.bind(HOST,
                                  0,
                                  CERTIFICATE).then((server) {
     server.listen((SecureSocket client) {
@@ -43,7 +44,7 @@
 }
 
 Future testClient(server, name) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  return SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello from client $name");
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -55,14 +56,20 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests().then((_) => asyncEnd());
+  });
+}
 
+Future runTests() {
   Duration delay = const Duration(milliseconds: 0);
   Duration delay_between_connections = const Duration(milliseconds: 300);
-
-  startServer()
+  return startServer()
       .then((server) => Future.wait(
           ['able', 'baker', 'charlie', 'dozen', 'elapse']
           .map((name) {
diff --git a/tests/standalone/io/secure_socket_bad_data_test.dart b/tests/standalone/io/secure_socket_bad_data_test.dart
index bff3f46..f0c3fa5 100644
--- a/tests/standalone/io/secure_socket_bad_data_test.dart
+++ b/tests/standalone/io/secure_socket_bad_data_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 // This test sends corrupt data in the middle of a secure network connection.
@@ -133,15 +132,15 @@
 
 
 Future<List> connectClient(int port, bool hostnameInConnect) =>
-  RawSocket.connect(HOST_NAME, port)
+  RawSocket.connect(HOST, port)
   .then((socket) =>
     (hostnameInConnect ? RawSecureSocket.secure(socket)
-                       : RawSecureSocket.secure(socket, host: HOST_NAME))
+                       : RawSecureSocket.secure(socket, host: HOST))
     .then((secureSocket) => [socket, secureSocket]));
 
 
 Future test(bool hostnameInConnect) {
-  return RawServerSocket.bind(HOST_NAME, 0).then((server) {
+  return RawServerSocket.bind(HOST, 0).then((server) {
     server.listen((client) {
       RawSecureSocket.secureServer(client, CERTIFICATE)
         .then((secureClient) {
@@ -164,6 +163,8 @@
                           password: 'dartdart',
                           useBuiltinRoots: false);
   asyncStart();
-  Future.wait([test(false), test(true)])
-      .then((_) => asyncEnd());
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    return Future.wait([test(false), test(true)]);
+  }).then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/socket_upgrade_to_secure_test.dart b/tests/standalone/io/socket_upgrade_to_secure_test.dart
index ff0f727..d973a78 100644
--- a/tests/standalone/io/socket_upgrade_to_secure_test.dart
+++ b/tests/standalone/io/socket_upgrade_to_secure_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 // This test creates a server and a client connects. After connecting
@@ -154,12 +153,12 @@
 
   Future<SecureSocket> connectClient(int port) {
     if (!handshakeBeforeSecure) {
-      return Socket.connect(HOST_NAME, port).then((socket) {
+      return Socket.connect(HOST, port).then((socket) {
         var future;
         if (hostnameInConnect) {
           future = SecureSocket.secure(socket);
         } else {
-          future = SecureSocket.secure(socket, host: HOST_NAME);
+          future = SecureSocket.secure(socket, host: HOST);
         }
         return future.then((secureSocket) {
           socket.add([0]);
@@ -167,13 +166,13 @@
         });
       });
     } else {
-      return Socket.connect(HOST_NAME, port).then((socket) {
+      return Socket.connect(HOST, port).then((socket) {
         return runClientHandshake(socket).then((_) {
             var future;
             if (hostnameInConnect) {
               future = SecureSocket.secure(socket);
             } else {
-              future = SecureSocket.secure(socket, host: HOST_NAME);
+              future = SecureSocket.secure(socket, host: HOST.host);
             }
             return future.then((secureSocket) {
               socket.add([0]);
@@ -209,18 +208,23 @@
     });
   }
 
-  ServerSocket.bind(HOST_NAME, 0).then(serverReady);
+  ServerSocket.bind(HOST, 0).then(serverReady);
 }
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
-  test(false, false);
-  test(true, false);
-  test(false, true);
-  test(true, true);
-  test(false, true, true);
-  test(true, true, true);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    test(false, false);
+    test(true, false);
+    test(false, true);
+    test(true, true);
+    test(false, true, true);
+    test(true, true, true);
+    asyncEnd();
+  });
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index f5d3421..488828d 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -33,7 +33,7 @@
 # of allowed open files ('ulimit -n' says something like 256).
 io/socket_many_connections_test: Skip
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 typed_array_test: Fail # Issue 13921
 typed_array_int64_uint64_test: Fail # Issue 13921
 typed_data_isolate_test: Skip # This test uses dart:io
@@ -47,7 +47,7 @@
 
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-javascript_int_overflow_literal_test/01: fail, ok
+javascript_int_overflow_literal_test/01: Fail, OK
 issue14236_test: Skip # Analyzer can't handle Script snapshots.
 
 # test issue https://code.google.com/p/dart/issues/detail?id=11518
@@ -104,9 +104,6 @@
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
 
-[ $arch == arm ]
-vmservice/isolate_echo_test: Fail # Issue 17431
-
 [ $arch == simmips || $arch == mips ]
 io/web_socket_test: Pass, Slow
 io/http_server_response_test: Pass, Slow
@@ -116,11 +113,16 @@
 [ $arch == mips ]
 io/signals_test: Fail # dartbug.com/17440
 io/file_stat_test: Fail # dartbug.com/17440
+io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
+io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
 
-[ $compiler == none && $runtime == dartium && $unchecked ]
+[ $arch == mips && $mode == debug ]
+io/file_read_special_device_test: Fail # dartbug.com/17440
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
 assert_test: Fail # Issue 13719: Please triage this failure.
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 javascript_int_overflow_literal_test/01: Fail # Issue 13719: Please triage this failure.
 javascript_int_overflow_test: Fail # Issue 13719: Please triage this failure.
 
diff --git a/tests/standalone/vmservice/isolate_code_test.dart b/tests/standalone/vmservice/isolate_code_test.dart
index ec8da52..34d07ae 100644
--- a/tests/standalone/vmservice/isolate_code_test.dart
+++ b/tests/standalone/vmservice/isolate_code_test.dart
@@ -25,7 +25,7 @@
 
   onRequestCompleted(Map reply) {
     Expect.equals('Code', reply['type']);
-    Expect.equals('C.c', reply['function']['user_name']);
+    Expect.equals('c', reply['function']['user_name']);
     Expect.isTrue(reply['disassembly'].length > 0);
   }
 }
diff --git a/tests/standalone/vmservice/isolate_function_test.dart b/tests/standalone/vmservice/isolate_function_test.dart
index 3e6d045..c0493eb 100644
--- a/tests/standalone/vmservice/isolate_function_test.dart
+++ b/tests/standalone/vmservice/isolate_function_test.dart
@@ -13,7 +13,7 @@
       super('http://127.0.0.1:$port/$id/$functionId');
   onRequestCompleted(Map reply) {
     Expect.equals('Function', reply['type']);
-    Expect.equals('C.c', reply['user_name']);
+    Expect.equals('c', reply['user_name']);
     Expect.equals(false, reply['is_static']);
   }
 }
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 23e361b..5630a6f 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -8,13 +8,13 @@
 
 [ $compiler == none && $runtime == drt ]
 dummy_compiler_test: Skip # http://dartbug.com/7233
-dart2js_test: Skip # Uses dart:io.
 
 [ $compiler == dart2js && $browser ]
 *: Skip
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && $runtime != vm ]
 dart2js_test: Skip # Uses dart:io.
 
-[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-source_mirrors_test: StaticWarning # Issue 17264
\ No newline at end of file
+
+[ $compiler == dart2js && $mode == debug ]
+source_mirrors_test: Slow, Pass
diff --git a/tools/VERSION b/tools/VERSION
index 9491f2d..9a5c8e94 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 3
 PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 1
+PRERELEASE 5
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index bf99227..1959043 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -185,16 +185,19 @@
   return name, True
 
 
-def Clobber():
+def Clobber(force=None):
   """
   Clobbers the builder before we do the build, if appropriate.
 
   - mode: either 'debug' or 'release'
   """
-  if os.environ.get(BUILDER_CLOBBER) != "1":
+  if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
     return
+  clobber_string = 'Clobber'
+  if force:
+    clobber_string = 'Clobber(always)'
 
-  with BuildStep('Clobber'):
+  with BuildStep(clobber_string):
     cmd = [sys.executable,
            './tools/clean_output_directory.py']
     print 'Clobbering %s' % (' '.join(cmd))
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index ab49a1c..cf51d1a 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -7,6 +7,7 @@
 import hashlib
 import imp
 import os
+import string
 import subprocess
 import sys
 
@@ -312,3 +313,11 @@
     f.write('%s *%s' % (checksum, mangled_filename))
 
   return checksum_filename
+
+def GetChannelFromName(name):
+  """Get the channel from the name. Bleeding edge builders don't 
+      have a suffix."""
+  channel_name = string.split(name, '-').pop()
+  if channel_name in Channel.ALL_CHANNELS:
+    return channel_name
+  return Channel.BLEEDING_EDGE
diff --git a/tools/bots/src-tarball.py b/tools/bots/src-tarball.py
index 1c32034..24e86f0 100644
--- a/tools/bots/src-tarball.py
+++ b/tools/bots/src-tarball.py
@@ -11,11 +11,16 @@
 Archive tarball and debian package to google cloud storage.
 """
 
+import os
 import re
 import sys
 
 import bot
+import bot_utils
 
+utils = bot_utils.GetUtils()
+
+HOST_OS = utils.GuessOS()
 SRC_BUILDER = r'src-tarball-linux'
 
 def SrcConfig(name, is_buildbot):
@@ -32,12 +37,26 @@
   return bot.BuildInfo('none', 'none', 'release', 'linux')
 
 def SrcSteps(build_info):
+  # We always clobber the bot, to not leave old tarballs and packages
+  # floating around the out dir.
+  bot.Clobber(force=True)
   with bot.BuildStep('Create src tarball'):
-    args = [sys.executable, './tools/create_tarball.py']
+    version = utils.GetVersion()
+    builddir = os.path.join(bot_utils.DART_DIR,
+                            utils.GetBuildDir(HOST_OS, HOST_OS),
+                            'src_and_installation')
+    if not os.path.exists(builddir):
+      os.makedirs(builddir)
+    tarfilename = 'dart-%s.tar.gz' % version
+    tarfile = os.path.join(builddir, tarfilename)
+    args = [sys.executable, './tools/create_tarball.py', '--tar_filename',
+            tarfile]
     print 'Building src tarball'
     bot.RunProcess(args)
     print 'Building Debian packages'
-    args = [sys.executable, './tools/create_debian_packages.py']
+    args = [sys.executable, './tools/create_debian_packages.py',
+            '--tar_filename', tarfile,
+            '--out_dir', builddir]
     bot.RunProcess(args)
 
 if __name__ == '__main__':
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index b76c2e3..4f31dfb 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -9,6 +9,7 @@
 # will build a source package and a 32-bit (i386) and 64-bit (amd64)
 # binary packages.
 
+import optparse
 import sys
 import tarfile
 import subprocess
@@ -21,6 +22,17 @@
 HOST_CPUS = utils.GuessCpus()
 DART_DIR = abspath(join(__file__, '..', '..'))
 
+def BuildOptions():
+  result = optparse.OptionParser()
+  result.add_option("--tar_filename",
+                    default=None,
+                    help="The tar file to build from.")
+  result.add_option("--out_dir",
+                    default=None,
+                    help="Where to put the packages.")
+ 
+  return result
+
 def RunBuildPackage(opt, cwd):
   cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
   cmd.extend(opt)
@@ -32,14 +44,12 @@
     raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
                     (' '.join(cmd), stderr, stdout))
 
-def BuildDebianPackage():
+def BuildDebianPackage(tarball, out_dir):
   version = utils.GetVersion()
-  builddir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
   tarroot = 'dart-%s' % version
-  tarname = 'dart-%s.tar.gz' % version
   origtarname = 'dart_%s.orig.tar.gz' % version
-  tarball = join(builddir, tarname)
-  if not exists(join(builddir, tarball)):
+
+  if not exists(join(out_dir, tarball)):
     print 'Source tarball not found'
     return -1
 
@@ -76,18 +86,25 @@
       '%s-1_amd64.deb' % debbase
     ]
     for name in source_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
     for name in i386_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
     for name in amd64_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
 
 def Main():
   if HOST_OS != 'linux':
     print 'Debian build only supported on linux'
     return -1
 
-  BuildDebianPackage()
+  options, args = BuildOptions().parse_args()
+  out_dir = options.out_dir
+  tar_filename = options.tar_filename
+  if not options.out_dir:
+    out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
+  if not options.tar_filename:
+    raise Exception('Please specify the input filename.')
+  BuildDebianPackage(options.tar_filename, options.out_dir)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 015d0dd..62b9194 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -230,10 +230,14 @@
   for jarFile in jarFiles:
     copyfile(jarFile, join(DARTANALYZER_DEST, os.path.basename(jarFile)))
 
+  RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'asset')
+  os.makedirs(os.path.dirname(RESOURCE))
+  copytree(join(HOME, 'sdk', 'lib', '_internal', 'pub', 'asset'),
+           join(RESOURCE),
+           ignore=ignore_patterns('.svn'))
+
   # Copy in 7zip for Windows.
   if HOST_OS == 'win32':
-    RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'resource')
-    os.makedirs(RESOURCE)
     copytree(join(HOME, 'third_party', '7zip'),
              join(RESOURCE, '7zip'),
              ignore=ignore_patterns('.svn'))
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index e71ebf1..58679e0 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -32,7 +32,6 @@
 
 HOST_OS = utils.GuessOS()
 DART_DIR = abspath(join(__file__, '..', '..'))
-
 # Flags.
 verbose = False
 
@@ -52,6 +51,10 @@
   result.add_option("-v", "--verbose",
       help='Verbose output.',
       default=False, action="store_true")
+  result.add_option("--tar_filename",
+                    default=None,
+                    help="The output file.")
+
   return result
 
 def Filter(tar_info):
@@ -103,23 +106,18 @@
     f.write(svn_revision)
 
 
-def CreateTarball():
+def CreateTarball(tarfilename):
   global ignoredPaths  # Used for adding the output directory.
   # Generate the name of the tarfile
   version = utils.GetVersion()
   global versiondir
   versiondir = 'dart-%s' % version
-  tarname = '%s.tar.gz' % versiondir
   debian_dir = 'tools/linux_dist_support/debian'
-  # Create the tar file in the build directory.
-  builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
-  tardir = join(DART_DIR, builddir)
   # Don't include the build directory in the tarball (ignored paths
   # are relative to DART_DIR).
+  builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
   ignoredPaths.append(builddir)
-  if not exists(tardir):
-    makedirs(tardir)
-  tarfilename = join(tardir, tarname)
+
   print 'Creating tarball: %s' % tarfilename
   with tarfile.open(tarfilename, mode='w:gz') as tar:
     for f in listdir(DART_DIR):
@@ -157,7 +155,10 @@
     global verbose
     verbose = True
 
-  CreateTarball()
+  if not options.tar_filename:
+    raise Exception('Please specify an output filename')
+
+  CreateTarball(options.tar_filename)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 69e9804..c3e351b 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -75,6 +75,12 @@
     },
     "support_level": "experimental"
   },
+  "Animation": {
+    "members": {
+      "Animation": {}
+    },
+    "support_level": "untriaged"
+  },
   "ApplicationCache": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
     "dart_action": "unstable",
@@ -1009,6 +1015,12 @@
   "CompositionEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-CompositionEvent",
     "members": {
+      "activeSegmentEnd": {
+        "support_level": "untriaged"
+      },
+      "activeSegmentStart": {
+        "support_level": "untriaged"
+      },
       "data": {},
       "initCompositionEvent": {}
     },
@@ -1072,6 +1084,9 @@
   },
   "ConsoleBase": {
     "members": {
+      "assert": {
+        "support_level": "untriaged"
+      },
       "assertCondition": {
         "support_level": "untriaged"
       },
@@ -1580,6 +1595,14 @@
     },
     "support_level": "experimental"
   },
+  "DeprecatedStorageInfo": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "DeprecatedStorageQuota": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "DeviceAcceleration": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
@@ -1594,6 +1617,9 @@
     "members": {
       "acceleration": {},
       "accelerationIncludingGravity": {},
+      "initDeviceMotionEvent": {
+        "support_level": "untriaged"
+      },
       "interval": {},
       "rotationRate": {}
     },
@@ -1657,6 +1683,9 @@
     "comment": "http://dom.spec.whatwg.org/#interface-document",
     "members": {
       "URL": {},
+      "activeElement": {
+        "support_level": "untriaged"
+      },
       "adoptNode": {},
       "anchors": {
         "dart_action": "suppress"
@@ -1896,6 +1925,9 @@
       },
       "onreadystatechange": {},
       "onreset": {},
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {},
       "onsearch": {
         "comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -1977,6 +2009,9 @@
       "querySelectorAll": {},
       "readyState": {},
       "referrer": {},
+      "rootElement": {
+        "support_level": "untriaged"
+      },
       "securityPolicy": {
         "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy",
         "support_level": "experimental"
@@ -1985,6 +2020,9 @@
         "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-selectedStyleSheetSet"
       },
       "styleSheets": {},
+      "timeline": {
+        "support_level": "untriaged"
+      },
       "title": {},
       "visibilityState": {
         "support_level": "untriaged"
@@ -2274,6 +2312,9 @@
       "localName": {
         "support_level": "untriaged"
       },
+      "matches": {
+        "support_level": "untriaged"
+      },
       "namespaceURI": {
         "support_level": "untriaged"
       },
@@ -2370,6 +2411,9 @@
         "support_level": "untriaged"
       },
       "onreset": {},
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {},
       "onsearch": {
         "comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -3092,27 +3136,49 @@
   },
   "FontFaceSet": {
     "members": {
+      "add": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {
         "support_level": "untriaged"
       },
       "check": {
         "support_level": "untriaged"
       },
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "delete": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "forEach": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
       "match": {
         "support_level": "untriaged"
       },
       "removeEventListener": {
         "support_level": "untriaged"
       },
+      "size": {
+        "support_level": "untriaged"
+      },
       "status": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "FontFaceSetForEachCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "FontLoader": {
     "comment": "http://www.w3.org/TR/css3-fonts/#document-fontloader",
     "members": {
@@ -3314,6 +3380,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -3936,6 +4005,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -4479,6 +4551,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "crossOrigin": {
+        "support_level": "untriaged"
+      },
       "disabled": {},
       "href": {},
       "hreflang": {},
@@ -4668,6 +4743,9 @@
       "readyState": {},
       "seekable": {},
       "seeking": {},
+      "setMediaKeys": {
+        "support_level": "untriaged"
+      },
       "src": {},
       "startTime": {
         "support_level": "nonstandard"
@@ -5022,6 +5100,9 @@
     "members": {
       "HTMLSelectElement": {},
       "__setter__": {},
+      "add": {
+        "support_level": "untriaged"
+      },
       "autofocus": {},
       "checkValidity": {},
       "disabled": {},
@@ -5036,6 +5117,9 @@
       "name": {},
       "namedItem": {},
       "options": {},
+      "remove": {
+        "support_level": "untriaged"
+      },
       "required": {},
       "selectedIndex": {},
       "selectedOptions": {},
@@ -5752,6 +5836,14 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ImageBitmapFactories": {
+    "members": {
+      "createImageBitmap": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ImageData": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
     "members": {
@@ -5792,6 +5884,25 @@
     },
     "support_level": "experimental"
   },
+  "InstallEvent": {
+    "members": {
+      "reloadAll": {
+        "support_level": "untriaged"
+      },
+      "replace": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "InstallPhaseEvent": {
+    "members": {
+      "waitUntil": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Int16Array": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
     "members": {
@@ -6111,6 +6222,9 @@
   "MediaKeyNeededEvent": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent",
     "members": {
+      "contentType": {
+        "support_level": "untriaged"
+      },
       "initData": {}
     },
     "support_level": "experimental"
@@ -6135,6 +6249,9 @@
       "onwebkitkeyadded": {},
       "onwebkitkeyerror": {},
       "onwebkitkeymessage": {},
+      "release": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {},
       "sessionId": {},
       "update": {}
@@ -6510,6 +6627,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
       },
+      "isProtocolHandlerRegistered": {
+        "support_level": "untriaged"
+      },
       "javaEnabled": {
         "dart_action": "suppress",
         "support_level": "nonstandard"
@@ -6551,6 +6671,15 @@
       "requestMIDIAccess": {
         "support_level": "untriaged"
       },
+      "serviceWorker": {
+        "support_level": "untriaged"
+      },
+      "storageQuota": {
+        "support_level": "untriaged"
+      },
+      "unregisterProtocolHandler": {
+        "support_level": "untriaged"
+      },
       "userAgent": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
@@ -7264,6 +7393,47 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "Player": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "finished": {
+        "support_level": "untriaged"
+      },
+      "pause": {
+        "support_level": "untriaged"
+      },
+      "paused": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      },
+      "reverse": {
+        "support_level": "untriaged"
+      },
+      "source": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      },
+      "timeLag": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Plugin": {
     "members": {
       "__getter__": {},
@@ -8313,6 +8483,10 @@
     },
     "support_level": "stable"
   },
+  "SVGDiscardElement": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "SVGDocument": {
     "comment": "http://www.w3.org/TR/SVG/struct.html#InterfaceSVGDocument",
     "dart_action": "unstable",
@@ -8459,6 +8633,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -11086,6 +11263,9 @@
   "Screen": {
     "comment": "http://dev.w3.org/csswg/cssom-view/#the-screen-interface",
     "members": {
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
       "availHeight": {},
       "availLeft": {
         "dart_action": "experimental",
@@ -11097,8 +11277,23 @@
       },
       "availWidth": {},
       "colorDepth": {},
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "height": {},
+      "lockOrientation": {
+        "support_level": "untriaged"
+      },
+      "orientation": {
+        "support_level": "untriaged"
+      },
       "pixelDepth": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "unlockOrientation": {
+        "support_level": "untriaged"
+      },
       "width": {}
     },
     "support_level": "stable"
@@ -11211,6 +11406,17 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ServiceWorkerContainer": {
+    "members": {
+      "register": {
+        "support_level": "untriaged"
+      },
+      "unregister": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ServiceWorkerGlobalScope": {
     "members": {},
     "support_level": "untriaged"
@@ -11245,7 +11451,22 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface",
     "members": {
       "SharedWorker": {},
-      "port": {}
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "port": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "workerStart": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -11304,6 +11525,9 @@
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "mode": {
+        "support_level": "untriaged"
+      },
       "remove": {
         "support_level": "untriaged"
       },
@@ -11577,15 +11801,30 @@
       "PERSISTENT": {},
       "TEMPORARY": {},
       "queryUsageAndQuota": {},
-      "requestQuota": {}
+      "quota": {
+        "support_level": "untriaged"
+      },
+      "requestQuota": {},
+      "usage": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
   "StorageQuota": {
     "comment": "http://www.w3.org/TR/quota-api/#idl-def-StorageQuota",
     "members": {
+      "queryInfo": {
+        "support_level": "untriaged"
+      },
       "queryUsageAndQuota": {},
-      "requestQuota": {}
+      "requestPersistentQuota": {
+        "support_level": "untriaged"
+      },
+      "requestQuota": {},
+      "supportedTypes": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -11696,6 +11935,30 @@
     },
     "support_level": "stable"
   },
+  "TextDecoder": {
+    "members": {
+      "TextDecoder": {},
+      "decode": {
+        "support_level": "untriaged"
+      },
+      "encoding": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "TextEncoder": {
+    "members": {
+      "TextEncoder": {},
+      "encode": {
+        "support_level": "untriaged"
+      },
+      "encoding": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TextEvent": {
     "comment": "http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413/events.html#Events-TextEvent",
     "dart_action": "unstable",
@@ -11831,6 +12094,43 @@
     },
     "support_level": "stable"
   },
+  "TimedItem": {
+    "members": {
+      "activeDuration": {
+        "support_level": "untriaged"
+      },
+      "currentIteration": {
+        "support_level": "untriaged"
+      },
+      "duration": {
+        "support_level": "untriaged"
+      },
+      "endTime": {
+        "support_level": "untriaged"
+      },
+      "localTime": {
+        "support_level": "untriaged"
+      },
+      "player": {
+        "support_level": "untriaged"
+      },
+      "specified": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Timeline": {
+    "members": {
+      "play": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TimeoutHandler": {
     "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-timers.html#timeouthandler",
     "members": {
@@ -11838,6 +12138,38 @@
     },
     "support_level": "stable"
   },
+  "Timing": {
+    "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
+      "delay": {
+        "support_level": "untriaged"
+      },
+      "direction": {
+        "support_level": "untriaged"
+      },
+      "easing": {
+        "support_level": "untriaged"
+      },
+      "endDelay": {
+        "support_level": "untriaged"
+      },
+      "fill": {
+        "support_level": "untriaged"
+      },
+      "iterationStart": {
+        "support_level": "untriaged"
+      },
+      "iterations": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Touch": {
     "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
     "members": {
@@ -13436,6 +13768,9 @@
         "support_level": "deprecated"
       },
       "opener": {},
+      "orientation": {
+        "support_level": "untriaged"
+      },
       "outerHeight": {},
       "outerWidth": {},
       "pagePopupController": {
@@ -13743,6 +14078,9 @@
       "console": {
         "support_level": "untriaged"
       },
+      "createImageBitmap": {
+        "support_level": "untriaged"
+      },
       "crypto": {
         "support_level": "untriaged"
       },
@@ -13875,6 +14213,10 @@
     },
     "support_level": "untriaged"
   },
+  "XMLDocument": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "XMLHttpRequest": {
     "comment": "http://xhr.spec.whatwg.org/#interface-xmlhttprequest",
     "members": {
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index da571a3..eee4c0c 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -280,7 +280,7 @@
 interface SQLResultSetRowList {
   // Change the return type to Dictionary so that rows are exposed in the Dart
   // API as a Maps, with the appropriate conversion in JavaScript.
-  [Suppressed] any item(unsigned long index);
+  [Suppressed] object item(unsigned long index);
   [Custom] Dictionary item(unsigned long index);
 };
 
@@ -359,4 +359,13 @@
 [Supplemental]
 interface Window : EventTarget {};
 
+[Suppressed]
+interface Promise {};
+
+[Suppressed]
+interface InstallEvent {};
+
+[Suppressed]
+interface InstallPhaseEvent {};
+
 Element implements GlobalEventHandlers;
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 58d77b4..f8f98fa 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -70,6 +70,17 @@
   'XMLHttpRequest.open',
   ])
 
+def ReturnValueConversionHack(idl_type, value, interface_name):
+  if idl_type == 'SVGMatrix':
+    return '%sTearOff::create(%s)' % (idl_type, value)
+  elif ((idl_type == 'SVGAngle' and interface_name != 'SVGAnimatedAngle')
+      or (idl_type == 'SVGTransform' and interface_name == 'SVGSVGElement')):
+    # Somewhere in the IDL it probably specifies whether we need to call
+    # create or not.
+    return 'SVGPropertyTearOff<%s>::create(%s)' % (idl_type, value)
+
+  return value
+
 #
 # Renames for attributes that have names that are not legal Dart names.
 #
@@ -662,21 +673,25 @@
   def vector_to_dart_template_parameter(self):
     return self.native_type()
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     cls = self.bindings_class()
 
     if 'Callback' in idl_node.ext_attrs:
       return '%s.release()', 'OwnPtr<%s>' % self.native_type(), cls, 'create'
 
-    if self.custom_to_native():
+    # This is a hack to handle property references correctly.
+    if (self.native_type() in ['SVGPropertyTearOff<SVGAngle>',
+          'SVGPropertyTearOff<SVGAngle>*', 'SVGMatrixTearOff']
+        and (callback_name != 'createSVGTransformFromMatrixCallback'
+          or interface_name != 'SVGTransformList')):
+      argument_expression_template = '%s->propertyReference()'
+      type = '%s*' % self.native_type()
+    elif self.custom_to_native():
       type = 'RefPtr<%s>' % self.native_type()
       argument_expression_template = '%s.get()'
     else:
       type = '%s*' % self.native_type()
-      if isinstance(self, SVGTearOffIDLTypeInfo) and not interface_name.endswith('List'):
-        argument_expression_template = '%s->propertyReference()'
-      else:
-        argument_expression_template = '%s'
+      argument_expression_template = '%s'
     return argument_expression_template, type, cls, 'toNative'
 
   def pass_native_by_ref(self): return False
@@ -729,7 +744,7 @@
                                 interface_name=None, attributes=None):
     auto_dart_scope='true' if auto_dart_scope_setup else 'false'
     return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
-                                                   value,
+                                                   ReturnValueConversionHack(self._idl_type, value, interface_name),
                                                    auto_dart_scope)
 
   def custom_to_dart(self):
@@ -838,7 +853,7 @@
   def vector_to_dart_template_parameter(self):
     raise Exception('sequences of sequences are not supported yet')
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     item_native_type = self._item_info.vector_to_dart_template_parameter()
     if isinstance(self._item_info, PrimitiveIDLTypeInfo):
       return '%s', 'Vector<%s>' % item_native_type, 'DartUtilities', 'toNativeVector<%s>' % item_native_type
@@ -873,7 +888,7 @@
   def __init__(self, data, item_info):
     super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', data, item_info)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s', 'RefPtr<DOMStringList>', 'DartDOMStringList', 'toNative'
 
   def pass_native_by_ref(self): return False
@@ -892,7 +907,7 @@
     if self.idl_type() == 'float': return 'float'
     return self.native_type()
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     type = self.native_type()
     if type == 'SerializedScriptValue':
       type = 'RefPtr<%s>' % type
@@ -956,24 +971,18 @@
     return '%s<%s>' % (tear_off_type, self._idl_type)
 
   def receiver(self):
-    if self._idl_type.endswith('List'):
-      return 'receiver->'
-    return 'receiver->propertyReference().'
+    return 'receiver->'
 
   def to_conversion_cast(self, value, interface_name, attributes):
-    svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix',
+    svg_primitive_types = ['SVGLength', 'SVGMatrix',
         'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
-    conversion_cast = '%s::create(%s)'
-    if interface_name.startswith('SVGAnimated'):
-      conversion_cast = 'static_cast<%s*>(%s)'
-    elif self.idl_type() == 'SVGStringList':
-      conversion_cast = '%s::create(receiver, %s)'
-    elif interface_name.endswith('List'):
-      conversion_cast = 'static_cast<%s*>(%s.get())'
-    elif self.idl_type() in svg_primitive_types:
-      conversion_cast = '%s::create(%s)'
-    else:
-      conversion_cast = 'static_cast<%s*>(%s)'
+
+    # This is a hack. We either need to figure out the right way to derive this
+    # information from the IDL or remove this generator.
+    if self.idl_type() != 'SVGTransformList':
+      return value
+
+    conversion_cast = 'static_cast<%s*>(%s)'
     conversion_cast = conversion_cast % (self.native_type(), value)
     return '%s' % (conversion_cast)
 
@@ -985,14 +994,13 @@
     auto_dart_scope='true' if auto_dart_scope_setup else 'false'
     return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
                                                    self.to_conversion_cast(
-                                                       value,
+                                                       ReturnValueConversionHack(self._idl_type, value, interface_name),
                                                        interface_name,
                                                        attr),
                                                    auto_dart_scope)
 
   def argument_expression(self, name, interface_name):
-    return name if interface_name.endswith('List') else '%s->propertyReference()' % name
-
+    return name
 
 class TypedListIDLTypeInfo(InterfaceIDLTypeInfo):
   def __init__(self, idl_type, data, interface_name, type_registry):
@@ -1012,7 +1020,7 @@
         interface_name,
         attributes)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
@@ -1036,7 +1044,7 @@
         interface_name,
         attributes)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
@@ -1176,32 +1184,27 @@
     'ArrayBufferView': TypeData(clazz='BasicTypedList'),
     'ArrayBuffer': TypeData(clazz='BasicTypedList'),
 
-    'SVGAngle': TypeData(clazz='SVGTearOff'),
-    'SVGLength': TypeData(clazz='SVGTearOff'),
-    'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'),
-    'SVGMatrix': TypeData(clazz='SVGTearOff'),
-    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGNumber>'),
-    'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'),
+    'SVGAngle': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGAngle>'),
+    'SVGLength': TypeData(clazz='SVGTearOff', native_type='SVGLengthTearOff'),
+    'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength', native_type='SVGLengthListTearOff'),
+    'SVGMatrix': TypeData(clazz='SVGTearOff', native_type='SVGMatrixTearOff'),
+    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGNumberTearOff'),
+    'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber', native_type='SVGNumberListTearOff'),
     'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg',
         native_type='SVGPathSegListPropertyTearOff'),
-    'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<FloatPoint>'),
-    'SVGPointList': TypeData(clazz='SVGTearOff'),
-    'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff'),
-    'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGRect>'),
+    'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPointTearOff'),
+    'SVGPointList': TypeData(clazz='SVGTearOff', native_type='SVGPointListTearOff'),
+    'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff', native_type='SVGPreserveAspectRatioTearOff'),
+    'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGRectTearOff'),
     'SVGStringList': TypeData(clazz='SVGTearOff', item_type='DOMString',
-        native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
-    'SVGTransform': TypeData(clazz='SVGTearOff'),
+        native_type='SVGStringListTearOff'),
+    'SVGTransform': TypeData(clazz='SVGTearOff', native_type="SVGPropertyTearOff<SVGTransform>"),
     'SVGTransformList': TypeData(clazz='SVGTearOff', item_type='SVGTransform',
         native_type='SVGTransformListPropertyTearOff'),
 })
 
 _svg_supplemental_includes = [
-    '"SVGAnimatedPropertyTearOff.h"',
-    '"SVGAnimatedListPropertyTearOff.h"',
-    '"SVGStaticListPropertyTearOff.h"',
-    '"SVGAnimatedListPropertyTearOff.h"',
-    '"SVGTransformListPropertyTearOff.h"',
-    '"SVGPathSegListPropertyTearOff.h"',
+    '"core/svg/properties/SVGPropertyTraits.h"',
 ]
 
 class TypeRegistry(object):
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index b450d61..64876ce 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -76,6 +76,8 @@
   'DOMFileSystemSync', # Workers
   'DatabaseSync', # Workers
   'DataView', # Typed arrays
+  'DeprecatedStorageQuota',
+  'DeprecatedStorageInfo',
   'DirectoryEntrySync', # Workers
   'DirectoryReaderSync', # Workers
   'DocumentType',
@@ -99,6 +101,7 @@
   'RGBColor',
   'RadioNodeList',  # Folded onto NodeList in dart2js.
   'Rect',
+  'ServiceWorker',
   'SQLTransactionSync', # Workers
   'SQLTransactionSyncCallback', # Workers
   'SVGAltGlyphDefElement', # Webkit only.
@@ -122,7 +125,6 @@
   'SVGMissingGlyphElement',
   'SVGTRefElement',
   'SVGVKernElement',
-  'SharedWorker', # Workers
   'SubtleCrypto',
   'WebKitCSSFilterValue',
   'WebKitCSSMatrix',
@@ -358,7 +360,6 @@
     'Window.webkitNotifications': 'notifications',
     'Window.webkitRequestFileSystem': '_requestFileSystem',
     'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
-    'Element.webkitMatchesSelector' : 'matches',
     'Navigator.webkitGetUserMedia': '_getUserMedia',
     'Node.appendChild': 'append',
     'Node.cloneNode': 'clone',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 9957b35..8684071 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -7,6 +7,12 @@
 import sys
 
 
+_operation_suffix_map = {
+  '__getter__': "Getter",
+  '__setter__': "Setter",
+  '__delete__': "Deleter",
+}
+
 class IDLNode(object):
   """Base class for all IDL elements.
   IDLNode may contain various child nodes, and have properties. Examples
@@ -493,6 +499,11 @@
       else:
         raise Exception('Cannot handle %s: operation has no id' % ast)
 
+      if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'):
+        arg = self.arguments[0]
+        operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed'
+        self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_category, _operation_suffix_map[self.id]))
+
   def _extra_repr(self):
     return [self.arguments]
 
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index d0fa567..852d8db 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -350,7 +350,7 @@
       return [Id, MAYBE(OR(['=', ExtAttrValue], ExtAttrArgList))]
 
     def ExtAttrValue():
-      return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'))
+      return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'), re.compile(r'"[^"]+"\|"[^"]+"'), re.compile(r'"[^"]+"'))
 
     def ExtAttrFunctionValue():
       return [Id, ExtAttrArgList]
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 84d22fe..7521169 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -61,7 +61,7 @@
     'Element.insertAdjacentText',
     'Element.remove',
     'Element.shadowRoot',
-    'Element.webkitMatchesSelector',
+    'Element.matches',
     'ElementEvents.mouseWheel',
     'ElementEvents.transitionEnd',
     'FileReader.result',
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 3ddefdb..128882e 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -76,10 +76,56 @@
   ('WorkerGlobalScope', 'btoa'): 'DOMWindowBase64',
   ('WorkerGlobalScope', 'clearTimeout'): 'DOMWindowTimers',
   ('WorkerGlobalScope', 'clearInterval'): 'DOMWindowTimers',
-  }
+  ('Document', 'rootElement'): 'SVGDocument',
+  ('Document', 'childElementCount'): 'ParentNode',
+  ('Document', 'firstElementChild'): 'ParentNode',
+  ('Document', 'lastElementChild'): 'ParentNode',
+  ('DocumentFragment', 'childElementCount'): 'ParentNode',
+  ('DocumentFragment', 'firstElementChild'): 'ParentNode',
+  ('DocumentFragment', 'lastElementChild'): 'ParentNode',
+  ('CharacterData', 'nextElementSibling'): 'ChildNode',
+  ('CharacterData', 'previousElementSibling'): 'ChildNode',
+  ('Element', 'childElementCount'): 'ParentNode',
+  ('Element', 'firstElementChild'): 'ParentNode',
+  ('Element', 'lastElementChild'): 'ParentNode',
+  ('Element', 'nextElementSibling'): 'ChildNode',
+  ('Element', 'previousElementSibling'): 'ChildNode',
+  ('SVGAnimationElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGAnimationElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGAnimationElement', 'systemLanguage'): 'SVGTests',
+  ('SVGAnimationElement', 'hasExtension'): 'SVGTests',
+  ('SVGGraphicsElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGGraphicsElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGGraphicsElement', 'systemLanguage'): 'SVGTests',
+  ('SVGGraphicsElement', 'hasExtension'): 'SVGTests',
+  ('SVGPatternElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGPatternElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGPatternElement', 'systemLanguage'): 'SVGTests',
+  ('SVGPatternElement', 'hasExtension'): 'SVGTests',
+  ('SVGUseElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGUseElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGUseElement', 'systemLanguage'): 'SVGTests',
+  ('SVGUseElement', 'hasExtension'): 'SVGTests',
+  ('SVGMaskElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGMaskElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGMaskElement', 'systemLanguage'): 'SVGTests',
+  ('SVGMaskElement', 'hasExtension'): 'SVGTests',
+  ('SVGViewSpec', 'zoomAndPan'): 'SVGZoomAndPan',
+  ('SVGViewSpec', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('SVGViewElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('SVGSVGElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('Screen', 'orientation'): 'ScreenOrientation',
+  ('Screen', 'lockOrientation'): 'ScreenOrientation',
+  ('Screen', 'unlockOrientation'): 'ScreenOrientation',
+  ('Navigator', 'serviceWorker'): 'NavigatorServiceWorker',
+  ('Navigator', 'storageQuota'): 'NavigatorStorageQuota',
+  ('Navigator', 'isProtocolHandlerRegistered'): 'NavigatorContentUtils',
+  ('SharedWorker', 'workerStart'): 'SharedWorkerPerformance',
+}
 
 _cpp_import_map = {
-  'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories'
+  'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories',
+  'ScreenOrientation' : 'modules/screen_orientation/ScreenOrientation'
 }
 
 _cpp_overloaded_callback_map = {
@@ -318,8 +364,15 @@
     self._interface_type_info = self._TypeInfo(self._interface.id)
     self._members_emitter = members_emitter
     self._cpp_declarations_emitter = emitter.Emitter()
+
     self._cpp_impl_includes = set(['"' + partial + '.h"'
                                    for partial in _GetCPPPartialNames(self._interface)])
+
+    # This is a hack to work around a strange C++ compile error that we weren't
+    # able to track down the true cause of.
+    if self._interface.id == 'Timing':
+      self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
+
     self._cpp_definitions_emitter = emitter.Emitter()
     self._cpp_resolver_emitter = emitter.Emitter()
 
@@ -549,10 +602,17 @@
     def TypeCheckHelper(test):
       return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false'
 
+    v8_interface_include = ''
+    # V8AbstractWorker.h does not exist so we have to hard code this case.
+    if self._interface.id != 'AbstractWorker':
+      # FIXME: We need this to access the WrapperTypeInfo.
+      v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
+
     self._cpp_header_emitter.Emit(
         self._template_loader.Load('cpp_header.template'),
         INTERFACE=self._interface.id,
         WEBCORE_INCLUDES=webcore_includes,
+        V8_INTERFACE_INCLUDE=v8_interface_include,
         WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
         WEBCORE_CLASS_NAME_ESCAPED=
         self._interface_type_info.native_type().replace('<', '_').replace('>', '_'),
@@ -833,6 +893,7 @@
 
   def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name, auto_scope_setup=True):
     webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.id)
+
     function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation, cpp_callback_name)
     self._GenerateNativeCallback(
         cpp_callback_name,
@@ -859,6 +920,7 @@
       generate_custom_element_scope_if_needed=False):
 
     ext_attrs = node.ext_attrs
+
     if self._IsStatic(node.id):
       needs_receiver = True
 
@@ -892,6 +954,14 @@
     requires_script_execution_context = (ext_attrs.get('CallWith') == 'ExecutionContext' or
                                          ext_attrs.get('ConstructorCallWith') == 'ExecutionContext')
 
+    # Hack because our parser misses that these IDL members require an execution
+    # context.
+
+    if (self._interface.id == 'FontFace'
+        and callback_name in ['familySetter', 'featureSettingsSetter', 'stretchSetter',
+                              'styleSetter', 'unicodeRangeSetter', 'variantSetter', 'weightSetter']):
+      requires_script_execution_context = True
+
     requires_document = ext_attrs.get('ConstructorCallWith') == 'Document'
 
     if requires_script_execution_context:
@@ -996,6 +1066,7 @@
 
     if requires_dom_window or requires_document:
       self._cpp_impl_includes.add('"DOMWindow.h"')
+
       body_emitter.Emit(
           '        DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsolate();\n'
           '        if (!domWindow) {\n'
@@ -1045,7 +1116,7 @@
       type_info = self._TypeInfo(argument.type.id)
       self._cpp_impl_includes |= set(type_info.conversion_includes())
       argument_expression_template, type, cls, function = \
-          type_info.to_native_info(argument, self._interface.id)
+          type_info.to_native_info(argument, self._interface.id, callback_name)
 
       def AllowsNull():
         # TODO(vsm): HTMLSelectElement's indexed setter treats a null as a remove.
@@ -1116,19 +1187,32 @@
         '        }\n')
 
 
+    interface_name = self._interface_type_info.native_type()
+
     if needs_receiver:
-      interface_name = self._interface_type_info.native_type()
       # Hack to determine if this came from the _cpp_callback_map.
       # In this case, the getter is mapped to a static method.
-      if (not function_expression.startswith('receiver->') and
+      if function_expression.startswith('SVGTests::'):
+          cpp_arguments.insert(0, 'receiver')
+      elif (not function_expression.startswith('receiver->') and
           not function_expression.startswith(interface_name + '::')):
-        if interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']:
+        if (interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']
+            or (interface_name in ['SVGViewSpec', 'SVGViewElement', 'SVGSVGElement']
+              and callback_name in ['setZoomAndPan', 'zoomAndPanSetter', 'zoomAndPan'])
+            or (interface_name == 'Screen'
+              and callback_name in ['_lockOrientation_1Callback', '_lockOrientation_2Callback', 'unlockOrientation', 'orientation'])):
           cpp_arguments.insert(0, 'receiver')
         else:
           cpp_arguments.append('receiver')
       elif self._IsStatic(node.id):
         cpp_arguments.insert(0, 'receiver')
 
+    if interface_name in ['SVGPropertyTearOff<SVGTransform>', 'SVGPropertyTearOff<SVGAngle>', 'SVGMatrixTearOff'] and function_expression.startswith('receiver->'):
+      # This is a horrible hack. I don't know why this one case has to be
+      # special cased.
+      if not (self._interface.id == 'SVGTransformList' and callback_name == 'createSVGTransformFromMatrixCallback'):
+        function_expression = 'receiver->propertyReference().%s' % (function_expression[len('receiver->'):])
+
     function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments))
     if return_type == 'void':
       invocation_emitter.Emit(
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index af81731..f71ebae 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -146,8 +146,7 @@
    * that does not expect REPL support.
    */
   static const _CONSOLE_API_SUPPORT_HEADER =
-      'with ((console && console._commandLineAPI) || {}) {\n';
-
+      'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
   static bool expectsConsoleApi(String expression) {
     return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
   }
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index 3f6c4cd..4372f85 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -6,9 +6,9 @@
 
 $(ANNOTATIONS)$(CLASS_MODIFIERS)class Console {
 
-  Console._safe() {}
+  const Console._safe();
 
-  static Console _safeConsole = new Console._safe();
+  static const Console _safeConsole = const Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
@@ -34,7 +34,7 @@
 
   @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.debug(#)', arg) : null;
+      JS('void', 'console.dir(#)', arg) : null;
 
   @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/tools/dom/templates/html/dartium/cpp_header.template b/tools/dom/templates/html/dartium/cpp_header.template
index 1f8ae1b..e957de6 100644
--- a/tools/dom/templates/html/dartium/cpp_header.template
+++ b/tools/dom/templates/html/dartium/cpp_header.template
@@ -9,8 +9,10 @@
 
 #include "bindings/dart/DartDOMWrapper.h"
 $WEBCORE_INCLUDES
+
 // FIXME: We need this to access the WrapperTypeInfo.
-#include "V8$(INTERFACE).h"
+$V8_INTERFACE_INCLUDE
+
 #include <dart_api.h>
 
 namespace WebCore {
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 4d676c0..a1e6c4d 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -387,7 +387,7 @@
 }
 
 // Helper class for displaying directory listings.
-class _Entry {
+class _Entry implements Comparable {
   final String name;
   final String displayName;
 
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index 59aa15f..49af512 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -85,10 +85,6 @@
             '--exclude-lib=async_helper',
             '--exclude-lib=expect',
             '--exclude-lib=docgen',
-            '--exclude-lib=canonicalization.a',
-            '--exclude-lib=canonicalization.b',
-            '--exclude-lib=canonicalization.c',
-            '--exclude-lib=canonicalization.d',
             '../../pkg',          
           ],
           'message': 'Running docgen: <(_action)',